{ "components": { "responses": {}, "schemas": { "BenchmarkListResponse": { "description": "Response schema for a list of enterprise benchmark data", "example": { "data": [ { "big_tech_average_score": null, "domain_identifier": "8b65714c-ba23-41bc-97bc-0305fdff53f5", "enterprise_average_score": 166, "enterprise_percentile_75_score": 182 } ] }, "properties": { "data": { "description": "List of enterprise benchmark data", "items": { "$ref": "#/components/schemas/BenchmarkResponse" }, "type": "array" } }, "required": [ "data" ], "title": "BenchmarkListResponse", "type": "object" }, "DomainResponse": { "description": "Response schema for a capability", "example": { "assessment_url": "domain/8b65714c-ba23-41bc-97bc-0305fdff53e5", "created_at": "2024-01-01T01:01:01Z", "description": "In this sample domain, we will learn about...", "identifier": "8b65714c-ba23-41bc-97bc-0305fdff53e5", "industry": "Cosmetics", "is_shared": false, "is_signature_domain": true, "languages": [ "en_US", "ger_DE" ], "objectives": "Objectives of the domain...", "sources": [ { "id": "01945a0c-1234-7000-8000-000000000001", "label": null, "type": "baseline" }, { "id": "01945a0c-5678-7000-8000-000000000002", "label": "Q1 2025", "type": "reassessment" } ], "status": "LIVE", "title": "A sample domain", "updated_at": "2024-02-01T01:01:01Z" }, "properties": { "assessment_url": { "description": "The target_url used for deeplinking to the assessment. Auto-enrolls the user into the capability", "type": "string" }, "created_at": { "description": "The timestamp when the domain was created", "format": "date-time", "type": "string" }, "description": { "description": "Capability description. Returned with HTML entities decoded.", "type": "string" }, "identifier": { "description": "Unique capability identifier", "type": "string" }, "industry": { "description": "The industry the domain was developed for", "type": "string" }, "is_shared": { "description": "Indicates whether the capability is shared with the requesting company by another company", "type": "boolean" }, "is_signature_domain": { "description": "Identifies Workera Signature Capabilities", "type": "boolean" }, "languages": { "description": "List of languages this capability is translated to", "items": { "description": "Language locale", "type": "string" }, "type": "array" }, "objectives": { "description": "Capability objectives", "nullable": true, "type": "string" }, "sources": { "description": "List of assessment sources available for this domain", "items": { "properties": { "id": { "description": "The domain template identifier", "format": "uuid", "type": "string" }, "label": { "description": "Optional label for the assessment source", "nullable": true, "type": "string" }, "type": { "description": "The type of assessment source", "enum": [ "baseline", "reassessment" ], "type": "string" } }, "required": [ "type", "id" ], "type": "object" }, "type": "array" }, "status": { "description": "The status of the domain", "enum": [ "LIVE", "ARCHIVED" ], "type": "string" }, "title": { "description": "Capability title. Returned with HTML entities decoded.", "type": "string" }, "updated_at": { "description": "The timestamp when the domain was last updated", "format": "date-time", "type": "string" } }, "required": [ "identifier", "title", "is_signature_domain", "is_shared", "languages", "assessment_url", "created_at", "updated_at", "status", "sources" ], "title": "DomainResponse", "type": "object" }, "AmbientActivityResponse": { "additionalProperties": false, "description": "The effective non-regressing scan activity timestamp", "example": { "last_scan_at": "2026-07-22T12:00:00Z", "success": true }, "properties": { "last_scan_at": { "format": "date-time", "type": "string" }, "success": { "enum": [ true ], "type": "boolean" } }, "required": [ "success", "last_scan_at" ], "title": "AmbientActivityResponse", "type": "object" }, "CoachingJournalResponse": { "description": "The day's coaching-journal entry — private memory for a future coach. The client stamps the date and owns on-device storage.", "example": { "journal": { "behavioral_signals": [ "Defaults to writing a decision doc before raising a debate — repeated across the rollout thread and last week's schema discussion." ], "open_loops": [ "The rollout date depends on the platform team's freeze calendar; still unowned, and it blocks the customer commitment made on Tuesday." ], "today_in_context": "Shifted from building the migration to negotiating its rollout — the day's decisions were about sequencing with the platform team, not code." } }, "properties": { "journal": { "properties": { "behavioral_signals": { "description": "Durable observations with brief supporting evidence (may be empty)", "items": { "type": "string" }, "type": "array" }, "open_loops": { "description": "Unresolved threads that may shape future coaching (may be empty)", "items": { "type": "string" }, "type": "array" }, "today_in_context": { "description": "The day's most important coaching-relevant development", "type": "string" } }, "required": [ "today_in_context", "behavioral_signals", "open_loops" ], "type": "object" } }, "title": "CoachingJournalResponse", "type": "object" }, "AmbientSkillPicksResponse": { "description": "The consumer's selected skill-area slugs", "example": { "selected_skill_area_slugs": [ "communication", "leadership" ] }, "properties": { "selected_skill_area_slugs": { "description": "Active enrollment-derived skill-area slugs", "items": { "type": "string" }, "type": "array" } }, "required": [ "selected_skill_area_slugs" ], "title": "AmbientSkillPicksResponse", "type": "object" }, "AmbientCoachingCardEventResponse": { "additionalProperties": false, "description": "Acknowledges a metadata-only coaching-card interaction", "example": { "success": true }, "properties": { "success": { "enum": [ true ], "type": "boolean" } }, "required": [ "success" ], "title": "AmbientCoachingCardEventResponse", "type": "object" }, "AmbientRefreshResponse": { "description": "A rotated per-device token pair", "example": { "access_token": "amb_at_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "expires_in": 3600, "refresh_token": "amb_rt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "token_type": "Bearer" }, "properties": { "access_token": { "description": "Short-lived `amb_at_` access token", "type": "string" }, "expires_in": { "description": "Access-token lifetime in seconds", "type": "integer" }, "refresh_token": { "description": "Single-use `amb_rt_` refresh token replacing the presented one", "type": "string" }, "token_type": { "description": "Always \"Bearer\"", "type": "string" } }, "title": "AmbientRefreshResponse", "type": "object" }, "AmbientMissionsResponse": { "description": "One page of challenges assigned to the authenticated Ambient account", "properties": { "data": { "items": { "properties": { "completed_at": { "format": "date-time", "nullable": true, "type": "string" }, "created_at": { "format": "date-time", "type": "string" }, "deadline": { "format": "date-time", "nullable": true, "type": "string" }, "id": { "format": "uuid", "type": "string" }, "status": { "enum": [ "open", "completed", "expired" ], "type": "string" }, "title": { "type": "string" } }, "required": [ "id", "title", "status", "deadline", "created_at", "completed_at" ], "type": "object" }, "type": "array" }, "has_more": { "type": "boolean" }, "next_page": { "nullable": true, "type": "string" } }, "required": [ "data", "has_more", "next_page" ], "title": "AmbientMissionsResponse", "type": "object" }, "DidYouKnowResponse": { "description": "One web_search-grounded fact tied to the user's work", "example": { "fact": "Teams that run a five-minute silent brainstorm before discussing produce roughly twice as many usable ideas as free-for-all meetings.", "source": "Nemeth, UC Berkeley" }, "properties": { "fact": { "description": "The fact — a sentence or two, conversational, no advice attached", "type": "string" }, "source": { "description": "The real source the fact was confirmed against (a named study, publication, or org)", "type": "string" } }, "title": "DidYouKnowResponse", "type": "object" }, "MeResponse": { "description": "The authenticated Ambient identity and status", "example": { "account_type": "consumer", "email": "learner@example.com", "first_name": null, "id": "0197fb2e-1111-7aaa-bbbb-cccccccccccc", "last_name": null, "min_supported_version": null }, "properties": { "account_type": { "description": "The persisted Ambient account type", "enum": [ "consumer", "enterprise" ], "type": "string" }, "email": { "description": "Email associated with the token", "type": "string" }, "first_name": { "description": "The account's first name, or null until profile completion", "nullable": true, "type": "string" }, "id": { "description": "Account id; null only for tokens issued outside the sign-in flow", "nullable": true, "type": "string" }, "last_name": { "description": "The account's last name, or null when unset", "nullable": true, "type": "string" }, "min_supported_version": { "description": "Minimum supported desktop version — unset for now", "nullable": true, "type": "string" } }, "required": [ "id", "email", "account_type", "first_name", "last_name", "min_supported_version" ], "title": "MeResponse", "type": "object" }, "BenchmarkResponse": { "description": "Response schema for a benchmark item", "example": { "big_tech_average_score": null, "domain_identifier": "8b65714c-ba23-41bc-97bc-0305fdff53f5", "enterprise_average_score": 166, "enterprise_percentile_75_score": 182 }, "properties": { "big_tech_average_score": { "description": "Average score of learners on that capability in big tech companies", "nullable": true, "type": "integer" }, "domain_identifier": { "description": "Unique capability identifier", "type": "string" }, "enterprise_average_score": { "description": "Average score of learners on that capability in all enterprise companies", "nullable": true, "type": "integer" }, "enterprise_percentile_75_score": { "description": "75th percentile score of learners on that capability in all enterprise companies", "nullable": true, "type": "integer" } }, "required": [ "domain_identifier" ], "title": "BenchmarkResponse", "type": "object" }, "AmbientScoresResponse": { "description": "Acknowledges a monotonic score sync. `sync` is null on Personal; Anonymous and Visible return the canonical accepted aggregate and per-skill state.", "example": { "success": true, "sync": { "overall_pct": 62, "scored_date": "2026-06-29", "signals_count": 14, "skill_points": [ { "points": 2, "skill_area_slug": "ai_fundamentals" } ], "success": true, "total_points": 2 }, "tier": "visible" }, "properties": { "success": { "description": "Always true when the request was accepted", "type": "boolean" }, "sync": { "description": "Canonical accepted score state; null on the Personal tier", "nullable": true, "properties": { "overall_pct": { "maximum": 100, "minimum": 0, "type": "integer" }, "scored_date": { "description": "The scored date (YYYY-MM-DD)", "format": "date", "type": "string" }, "signals_count": { "minimum": 0, "type": "integer" }, "skill_points": { "items": { "properties": { "points": { "minimum": 0, "type": "integer" }, "skill_area_slug": { "type": "string" } }, "required": [ "skill_area_slug", "points" ], "type": "object" }, "type": "array" }, "success": { "type": "boolean" }, "total_points": { "minimum": 0, "type": "integer" } }, "required": [ "success", "overall_pct", "total_points", "skill_points", "signals_count", "scored_date" ], "type": "object" }, "tier": { "description": "The account's effective privacy tier at the time of the write", "enum": [ "personal", "anonymous", "visible" ], "type": "string" } }, "required": [ "success", "tier", "sync" ], "title": "AmbientScoresResponse", "type": "object" }, "LearningRecommendationsResponse": { "description": "Verified course recommendations from the enabled learning providers", "example": { "recommendations": [ { "because": "In your roadmap review this week, you weighed three options but didn't commit to one.", "duration": "12h", "instructor": "Jane Doe", "provider": "coursera", "title": "Negotiation Skills", "url": "https://www.coursera.org/learn/negotiation-skills", "why": "Sharpens how you frame asks when the room is pushing back." } ] }, "properties": { "recommendations": { "description": "Up to five web_search-verified courses; empty when the model found no confidence-worthy matches. The client validates each URL before rendering.", "items": { "properties": { "because": { "description": "One sentence grounding the recommendation in a moment this scan observed; transits back to the device only", "nullable": true, "type": "string" }, "duration": { "description": "Course duration, e.g. \"12h\" or \"4 weeks\"", "nullable": true, "type": "string" }, "instructor": { "description": "Instructor name", "nullable": true, "type": "string" }, "provider": { "description": "One of the enabled provider keys (coursera/udemy/linkedin_learning/oreilly)", "type": "string" }, "title": { "description": "The course title", "type": "string" }, "url": { "description": "Canonical course URL on the provider's domain", "type": "string" }, "why": { "description": "One plain-language sentence on how the course helps", "nullable": true, "type": "string" } }, "type": "object" }, "type": "array" } }, "title": "LearningRecommendationsResponse", "type": "object" }, "AmbientScanOutcomeResponse": { "description": "Acknowledges a stored metadata-only scan outcome", "example": { "success": true, "tier": "personal" }, "properties": { "success": { "description": "Always true when the outcome was stored", "type": "boolean" }, "tier": { "description": "The account's effective privacy tier at the time of the write", "enum": [ "personal", "anonymous", "visible" ], "type": "string" } }, "required": [ "success", "tier" ], "title": "AmbientScanOutcomeResponse", "type": "object" }, "PersonalGoalBehaviorProposalResponse": { "additionalProperties": false, "description": "Six distinct, observable, privacy-safe personal-goal behaviors", "example": { "behaviors": [ { "description": "Frame decisions with clear context" }, { "description": "Ask questions before offering solutions" }, { "description": "Delegate outcomes with clear ownership" }, { "description": "Summarize tradeoffs before recommending action" }, { "description": "Invite dissent before closing discussions" }, { "description": "Confirm next steps with named owners" } ] }, "properties": { "behaviors": { "description": "Exactly six behavior proposals; the client selects one to six", "items": { "additionalProperties": false, "properties": { "description": { "description": "A generic, observable behavior with no private specifics", "minLength": 1, "type": "string" } }, "required": [ "description" ], "type": "object" }, "maxItems": 6, "minItems": 6, "type": "array" } }, "required": [ "behaviors" ], "title": "PersonalGoalBehaviorProposalResponse", "type": "object" }, "AmbientRequirementsResponse": { "description": "The authenticated account's enrollment-derived scanner skill coverage", "example": { "archived_programs": [], "archived_skill_areas": [], "available_starters": [], "email": "learner@example.com", "enabled_learning_providers": [], "fleet_managed_updates": false, "person_name": null, "programs": [], "role": null, "skill_areas": [ { "behaviors": [ { "archived": false, "bloom_verb": "Write", "description": "Write concise, unambiguous messages — get to the point without losing nuance", "id": "B-COM.1a", "skill": "Conciseness", "skill_area": "Written", "skill_area_slug": "communication" }, { "archived": false, "bloom_verb": "Structure", "description": "Structure written proposals and recommendations with clear logic and evidence", "id": "B-COM.1b", "skill": "Structured Writing", "skill_area": "Written", "skill_area_slug": "communication" }, { "archived": false, "bloom_verb": "Adapt", "description": "Adapt communication style to the audience — technical detail for engineers, business impact for executives", "id": "B-COM.4a", "skill": "Audience Adaptation", "skill_area": "Adaptation", "skill_area_slug": "communication" }, { "archived": true, "bloom_verb": "Present", "description": "Present ideas clearly to groups — adapt depth and framing to the audience", "id": "B-COM.2a", "skill": "Presentations", "skill_area": "Verbal", "skill_area_slug": "communication" } ], "name": "Communication Essentials", "slug": "communication", "sort_order": 6 } ], "total_behaviors": 3 }, "properties": { "archived_programs": { "items": { "properties": { "archived_at": { "format": "date-time", "nullable": true, "type": "string" }, "description": { "nullable": true, "type": "string" }, "enrollment_kind": { "nullable": true, "type": "string" }, "id": { "type": "string" }, "kind": { "enum": [ "starter", "admin" ], "type": "string" }, "name": { "type": "string" }, "origin": { "enum": [ "signature", "custom" ], "type": "string" }, "self_enrollable": { "enum": [ 0, 1 ], "type": "integer" }, "skill_count": { "type": "integer" } }, "required": [ "id", "name", "description", "kind", "origin", "self_enrollable" ], "type": "object" }, "type": "array" }, "archived_skill_areas": { "items": { "properties": { "behaviors": { "items": { "properties": { "archived": { "description": "Whether the catalog retired this behavior; it stays score-bearing", "type": "boolean" }, "bloom_verb": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "skill": { "type": "string" }, "skill_area": { "type": "string" }, "skill_area_slug": { "type": "string" } }, "required": [ "id", "skill_area_slug", "skill_area", "skill", "description", "bloom_verb", "archived" ], "type": "object" }, "type": "array" }, "name": { "type": "string" }, "slug": { "type": "string" }, "sort_order": { "type": "integer" } }, "required": [ "slug", "name", "sort_order", "behaviors" ], "type": "object" }, "type": "array" }, "available_starters": { "items": { "properties": { "archived_at": { "format": "date-time", "nullable": true, "type": "string" }, "description": { "nullable": true, "type": "string" }, "enrollment_kind": { "nullable": true, "type": "string" }, "id": { "type": "string" }, "kind": { "enum": [ "starter", "admin" ], "type": "string" }, "name": { "type": "string" }, "origin": { "enum": [ "signature", "custom" ], "type": "string" }, "self_enrollable": { "enum": [ 0, 1 ], "type": "integer" }, "skill_count": { "type": "integer" } }, "required": [ "id", "name", "description", "kind", "origin", "self_enrollable" ], "type": "object" }, "type": "array" }, "email": { "type": "string" }, "enabled_learning_providers": { "description": "Provider keys enabled for this account after company defaults and person overrides, in catalog order", "items": { "type": "string" }, "type": "array" }, "fleet_managed_updates": { "type": "boolean" }, "person_name": { "nullable": true, "type": "string" }, "programs": { "items": { "properties": { "archived_at": { "format": "date-time", "nullable": true, "type": "string" }, "description": { "nullable": true, "type": "string" }, "enrollment_kind": { "nullable": true, "type": "string" }, "id": { "type": "string" }, "kind": { "enum": [ "starter", "admin" ], "type": "string" }, "name": { "type": "string" }, "origin": { "enum": [ "signature", "custom" ], "type": "string" }, "self_enrollable": { "enum": [ 0, 1 ], "type": "integer" }, "skill_count": { "type": "integer" } }, "required": [ "id", "name", "description", "kind", "origin", "self_enrollable" ], "type": "object" }, "type": "array" }, "role": { "nullable": true, "type": "string" }, "skill_areas": { "items": { "properties": { "behaviors": { "items": { "properties": { "archived": { "description": "Whether the catalog retired this behavior; it stays score-bearing", "type": "boolean" }, "bloom_verb": { "type": "string" }, "description": { "type": "string" }, "id": { "type": "string" }, "skill": { "type": "string" }, "skill_area": { "type": "string" }, "skill_area_slug": { "type": "string" } }, "required": [ "id", "skill_area_slug", "skill_area", "skill", "description", "bloom_verb", "archived" ], "type": "object" }, "type": "array" }, "name": { "type": "string" }, "slug": { "type": "string" }, "sort_order": { "type": "integer" } }, "required": [ "slug", "name", "sort_order", "behaviors" ], "type": "object" }, "type": "array" }, "total_behaviors": { "type": "integer" } }, "required": [ "email", "person_name", "role", "programs", "archived_programs", "skill_areas", "archived_skill_areas", "total_behaviors", "available_starters", "enabled_learning_providers", "fleet_managed_updates" ], "title": "AmbientRequirementsResponse", "type": "object" }, "AmbientLanguagePreferenceUpdateResponse": { "additionalProperties": false, "description": "The authenticated Ambient account's persisted output-language preference.", "example": { "language": "fr", "ok": true }, "properties": { "language": { "enum": [ "en", "fr", "de", "es", "pt-BR", "ja", "ko", "zh-CN" ], "nullable": true, "type": "string" }, "ok": { "enum": [ true ], "type": "boolean" } }, "required": [ "ok", "language" ], "title": "AmbientLanguagePreferenceUpdateResponse", "type": "object" }, "CoachingCardsResponse": { "description": "The digest cards that survived per-card validation — a subset of celebrate / activity_tip / growth_opportunity. The client stamps dates and dismissed flags and owns storage.", "example": { "cards": { "activity_tip": { "behaviors": [ { "id": "B-LDR.2a", "name": "decide under uncertainty" } ], "evidence": [ "Agenda context: Roadmap review" ], "skill_areas": [ "Leadership" ], "text": "Your afternoon review is a chance to land the decision you deferred last week." }, "celebrate": { "behaviors": [ { "id": "B-AGE.1a", "name": "give it context" } ], "evidence": [ "PR review thread, Tuesday" ], "skill_areas": [ "Agentic Engineering" ], "text": "You closed out the migration that had been open for weeks — steady, careful work." }, "growth_opportunity": { "behaviors": [ { "id": "B-COM.1b", "name": "structure proposals" } ], "evidence": [ "Design doc comments this week" ], "skill_areas": [ "Communication" ], "text": "Lately your proposals carry the analysis but not the ask — one crisp recommendation up front would give reviewers something to react to." } } }, "properties": { "cards": { "description": "Whichever cards came back usable; each key may be absent", "properties": { "activity_tip": { "properties": { "behaviors": { "description": "Internal behavior tags, not visible copy", "items": { "properties": { "id": { "type": "string" }, "name": { "type": "string" } }, "type": "object" }, "type": "array" }, "evidence": { "description": "Short source references behind the card; agenda rows are prefixed with 'Agenda context:'", "items": { "type": "string" }, "type": "array" }, "skill_areas": { "description": "The Skill Area name(s) the card relates to", "items": { "type": "string" }, "type": "array" }, "text": { "description": "The visible card copy, addressed to \"you\"", "type": "string" } }, "required": [ "text", "skill_areas", "behaviors", "evidence" ], "type": "object" }, "celebrate": { "properties": { "behaviors": { "description": "Internal behavior tags, not visible copy", "items": { "properties": { "id": { "type": "string" }, "name": { "type": "string" } }, "type": "object" }, "type": "array" }, "evidence": { "description": "Short source references behind the card; agenda rows are prefixed with 'Agenda context:'", "items": { "type": "string" }, "type": "array" }, "skill_areas": { "description": "The Skill Area name(s) the card relates to", "items": { "type": "string" }, "type": "array" }, "text": { "description": "The visible card copy, addressed to \"you\"", "type": "string" } }, "required": [ "text", "skill_areas", "behaviors", "evidence" ], "type": "object" }, "growth_opportunity": { "properties": { "behaviors": { "description": "Internal behavior tags, not visible copy", "items": { "properties": { "id": { "type": "string" }, "name": { "type": "string" } }, "type": "object" }, "type": "array" }, "evidence": { "description": "Short source references behind the card; agenda rows are prefixed with 'Agenda context:'", "items": { "type": "string" }, "type": "array" }, "skill_areas": { "description": "The Skill Area name(s) the card relates to", "items": { "type": "string" }, "type": "array" }, "text": { "description": "The visible card copy, addressed to \"you\"", "type": "string" } }, "required": [ "text", "skill_areas", "behaviors", "evidence" ], "type": "object" } }, "type": "object" } }, "title": "CoachingCardsResponse", "type": "object" }, "AmbientStandingResponse": { "additionalProperties": false, "description": "The caller's standing against the visible-tier cohort of its own company.\nEvery key is always present: the four data fields are null when standing is\nunavailable, so the client reads one shape rather than inferring which branch\nran. Nothing here identifies a colleague — only the caller's own values and\ncohort aggregates.\n", "example": { "available": true, "cohort_size": 24, "quantiles": { "p25": 180, "p50": 320, "p75": 610 }, "reason": null, "score": { "percentile": 62, "pts_to_median": 0, "value": 415 }, "velocity": { "percentile": 71, "value": 48, "window_days": 14 } }, "properties": { "available": { "description": "Whether a standing could be computed for the caller", "type": "boolean" }, "cohort_size": { "description": "Active visible-tier accounts in the caller's company with a synced score. Also reported on cohort_too_small, being an aggregate count rather than an identity.", "minimum": 0, "nullable": true, "type": "integer" }, "quantiles": { "additionalProperties": false, "description": "Cohort point values at the 25th, 50th and 75th percentile, including the caller. Point totals, not percentages.", "nullable": true, "properties": { "p25": { "type": "integer" }, "p50": { "type": "integer" }, "p75": { "type": "integer" } }, "required": [ "p25", "p50", "p75" ], "type": "object" }, "reason": { "description": "Why standing is unavailable: `tier_not_supported` when the caller is not\nvisible-tier, `cohort_too_small` below the company k-anonymity floor.\nNull both when available and when the caller simply has no score yet.\n", "enum": [ "tier_not_supported", "cohort_too_small" ], "nullable": true, "type": "string" }, "score": { "additionalProperties": false, "description": "The caller's latest score total and its rank in the cohort", "nullable": true, "properties": { "percentile": { "description": "Share of colleagues, excluding the caller, scoring strictly below the caller", "maximum": 100, "minimum": 0, "type": "integer" }, "pts_to_median": { "description": "Points needed to reach the cohort median; zero at or above it", "minimum": 0, "type": "integer" }, "value": { "description": "The caller's latest point total", "type": "integer" } }, "required": [ "percentile", "pts_to_median", "value" ], "type": "object" }, "velocity": { "additionalProperties": false, "description": "Rank of the caller's point gain over the trailing window. Null when the caller has no baseline that old, or fewer than two colleagues do, even when standing is otherwise available.", "nullable": true, "properties": { "percentile": { "description": "Share of colleagues, excluding the caller, gaining strictly fewer points over the window", "maximum": 100, "minimum": 0, "type": "integer" }, "value": { "description": "The caller's point gain over the window", "type": "integer" }, "window_days": { "description": "Length of the comparison window in days; authoritative, so clients label the meter from it rather than assuming a value", "minimum": 1, "type": "integer" } }, "required": [ "percentile", "value", "window_days" ], "type": "object" } }, "required": [ "available", "reason", "cohort_size", "quantiles", "score", "velocity" ], "title": "AmbientStandingResponse", "type": "object" }, "V2ScoreListResponse": { "description": "Response schema for a paginated list of assessment scores", "properties": { "data": { "description": "List of assessment scores", "items": { "$ref": "#/components/schemas/V2ScoreResponse" }, "type": "array" }, "has_more": { "description": "Indicates more results are available", "type": "boolean" }, "next_page": { "description": "URL to the next page of results", "nullable": true, "type": "string" } }, "required": [ "data", "has_more", "next_page" ], "title": "V2ScoreListResponse", "type": "object" }, "CoachingProfileResponse": { "description": "The rebuilt professional profile — a coach's mental model of the person. The client stamps the refresh watermark and version and owns on-device storage.", "example": { "profile": { "text": "PROFESSIONAL PROFILE\nOwns the assessment platform's backend and its migration tooling; accountable for data integrity across releases.\n\nCURRENT FOCUS\nLanding the scoring migration and negotiating its rollout with the platform team.\n\nOPERATING STYLE\n- Writes a decision doc before raising a debate.\n- Ships in small, reviewable increments.\n\nCOLLABORATION\nWorks daily with the platform team; reviews for two product squads.\n\nGROWTH OPPORTUNITIES\nTends to carry rollout risks alone rather than delegating follow-ups." } }, "properties": { "profile": { "properties": { "text": { "description": "Plain-text profile (~350 words) with the PROFESSIONAL PROFILE / CURRENT FOCUS / OPERATING STYLE / COLLABORATION / GROWTH OPPORTUNITIES sections", "type": "string" } }, "required": [ "text" ], "type": "object" } }, "title": "CoachingProfileResponse", "type": "object" }, "ProgramResponse": { "description": "Response schema for a program", "example": { "created_at": "2024-01-01T01:01:01Z", "domains": [ { "elective": false, "identifier": "8b65714c-ba23-41bc-97bc-0305fdff53e5", "target_score": 200, "title": "Supervised Learning Foundations" }, { "elective": true, "identifier": "a1f2e3d4-5678-90ab-cdef-1234567890ab", "target_score": 220, "title": "Applied Deep Learning" } ], "due_date": "2024-06-30", "identifier": "e26dc707-6ec0-44d3-aee9-9b558ad5d77b", "initiative_type": "skills_evaluation", "name": "Data Science Bootcamp", "start_date": "2024-01-01", "status": "LIVE", "updated_at": "2024-02-01T01:01:01Z" }, "properties": { "badge_template_id": { "description": "Identifier of the badge template associated with this program. Present only when the program has an active badge template configured; omitted otherwise. The value is currently a Credly badge template ID.", "type": "string" }, "created_at": { "description": "The timestamp when the program was created", "format": "date-time", "type": "string" }, "domains": { "description": "Capabilities that make up the program. Order is not guaranteed; do not rely on positional semantics.", "items": { "properties": { "elective": { "description": "Whether the capability is elective within this program", "type": "boolean" }, "identifier": { "description": "Unique capability identifier. Matches the identifier returned by GET /api/v1/domains.", "format": "uuid", "type": "string" }, "target_score": { "description": "The target score a learner is expected to reach for this capability", "type": "integer" }, "title": { "description": "Capability title", "type": "string" } }, "required": [ "identifier", "title", "elective", "target_score" ], "type": "object" }, "type": "array" }, "due_date": { "description": "The due date of the program", "format": "date", "nullable": true, "type": "string" }, "identifier": { "description": "Unique program identifier", "type": "string" }, "initiative_type": { "description": "The program's initiative type. `skills_evaluation` is the canonical high-stakes type; consumers decide which types they treat as high-stakes. Matches the `initiative_type` returned on scores and webhooks.", "enum": [ "skills_evaluation", "skills_growth", "benchmark" ], "type": "string" }, "name": { "description": "Program name", "type": "string" }, "start_date": { "description": "The start date of the program", "format": "date", "nullable": true, "type": "string" }, "status": { "description": "The status of the program", "enum": [ "DRAFT", "LIVE", "ARCHIVED" ], "type": "string" }, "updated_at": { "description": "The timestamp when the program was last updated", "format": "date-time", "type": "string" } }, "required": [ "identifier", "name", "initiative_type", "created_at", "updated_at", "status", "domains" ], "title": "ProgramResponse", "type": "object" }, "GoalToBehaviorResponse": { "description": "One observable behavior generated from a plain-language goal", "example": { "behavior": { "bloom_verb": "Facilitate", "description": "Facilitate retrospectives that surface risks and next steps" } }, "properties": { "behavior": { "description": "The generated behavior", "properties": { "bloom_verb": { "description": "The behavior's Bloom's taxonomy verb (capitalized)", "type": "string" }, "description": { "description": "The observable behavior — generic and imperative, with no private specifics", "type": "string" } }, "type": "object" } }, "title": "GoalToBehaviorResponse", "type": "object" }, "V2SelfRatingListResponse": { "description": "Response schema for a paginated list of self-ratings", "properties": { "data": { "description": "List of self-ratings", "items": { "$ref": "#/components/schemas/V2SelfRatingResponse" }, "type": "array" }, "has_more": { "description": "Indicates more results are available", "type": "boolean" }, "next_page": { "description": "URL to the next page of results", "nullable": true, "type": "string" } }, "required": [ "data", "has_more", "next_page" ], "title": "V2SelfRatingListResponse", "type": "object" }, "AmbientPresenceResponse": { "description": "Acknowledges a metadata-only presence update", "example": { "success": true }, "properties": { "success": { "description": "Always true when presence was recorded", "type": "boolean" } }, "title": "AmbientPresenceResponse", "type": "object" }, "CompetencyModelExportResponse": { "description": "The full competency model for a capability: capability → skill areas → skills → behaviors. Every node exposes only its identifier and name.", "example": { "identifier": "8b65714c-ba23-41bc-97bc-0305fdff53e5", "name": "Machine Learning", "skill_areas": [ { "identifier": "11111111-1111-7000-8000-000000000001", "name": "Supervised Learning", "skills": [ { "behaviors": [ { "identifier": "33333333-3333-7000-8000-000000000003", "name": "Linear Regression" } ], "identifier": "22222222-2222-7000-8000-000000000002", "name": "Linear Models" } ] } ] }, "properties": { "identifier": { "description": "Unique capability identifier", "format": "uuid", "type": "string" }, "name": { "description": "Capability name", "type": "string" }, "skill_areas": { "items": { "description": "A skill area and its skills", "properties": { "identifier": { "description": "Unique skill area identifier", "format": "uuid", "type": "string" }, "name": { "description": "Skill area name", "type": "string" }, "skills": { "items": { "description": "A skill and its behaviors", "properties": { "behaviors": { "items": { "description": "A behavior", "properties": { "identifier": { "description": "Unique behavior identifier", "format": "uuid", "type": "string" }, "name": { "description": "Behavior name", "type": "string" } }, "required": [ "identifier", "name" ], "type": "object" }, "type": "array" }, "identifier": { "description": "Unique skill identifier", "format": "uuid", "type": "string" }, "name": { "description": "Skill name", "type": "string" } }, "required": [ "identifier", "name", "behaviors" ], "type": "object" }, "type": "array" } }, "required": [ "identifier", "name", "skills" ], "type": "object" }, "type": "array" } }, "required": [ "identifier", "name", "skill_areas" ], "title": "CompetencyModelExportResponse", "type": "object" }, "AmbientProgramActionResult": { "description": "Acknowledges a successful enroll / archive / unarchive on the account's membership", "example": { "ok": true }, "properties": { "ok": { "description": "Always true; failures use the error envelope", "type": "boolean" } }, "required": [ "ok" ], "title": "AmbientProgramActionResult", "type": "object" }, "AmbientGraduationResponse": { "description": "Acknowledges the device-authoritative level graduation. Personal-tier requests are successful no-ops; other tiers persist level metadata.", "example": { "behaviors": [ { "description": "Apply leadership consistently", "id": "LV-LDR-2-example" } ], "current_level": 2, "success": true }, "properties": { "behaviors": { "description": "The device-generated behaviors for the new level; not persisted by Workera", "items": { "properties": { "description": { "type": "string" }, "id": { "type": "string" } }, "required": [ "id", "description" ], "type": "object" }, "type": "array" }, "current_level": { "maximum": 99, "minimum": 2, "type": "integer" }, "success": { "description": "Always true on an accepted graduation", "type": "boolean" } }, "required": [ "success", "current_level", "behaviors" ], "title": "AmbientGraduationResponse", "type": "object" }, "AmbientLoginRequestResponse": { "description": "Acknowledgement of a magic-link request (enumeration-safe)", "example": { "sent": true }, "properties": { "sent": { "description": "Always true, regardless of whether the email exists", "type": "boolean" } }, "title": "AmbientLoginRequestResponse", "type": "object" }, "AuditEvent": { "description": "An audit event for enterprise security logging", "example": { "action": "auth.login", "actor_enterprise_id": "EMP12345", "actor_id": "462db21e-618d-4211-931a-9c5c43522e65", "actor_type": "user", "created_at": "2026-01-10T14:30:00Z", "id": "01936e0a-1234-7000-8000-000000000001", "location": "192.168.1.1", "metadata": {}, "request_id": "FwK2X3Pg_qUABB4AAABI", "session_id": "abc123def456", "targets": [ { "id": "462db21e-618d-4211-931a-9c5c43522e65", "type": "user" } ], "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" }, "properties": { "action": { "description": "The action that was performed (e.g., auth.login, user.created)", "type": "string" }, "actor_enterprise_id": { "description": "Enterprise employee ID for SIEM correlation", "nullable": true, "type": "string" }, "actor_id": { "description": "Identifier of the actor who performed the action", "format": "uuid", "nullable": true, "type": "string" }, "actor_type": { "description": "Type of actor", "enum": [ "user", "admin", "api_key", "system" ], "type": "string" }, "created_at": { "description": "Timestamp when the event occurred", "format": "date-time", "type": "string" }, "id": { "description": "Unique identifier for the audit event (UUIDv7)", "format": "uuid", "type": "string" }, "location": { "description": "IP address of the request origin", "nullable": true, "type": "string" }, "metadata": { "additionalProperties": true, "description": "Additional event-specific data (PII-safe)", "type": "object" }, "request_id": { "description": "Request ID for correlation with application logs", "nullable": true, "type": "string" }, "session_id": { "description": "Session ID for tracking user sessions", "nullable": true, "type": "string" }, "targets": { "description": "List of entities affected by the action", "items": { "properties": { "id": { "description": "Identifier of the target", "type": "string" }, "type": { "description": "Type of target (e.g., user, program)", "type": "string" } }, "required": [ "type", "id" ], "type": "object" }, "type": "array" }, "user_agent": { "description": "User agent string from the request", "nullable": true, "type": "string" } }, "required": [ "id", "action", "actor_type", "targets", "metadata", "created_at" ], "title": "AuditEvent", "type": "object" }, "AmbientRegisterResponse": { "description": "Outcome of a consumer registration attempt", "example": { "status": "verification_sent" }, "properties": { "status": { "description": "Whether a new account was created or the email already existed", "enum": [ "verification_sent", "already_registered" ], "type": "string" } }, "title": "AmbientRegisterResponse", "type": "object" }, "ScanClassifyResponse": { "description": "The classified scan outcome. The client resolves each artifact_ref back to its on-device artifact (dropping unresolved refs) and stamps the bookkeeping fields (email, scan_timestamp, scanned/skipped sources, enabled providers) itself.", "example": { "challenge_completions": [ { "artifact_ref": "01f9295c", "description": "You said bonjour to Kian in a DM.", "mission_id": "M-123" } ], "coach_signals": { "ai_build": 6, "ai_challenge": 2, "areas": [ "Communication" ], "decided_days": [ 2, 5 ], "initiated": 3, "meeting_turns": 41, "open_decisions": 1, "people": [ { "interactions": 7, "name": "Kian" } ], "questions": 4, "responded": 9, "speak_turns": 12, "statements": 11 }, "coaching_cards_acted_on": [], "coaching_feedback": { "recognize": { "quote": "we ship Friday or we cut scope", "source": "Slack · #launch-team · Jul 9", "strength": "saying the hard part plainly", "win": "You unblocked the launch thread by naming the tradeoff directly." } }, "home_headline": "You unblocked two people in review today — easy to undervalue.", "new_evidence": [ { "artifact_ref": "01f9295c", "behavior_id": "B-COM.1a", "description": "You sent a concise launch update that led with the decision.", "skill_summary": "leading an update with the decision" } ] }, "properties": { "challenge_completions": { "description": "Challenges judged completed this window; empty when none", "items": { "properties": { "artifact_ref": { "description": "The `ref` of the artifact that satisfies the challenge", "type": "string" }, "description": { "description": "The \"why credited\" proof shown to the user, starting with \"You\"", "type": "string" }, "mission_id": { "description": "The completed challenge's id", "type": "string" } }, "required": [ "mission_id", "artifact_ref", "description" ], "type": "object" }, "type": "array" }, "coach_signals": { "description": "Per-scan tallies the desktop rolls up on-device into the Coach page's 14-day Patterns spectrums and Collaboration circle. Always present with every tally defaulted; an all-zero object is a quiet scan, which the desktop stores no row for. Additive telemetry — never part of evidence or scoring.", "properties": { "ai_build": { "description": "AI-tool prompts asking it to produce or draft something", "type": "integer" }, "ai_challenge": { "description": "AI-tool prompts asking it to critique the user's approach", "type": "integer" }, "areas": { "description": "Distinct skill areas the user's work touched this window", "items": { "type": "string" }, "type": "array" }, "decided_days": { "description": "For decisions closed this window, roughly how many days each had been open", "items": { "type": "integer" }, "type": "array" }, "initiated": { "description": "Threads/docs/messages the user started", "type": "integer" }, "meeting_turns": { "description": "Total speaking turns across those same meetings; 0 when none", "type": "integer" }, "open_decisions": { "description": "Decisions still awaiting the user's call at the end of the window", "type": "integer" }, "people": { "description": "Distinct real people the user interacted with this window", "items": { "properties": { "interactions": { "description": "Rough interaction count", "type": "integer" }, "name": { "type": "string" } }, "required": [ "name" ], "type": "object" }, "type": "array" }, "questions": { "description": "Messages the user wrote that were genuine questions", "type": "integer" }, "responded": { "description": "Threads/messages the user responded to", "type": "integer" }, "speak_turns": { "description": "The user's own speaking turns across transcribed meetings", "type": "integer" }, "statements": { "description": "Messages the user wrote that were statements, answers, or directives", "type": "integer" } }, "required": [ "questions", "statements", "initiated", "responded", "ai_build", "ai_challenge", "speak_turns", "meeting_turns", "open_decisions", "decided_days", "areas", "people" ], "type": "object" }, "coaching_cards_acted_on": { "description": "Sent cards the user clearly acted on; empty when none", "items": { "properties": { "artifact_ref": { "description": "The `ref` of the artifact showing the action", "type": "string" }, "card": { "description": "The card key exactly as sent", "type": "string" }, "note": { "description": "One short \"You …\" clause shown as the follow-up note", "type": "string" } }, "required": [ "card", "artifact_ref", "note" ], "type": "object" }, "type": "array" }, "coaching_feedback": { "description": "At most 1–2 coaching cards across the six types; every type and every field may be absent", "nullable": true, "properties": { "ai_opportunity": { "properties": { "inputs_text": { "type": "string" }, "reusable_prompt": { "type": "string" }, "task": { "type": "string" }, "tip": { "type": "string" } }, "type": "object" }, "another_way": { "properties": { "lesson": { "type": "string" }, "said": { "type": "string" }, "source": { "type": "string" }, "try": { "type": "string" }, "why": { "type": "string" } }, "type": "object" }, "check_in": { "properties": { "intention": { "type": "string" }, "prompt": { "type": "string" }, "source": { "type": "string" } }, "type": "object" }, "recognize": { "properties": { "quote": { "type": "string" }, "source": { "type": "string" }, "strength": { "type": "string" }, "win": { "type": "string" } }, "type": "object" }, "reflect": { "properties": { "context": { "type": "string" }, "next_step": { "type": "string" }, "question": { "type": "string" }, "quote": { "type": "string" }, "source": { "type": "string" } }, "type": "object" }, "suggested_action": { "properties": { "body": { "description": "Free-form; shape depends on kind (routine|skill|slack)", "type": "object" }, "headline": { "type": "string" }, "kind": { "enum": [ "routine", "skill", "slack" ], "type": "string" }, "preview": { "type": "string" }, "summary": { "type": "string" } }, "type": "object" } }, "type": "object" }, "home_headline": { "description": "One first-person coach line leading the Today cards; null when the scan was too quiet for one and the desktop should use its own fallback", "nullable": true, "type": "string" }, "new_evidence": { "description": "Skill evidence extracted from the artifacts; empty when nothing qualified", "items": { "properties": { "artifact_ref": { "description": "The `ref` of the item the evidence is drawn from; the client resolves it back to the on-device artifact and drops unresolved refs", "type": "string" }, "behavior_id": { "description": "A behavior_id from the request's skill_areas catalog", "type": "string" }, "description": { "description": "One sentence starting with \"You\", shown verbatim in the UI", "type": "string" }, "skill_summary": { "description": "Plain-language name for the skill, in the user's own terms — headlines the recognition card as \"You're getting better at …\". Absent when the model had no natural phrasing for it", "type": "string" } }, "required": [ "behavior_id", "description", "artifact_ref" ], "type": "object" }, "type": "array" } }, "required": [ "home_headline", "new_evidence", "coaching_feedback", "challenge_completions", "coaching_cards_acted_on", "coach_signals" ], "title": "ScanClassifyResponse", "type": "object" }, "AmbientAccountDeletedResponse": { "description": "Confirmation that the authenticated Ambient account was deleted", "example": { "deleted": true }, "properties": { "deleted": { "description": "Always true after successful deletion", "enum": [ true ], "type": "boolean" } }, "required": [ "deleted" ], "title": "AmbientAccountDeletedResponse", "type": "object" }, "PongResponse": { "description": "Response schema for a pong", "example": { "data": [ { "pong": true } ] }, "properties": { "pong": { "description": "Always true", "type": "boolean" } }, "title": "PongResponse", "type": "object" }, "CoachChatResponse": { "description": "The next reply in a device-owned guided Coach conversation", "example": { "text": "Start with the project kickoff: state the tradeoff you see, then ask the team to name the risk they would accept. That gives you a concrete rep today without turning the meeting into an exercise." }, "properties": { "text": { "description": "The coach's grounded plain-text reply; returned to and persisted only by the device", "type": "string" } }, "title": "CoachChatResponse", "type": "object" }, "AmbientPrivacyTierUpdateResponse": { "additionalProperties": false, "description": "Result of a successful privacy-tier update. Consumer Personal updates are no-ops;\nenterprise updates persist the requested tier.\n", "example": { "ok": true, "previous": "personal", "pseudonym_rotated": true, "tier": "anonymous" }, "properties": { "ok": { "enum": [ true ], "type": "boolean" }, "previous": { "enum": [ "personal", "anonymous", "visible" ], "type": "string" }, "pseudonym_rotated": { "type": "boolean" }, "tier": { "enum": [ "personal", "anonymous", "visible" ], "type": "string" } }, "required": [ "ok", "tier", "previous", "pseudonym_rotated" ], "title": "AmbientPrivacyTierUpdateResponse", "type": "object" }, "AmbientOnboardingEventResponse": { "additionalProperties": false, "description": "Acknowledges a stored metadata-only onboarding funnel event", "example": { "success": true }, "properties": { "success": { "enum": [ true ], "type": "boolean" } }, "required": [ "success" ], "title": "AmbientOnboardingEventResponse", "type": "object" }, "ProgramListResponse": { "description": "Response schema for a list of programs", "example": { "data": [ { "created_at": "2024-01-01T01:01:01Z", "description": "Comprehensive data science training program", "domains": [ { "elective": false, "identifier": "8b65714c-ba23-41bc-97bc-0305fdff53e5", "target_score": 200, "title": "Supervised Learning Foundations" } ], "due_date": "2024-06-30", "identifier": "e26dc707-6ec0-44d3-aee9-9b558ad5d77b", "name": "Data Science Bootcamp", "start_date": "2024-01-01", "status": "LIVE", "updated_at": "2024-02-01T01:01:01Z" } ], "has_more": false, "next_page": null }, "properties": { "data": { "description": "List of programs. String fields such as program and capability names are returned with HTML entities decoded.", "items": { "$ref": "#/components/schemas/ProgramResponse" }, "type": "array" }, "has_more": { "description": "indicates pagination can be used to retrieve more programs", "type": "boolean" }, "next_page": { "description": "URL to the next page of the paginated programs", "nullable": true, "type": "string" } }, "required": [ "data", "has_more", "next_page" ], "title": "ProgramListResponse", "type": "object" }, "AmbientProfileResponse": { "description": "The authenticated account's persisted name and effective company", "example": { "company": "Northwind Labs", "first_name": "Jordan", "full_name": "Jordan Ellery", "last_name": "Ellery" }, "properties": { "company": { "description": "Consumer employer name or enterprise tenant name; null when unset", "nullable": true, "type": "string" }, "first_name": { "description": "Trimmed first name", "type": "string" }, "full_name": { "description": "Display name composed from the name parts", "type": "string" }, "last_name": { "description": "Trimmed last name, or null when omitted or blank", "nullable": true, "type": "string" } }, "required": [ "first_name", "last_name", "full_name", "company" ], "title": "AmbientProfileResponse", "type": "object" }, "AmbientProgramsResponse": { "description": "The authenticated account's Programs tab: enrolled, archived, and available starters", "example": { "archived_programs": [], "programs": [ { "archived_at": null, "description": "Clarity in writing, effective presentations, active listening, cross-functional collaboration, audience adaptation", "enrollment_kind": "self", "enrollment_status": "active", "id": "018f1e2a-0000-7000-8000-000000000001", "kind": "starter", "name": "Communication Essentials", "origin": "signature", "self_enrollable": 1, "skill_areas": [ { "behaviors": [ { "description": "Write concise, unambiguous messages — get to the point without losing nuance", "id": "B-COM.1a", "skill": "Conciseness" } ], "name": "Communication Essentials", "slug": "communication" } ], "status": "active" } ], "starters": [] }, "properties": { "archived_programs": { "items": { "properties": { "archived_at": { "format": "date-time", "nullable": true, "type": "string" }, "description": { "nullable": true, "type": "string" }, "enrollment_kind": { "enum": [ "self", "admin" ], "nullable": true, "type": "string" }, "enrollment_status": { "enum": [ "active", "archived" ], "nullable": true, "type": "string" }, "id": { "type": "string" }, "kind": { "enum": [ "starter", "admin" ], "type": "string" }, "name": { "type": "string" }, "origin": { "enum": [ "signature", "custom" ], "type": "string" }, "self_enrollable": { "enum": [ 0, 1 ], "type": "integer" }, "skill_areas": { "items": { "properties": { "behaviors": { "items": { "properties": { "description": { "type": "string" }, "id": { "type": "string" }, "skill": { "type": "string" } }, "required": [ "id", "skill", "description" ], "type": "object" }, "type": "array" }, "name": { "nullable": true, "type": "string" }, "slug": { "type": "string" } }, "required": [ "slug", "behaviors" ], "type": "object" }, "type": "array" }, "status": { "enum": [ "active", "archived" ], "type": "string" } }, "required": [ "id", "name", "description", "kind", "origin", "self_enrollable", "status", "enrollment_status", "enrollment_kind", "archived_at", "skill_areas" ], "type": "object" }, "type": "array" }, "programs": { "items": { "properties": { "archived_at": { "format": "date-time", "nullable": true, "type": "string" }, "description": { "nullable": true, "type": "string" }, "enrollment_kind": { "enum": [ "self", "admin" ], "nullable": true, "type": "string" }, "enrollment_status": { "enum": [ "active", "archived" ], "nullable": true, "type": "string" }, "id": { "type": "string" }, "kind": { "enum": [ "starter", "admin" ], "type": "string" }, "name": { "type": "string" }, "origin": { "enum": [ "signature", "custom" ], "type": "string" }, "self_enrollable": { "enum": [ 0, 1 ], "type": "integer" }, "skill_areas": { "items": { "properties": { "behaviors": { "items": { "properties": { "description": { "type": "string" }, "id": { "type": "string" }, "skill": { "type": "string" } }, "required": [ "id", "skill", "description" ], "type": "object" }, "type": "array" }, "name": { "nullable": true, "type": "string" }, "slug": { "type": "string" } }, "required": [ "slug", "behaviors" ], "type": "object" }, "type": "array" }, "status": { "enum": [ "active", "archived" ], "type": "string" } }, "required": [ "id", "name", "description", "kind", "origin", "self_enrollable", "status", "enrollment_status", "enrollment_kind", "archived_at", "skill_areas" ], "type": "object" }, "type": "array" }, "starters": { "items": { "properties": { "archived_at": { "format": "date-time", "nullable": true, "type": "string" }, "description": { "nullable": true, "type": "string" }, "enrollment_kind": { "enum": [ "self", "admin" ], "nullable": true, "type": "string" }, "enrollment_status": { "enum": [ "active", "archived" ], "nullable": true, "type": "string" }, "id": { "type": "string" }, "kind": { "enum": [ "starter", "admin" ], "type": "string" }, "name": { "type": "string" }, "origin": { "enum": [ "signature", "custom" ], "type": "string" }, "self_enrollable": { "enum": [ 0, 1 ], "type": "integer" }, "skill_areas": { "items": { "properties": { "behaviors": { "items": { "properties": { "description": { "type": "string" }, "id": { "type": "string" }, "skill": { "type": "string" } }, "required": [ "id", "skill", "description" ], "type": "object" }, "type": "array" }, "name": { "nullable": true, "type": "string" }, "slug": { "type": "string" } }, "required": [ "slug", "behaviors" ], "type": "object" }, "type": "array" }, "status": { "enum": [ "active", "archived" ], "type": "string" } }, "required": [ "id", "name", "description", "kind", "origin", "self_enrollable", "status", "enrollment_status", "enrollment_kind", "archived_at", "skill_areas" ], "type": "object" }, "type": "array" } }, "required": [ "programs", "archived_programs", "starters" ], "title": "AmbientProgramsResponse", "type": "object" }, "RolePlayPromptResponse": { "description": "The ready-to-paste role-play practice prompt for a behavior", "example": { "prompt": "I'm practicing a specific behavior with you as my roleplay partner. Stay in character throughout — do not coach me, do not break frame.\n\nBehavior I'm practicing: Facilitate retrospectives that surface risks\nBehavior ID: LV-a1b2c3\n\n…\n\nPRACTICE_COMPLETE: LV-a1b2c3\n\nBegin in character. Wait for me to start." }, "properties": { "prompt": { "description": "The filled practice prompt. Grounded in the device-local evidence and ends with the PRACTICE_COMPLETE marker line the next scan detects; used only on-device by the client", "type": "string" } }, "title": "RolePlayPromptResponse", "type": "object" }, "AmbientPrivacyTierMinimumError": { "description": "The requested enterprise tier is below the company's minimum tier", "example": { "code": "below_company_minimum", "company_min_tier": "anonymous", "error": "Your company requires at least Anonymous mode." }, "properties": { "code": { "description": "Stable machine-readable rejection code", "enum": [ "below_company_minimum" ], "type": "string" }, "company_min_tier": { "description": "The minimum privacy tier permitted by the company", "enum": [ "personal", "anonymous", "visible" ], "type": "string" }, "error": { "description": "Human-readable company policy requirement", "type": "string" } }, "required": [ "error", "code", "company_min_tier" ], "title": "AmbientPrivacyTierMinimumError", "type": "object" }, "V2SelfRatingResponse": { "description": "Response schema for a self-rating", "properties": { "created_at": { "description": "Creation timestamp", "format": "date-time", "type": "string" }, "domain": { "description": "Capability information", "properties": { "identifier": { "description": "Unique capability identifier", "type": "string" }, "name": { "description": "Capability name", "type": "string" } }, "required": [ "identifier", "name" ], "type": "object" }, "identifier": { "description": "Unique self-rating identifier", "type": "string" }, "score": { "description": "Self-assessed score", "type": "integer" }, "user": { "description": "User information", "properties": { "email": { "description": "User email", "type": "string" }, "employee": { "description": "Employee information", "properties": { "identifier": { "description": "Enterprise employee ID", "type": "string" } }, "required": [ "identifier" ], "type": "object" }, "identifier": { "description": "Unique user identifier", "type": "string" } }, "required": [ "identifier", "email", "employee" ], "type": "object" } }, "required": [ "identifier", "score", "created_at", "domain", "user" ], "title": "V2SelfRatingResponse", "type": "object" }, "ErrorResponse": { "description": "Response schema for all errors", "example": { "code": "resource_missing", "message": "User not found", "type": "invalid_request_error" }, "properties": { "code": { "description": "Machine-readable error code", "type": "string" }, "message": { "description": "Human-readable error message", "type": "string" }, "type": { "description": "Category of error", "type": "string" } }, "title": "ErrorResponse", "type": "object" }, "AmbientTroubleshootingEvidenceResponse": { "additionalProperties": false, "description": "Acknowledges a stored staff-only troubleshooting bundle", "example": { "id": "0198b0af-5210-7000-8000-000000000001", "success": true }, "properties": { "id": { "format": "uuid", "type": "string" }, "success": { "enum": [ true ], "type": "boolean" } }, "required": [ "success", "id" ], "title": "AmbientTroubleshootingEvidenceResponse", "type": "object" }, "AuditEventListResponse": { "description": "Response schema for a paginated list of audit events", "example": { "data": [ { "action": "auth.login", "actor_enterprise_id": "EMP12345", "actor_id": "462db21e-618d-4211-931a-9c5c43522e65", "actor_type": "user", "created_at": "2026-01-10T14:30:00Z", "id": "01936e0a-1234-7000-8000-000000000001", "location": "192.168.1.1", "metadata": {}, "request_id": "FwK2X3Pg_qUABB4AAABI", "session_id": "abc123def456", "targets": [ { "id": "462db21e-618d-4211-931a-9c5c43522e65", "type": "user" } ], "user_agent": "Mozilla/5.0" } ], "has_more": false, "next_page": null }, "properties": { "data": { "description": "List of audit events", "items": { "$ref": "#/components/schemas/AuditEvent" }, "type": "array" }, "has_more": { "description": "Indicates if more events are available via pagination", "type": "boolean" }, "next_page": { "description": "URL to the next page of results", "nullable": true, "type": "string" } }, "required": [ "data", "has_more", "next_page" ], "title": "AuditEventListResponse", "type": "object" }, "AmbientScanTelemetryResponse": { "description": "Acknowledges a stored metadata-only scan-telemetry record", "example": { "success": true, "tier": "personal" }, "properties": { "success": { "description": "Always true when the record was stored", "type": "boolean" }, "tier": { "description": "The account's effective privacy tier at the time of the write", "enum": [ "personal", "anonymous", "visible" ], "type": "string" } }, "title": "AmbientScanTelemetryResponse", "type": "object" }, "AmbientRevokeResponse": { "description": "Acknowledgement of a family revocation (returned even for unknown tokens)", "example": { "revoked": true }, "properties": { "revoked": { "description": "Always true — an unknown token reveals nothing", "type": "boolean" } }, "title": "AmbientRevokeResponse", "type": "object" }, "NextLevelBehaviorsResponse": { "description": "The observable behaviors generated for a skill area's next level", "example": { "behaviors": [ { "bloom_verb": "Facilitate", "description": "Surface Risks — name the risks and next steps in every retro", "why": "Your recent incident reviews stalled without clear owners or actions." }, { "bloom_verb": "Coach", "description": "Calm Coaching — walk a peer through a tough call without deciding", "why": "You guided the rollout discussion but made the call yourself." }, { "bloom_verb": "Resolve", "description": "Close Disagreement — turn a stalled debate into a named decision", "why": "The last incident review needed a tie-breaker and never got one." } ] }, "properties": { "behaviors": { "description": "The generated behaviors (exactly 3). The client mints the local ids.", "items": { "properties": { "bloom_verb": { "description": "The behavior's Bloom's taxonomy verb (capitalized)", "type": "string" }, "description": { "description": "The observable behavior — generic and imperative, with no private specifics", "type": "string" }, "why": { "description": "One sentence grounding the behavior in the learner's recent work; stored only on-device by the client", "type": "string" } }, "required": [ "description", "bloom_verb", "why" ], "type": "object" }, "maxItems": 3, "minItems": 3, "type": "array" } }, "required": [ "behaviors" ], "title": "NextLevelBehaviorsResponse", "type": "object" }, "AmbientProgressSyncResponse": { "additionalProperties": false, "description": "Acknowledges current score and level synchronization under the effective privacy tier.", "example": { "levels": [ { "level": 2, "skill_area_slug": "ai_fundamentals" } ], "score": { "overall_pct": 72, "rejected_behavior_ids": [], "scored_date": "2026-07-22", "signals_count": 84, "stored": true, "success": true, "total_points": 310 }, "success": true, "tier": "visible" }, "properties": { "levels": { "items": { "additionalProperties": false, "properties": { "level": { "maximum": 99, "minimum": 1, "type": "integer" }, "skill_area_slug": { "type": "string" } }, "required": [ "skill_area_slug", "level" ], "type": "object" }, "type": "array" }, "score": { "additionalProperties": false, "properties": { "overall_pct": { "maximum": 100, "minimum": 0, "type": "integer" }, "rejected_behavior_ids": { "items": { "type": "string" }, "type": "array" }, "scored_date": { "format": "date", "type": "string" }, "signals_count": { "maximum": 2147483647, "minimum": 0, "type": "integer" }, "stored": { "description": "Whether the effective privacy tier permitted server persistence", "type": "boolean" }, "success": { "enum": [ true ], "type": "boolean" }, "total_points": { "maximum": 2147483647, "minimum": 0, "type": "integer" } }, "required": [ "success", "stored", "overall_pct", "total_points", "signals_count", "scored_date", "rejected_behavior_ids" ], "type": "object" }, "success": { "enum": [ true ], "type": "boolean" }, "tier": { "enum": [ "personal", "anonymous", "visible" ], "type": "string" } }, "required": [ "success", "tier", "score", "levels" ], "title": "AmbientProgressSyncResponse", "type": "object" }, "AmbientOnboardingProbeResponse": { "description": "Onboarding routing decision for an email — routing only, no account data", "example": { "flow": "register" }, "properties": { "flow": { "description": "Which onboarding flow the desktop should start", "enum": [ "login", "register", "not_eligible" ], "type": "string" } }, "title": "AmbientOnboardingProbeResponse", "type": "object" }, "V2ScoreResponse": { "description": "Response schema for an assessment score", "example": { "created_at": "2021-01-01T00:00:00Z", "domain": { "identifier": "0065714c-ba23-41bc-97bc-0305fdff53aa", "name": "Python Programming", "program_identifiers": [ "prog-123", "prog-456" ] }, "identifier": "8cc33637-628c-4f1a-aa02-d489d91d1778", "initiative_type": "skills_evaluation", "proficiency_level": "accomplished", "score": 220, "skill_ratings": [ { "behaviors": [ { "identifier": "behavior-001", "name": "Implement linked lists" }, { "identifier": "behavior-002", "name": "Use hash maps effectively" } ], "identifier": "skill-001", "name": "Data Structures", "rating": 3 } ], "source": "baseline_assessment", "updated_at": "2021-01-01T00:00:00Z", "user": { "email": "user@company.com", "employee": { "identifier": "EMP12345" }, "identifier": "1165714c-ba23-41bc-97bc-0305fdff53e7" } }, "properties": { "created_at": { "description": "Creation timestamp", "format": "date-time", "type": "string" }, "domain": { "description": "Capability information", "properties": { "identifier": { "description": "Unique capability identifier", "type": "string" }, "name": { "description": "Capability name", "type": "string" }, "program_identifiers": { "description": "Program identifiers this capability belongs to", "items": { "type": "string" }, "type": "array" } }, "required": [ "identifier", "name", "program_identifiers" ], "type": "object" }, "identifier": { "description": "Unique score identifier", "type": "string" }, "initiative_type": { "description": "Initiative type of the program that produced this score, or null for standalone/program-less scores. `skills_evaluation` is the canonical high-stakes type; consumers decide which types they treat as high-stakes.", "enum": [ "skills_evaluation", "skills_growth", "benchmark" ], "nullable": true, "type": "string" }, "proficiency_level": { "description": "Human-readable proficiency label", "enum": [ "beginner", "developing", "accomplished", "expert" ], "type": "string" }, "score": { "description": "Capability score (0-300)", "type": "integer" }, "skill_ratings": { "description": "Skill-level ratings with behaviors", "items": { "properties": { "behaviors": { "description": "Behaviors that belong to this skill", "items": { "properties": { "identifier": { "description": "Unique behavior identifier", "type": "string" }, "name": { "description": "Behavior name", "type": "string" } }, "required": [ "identifier", "name" ], "type": "object" }, "type": "array" }, "identifier": { "description": "Unique skill identifier", "type": "string" }, "name": { "description": "Skill name", "type": "string" }, "rating": { "description": "Skill rating (1-4)", "type": "integer" } }, "required": [ "identifier", "name", "rating", "behaviors" ], "type": "object" }, "type": "array" }, "source": { "description": "Assessment type that produced the score", "enum": [ "baseline_assessment", "mini_assessment", "full_reassessment" ], "type": "string" }, "updated_at": { "description": "Last update timestamp", "format": "date-time", "type": "string" }, "user": { "description": "User information", "properties": { "email": { "description": "User email", "type": "string" }, "employee": { "description": "Employee information", "properties": { "identifier": { "description": "Enterprise employee ID", "type": "string" } }, "required": [ "identifier" ], "type": "object" }, "identifier": { "description": "Unique user identifier", "type": "string" } }, "required": [ "identifier", "email", "employee" ], "type": "object" } }, "required": [ "identifier", "score", "proficiency_level", "source", "created_at", "updated_at", "domain", "skill_ratings", "user" ], "title": "V2ScoreResponse", "type": "object" }, "AmbientPrivacyResponse": { "description": "Consumer accounts always return the fixed Personal compatibility state with\nzero counts. Enterprise accounts return their effective tier, raw override,\ncompany policy, and current server-side score counts.\n", "example": { "company": { "default_tier": "personal", "k_anonymity_threshold": 5, "min_tier": "personal" }, "email": "learner@example.com", "name": null, "override": null, "server_data": { "anonymous_score_rows": 0, "daily_score_rows": 0 }, "set_at": null, "tier": "personal" }, "properties": { "company": { "properties": { "default_tier": { "enum": [ "personal", "anonymous", "visible" ], "type": "string" }, "k_anonymity_threshold": { "minimum": 1, "type": "integer" }, "min_tier": { "enum": [ "personal", "anonymous", "visible" ], "type": "string" } }, "required": [ "default_tier", "min_tier", "k_anonymity_threshold" ], "type": "object" }, "email": { "description": "Authenticated account email", "type": "string" }, "name": { "description": "Authenticated account name", "nullable": true, "type": "string" }, "override": { "description": "Raw account override; null means the company default applies", "enum": [ "personal", "anonymous", "visible" ], "nullable": true, "type": "string" }, "server_data": { "properties": { "anonymous_score_rows": { "minimum": 0, "type": "integer" }, "daily_score_rows": { "minimum": 0, "type": "integer" } }, "required": [ "daily_score_rows", "anonymous_score_rows" ], "type": "object" }, "set_at": { "description": "When the raw account override was last set", "format": "date_time", "nullable": true, "type": "string" }, "tier": { "description": "Effective privacy tier", "enum": [ "personal", "anonymous", "visible" ], "type": "string" } }, "required": [ "tier", "name", "email", "override", "set_at", "company", "server_data" ], "title": "AmbientPrivacyResponse", "type": "object" }, "AmbientMissionCompletionResponse": { "description": "Acknowledges the first mission completion or an idempotent repeat without replacing it.", "example": { "already_completed": true, "success": true }, "properties": { "already_completed": { "description": "True when the mission was already completed before this request", "type": "boolean" }, "success": { "description": "Always true for an accepted completion", "type": "boolean" } }, "required": [ "success" ], "title": "AmbientMissionCompletionResponse", "type": "object" }, "AmbientLoginVerifyResponse": { "description": "A verified sign-in: a fresh per-device token pair plus identity", "example": { "access_token": "amb_at_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "account_type": "consumer", "email": "learner@example.com", "expires_in": 3600, "refresh_token": "amb_rt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "selected_skill_area_slugs": [], "status": "signed_in", "token_type": "Bearer" }, "properties": { "access_token": { "description": "Short-lived `amb_at_` access token", "type": "string" }, "account_type": { "description": "The persisted account type used to select personal or enterprise UX", "enum": [ "consumer", "enterprise" ], "type": "string" }, "email": { "description": "The signed-in email", "type": "string" }, "expires_in": { "description": "Access-token lifetime in seconds", "type": "integer" }, "refresh_token": { "description": "Single-use `amb_rt_` refresh token for rotating the pair", "type": "string" }, "selected_skill_area_slugs": { "description": "Skill-area slugs covered by active program enrollments", "items": { "type": "string" }, "type": "array" }, "status": { "description": "Always \"signed_in\"", "type": "string" }, "token_type": { "description": "Always \"Bearer\"", "type": "string" } }, "title": "AmbientLoginVerifyResponse", "type": "object" }, "DomainListResponse": { "description": "Response schema for a list of capabilities", "example": { "data": [ { "assessment_url": "domain/8b65714c-ba23-41bc-97bc-0305fdff53e5", "created_at": "2024-01-01T01:01:01Z", "description": "In this sample capability, we will learn about...", "identifier": "8b65714c-ba23-41bc-97bc-0305fdff53e5", "industry": "Cosmetics", "is_shared": false, "is_signature_domain": true, "languages": [ "en_US", "ger_DE" ], "sources": [ { "id": "01945a0c-1234-7000-8000-000000000001", "label": null, "type": "baseline" } ], "status": "LIVE", "title": "A sample capability", "updated_at": "2024-02-01T01:01:01Z" } ], "has_more": false, "next_page": null }, "properties": { "data": { "description": "List of capabilities", "items": { "$ref": "#/components/schemas/DomainResponse" }, "type": "array" }, "has_more": { "description": "indicates pagination can be used to retrieve more capabilities", "type": "boolean" }, "next_page": { "description": "URL to the next page of the paginated capabilities", "nullable": true, "type": "string" } }, "required": [ "data", "has_more", "next_page" ], "title": "DomainListResponse", "type": "object" } }, "securitySchemes": { "authorization": { "scheme": "bearer", "type": "http" } } }, "info": { "description": "# API Documentation\n\n_Hello and welcome to the Workera API!_\n\nThis documentation is designed to provide you with all the information you need to effectively integrate and interact with our services.\n\nThe Workera API is organized around REST. Our API has task-oriented URLs, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.\n\nString values in API responses are returned with HTML entities decoded. Names and other free-text fields are HTML-escaped when stored, and the API reverses that escaping once at the response boundary, so a capability stored as `Bob's Skill` is returned as `Bob's Skill`. Decoding is single-pass: a value that legitimately contains literal entity text (for example `&`) is decoded exactly once (to `&`).\n\nThe API key you use to authenticate the request is tied to a Workera company and is currently only available upon request.\n\nThe base URL of the API is: https://skills.workera.ai/api/v1/ and https://skills.workera.ai/api/v2/\n\n## Scores and self-ratings\n\nScores and self-ratings are served under `https://skills.workera.ai/api/v2/`. They use the same authentication, rate limiting, pagination, and error handling as the rest of the API.\n\n### Endpoints\n\n| Method | URL | Description |\n| ------ | ------------------------------------------ | --------------------------------------------------- |\n| GET | `/api/v2/scores` | List all scores (supports `?source=` filter) |\n| GET | `/api/v2/scores/{score_identifier}` | Get a single score by identifier |\n| GET | `/api/v2/users/{user_identifier}/scores` | List scores for a user (supports `?domain=` filter) |\n| GET | `/api/v2/self-ratings` | List all self-ratings |\n| GET | `/api/v2/self-ratings/{rating_identifier}` | Get a single self-rating by identifier |\n\nAll list endpoints support the same `limit`, `next_page_after`, and `order` pagination parameters as the rest of the API.\n\n#### Score response fields\n\nEach score returned by the scores endpoints includes a top-level `initiative_type`:\n\n- **initiative_type**: Initiative type of the program the score was produced under (attributed via the score's assessment), or `null` for standalone/program-less scores. One of `\"skills_evaluation\"`, `\"skills_growth\"`, `\"limited_disclosure\"`, or `\"benchmark\"`. `skills_evaluation` is the canonical high-stakes type; consumers decide which types they treat as high-stakes. This is distinct from `domain.program_identifiers`, which lists every program the learner has the capability assigned through.\n\n## Authentication\n\nThe Workera API uses API keys to authenticate requests.\n\nAPI keys are tied to your organization on Workera and only available for enterprise customers. To receive an API key, contact your Workera CSM.\n\nAPI keys can be restricted by scope. Endpoints that require a scope return a 403 if the scope is missing.\n\nAll API requests must be made authenticated and sent over HTTPS.\n\nTo use the API key, pass an `authorization` header with the content `Bearer YOUR_KEY` with every request towards the API.\n\nExample (curl):\n\n```bash\ncurl -H \"Content-Type: application/json\" -H \"authorization: Bearer YOUR_KEY\" https://skills.workera.ai/api/v1/ping\n```\n\n## Errors\n\nThe Workera API uses HTTP response codes to indicate the success or failure of an API request. In general, codes in the `200` range indicate success. Codes in the `400` range indicate an error that failed given the information provided (e.g., authentication failed, a required parameter was omitted, etc.). Codes in the `500` range indicate an error within the API which cannot be solved by providing different parameters or input.\n\nBesides the status code, the API also returns an error object in the body of the response:\n\n```json\n{\n \"code\": \"resource_missing\",\n \"message\": \"User not found\",\n \"type\": \"invalid_request_error\"\n}\n```\n\nThe fields `code` and `type` are meant for machine processing and error logging, while the `message` is a human-readable text. This can be used either in front-end error messages or logs.\n\n## Rate limiting\n\nThe Workera API uses rate limiting per API key to prevent resource clogging. Each response has the following headers:\n\n- `x-ratelimit-limit`: The maximum amount of request in this rate limit window\n- `x-ratelimit-remaining`: The remaining amount of requests in this rate limit window\n- `x-ratelimit-reset`: The remaining number of seconds until the request count is set to 0 and the remaining number of requests is set to the limit for this rate limit window.\n\nWorkera does not guarantee any amount of requests and might adjust limits for the next rate limit window at any point in time.\n\nRequests should be made until the remaining counter is at 0 and then wait until the seconds indicated by the reset are reached before continuing.\n\nClients who have exhausted their requests in a given window receive an error 429.\n\n## Pagination\n\nThe Workera API returns lists of objects using pagination. Endpoints that use pagination take the parameters `next_page_after` and `limit`, indicating the cursor start position and the number of objects returned.\n\nThe `limit` parameter is optional and defaults to 10. The maximum value for `limit` is 100.\n\nThe `next_page_after` cursor must be in the same format as the field the sorting is happening on.\n\nResponses from endpoints that support pagination contain two additional fields, `has_more` and `next_page`. The former indicates if more objects can be obtained, and `next_page` contains the absolute URL to request the next page.\n\n## Webhooks\n\nWorkera can send webhook events to notify your application when certain events occur in your account. Webhooks are particularly useful for asynchronous events like when a user completes an assessment.\n\n### Setting Up Webhooks\n\nWebhook endpoints are configured per company through your Workera CSM. Each webhook configuration specifies:\n\n- **URL**: The endpoint where we'll send the HTTP POST request\n- **Event Type**: The type of events you want to receive (e.g., `score_updated`, `assessment_started`, `assessment_completed`, `program_completed`, `self_score_completed`, `appeal_approved`)\n- **Secret**: A shared secret for verifying webhook authenticity\n\n### Webhook Security\n\nEach webhook request includes a signature in the `X-Workera-Signature` header. This signature is generated using HMAC-SHA256 with your webhook secret and the request body. You should verify this signature to ensure the request came from Workera.\n\nExample verification (Node.js):\n\n```javascript\nconst crypto = require(\"crypto\");\n\nfunction verifyWebhookSignature(body, signature, secret) {\n const expectedSignature = crypto\n .createHmac(\"sha256\", secret)\n .update(body)\n .digest(\"hex\");\n\n return signature === `sha256=${expectedSignature}`;\n}\n```\n\n### Retry Policy\n\nIf your endpoint returns a non-2xx status code, Workera will retry the webhook delivery:\n\n- Immediate retry\n- After 1 minute\n- After 5 minutes\n- After 15 minutes\n- After 1 hour\n\nAfter 5 failed attempts, we'll stop retrying and send a notification email to your configured contact.\n\n### Score Updated Webhook\n\nThe `score_updated` webhook is sent when a user completes an assessment that generates a new proficiency score. This includes both baseline assessments and skill boost sessions.\n\n**Event Type**: `score_updated`\n\n**When Triggered**:\n\n- User completes a baseline assessment (single capability assessment)\n- User completes a skill boost session and achieves score improvement\n\n**Payload Structure**:\n\nThe webhook payload structure is shown in the examples below.\n\n#### Baseline Assessment Example\n\n```json\n{\n \"identifier\": \"8cc33637-628c-4f1a-aa02-d489d91d1778\",\n \"source\": \"baseline\",\n \"user\": {\n \"identifier\": \"1165714c-ba23-41bc-97bc-0305fdff53e7\",\n \"email\": \"john.doe@company.com\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\"\n },\n \"employee\": {\n \"identifier\": \"EMP12345\"\n },\n \"assessment\": {\n \"domain\": {\n \"identifier\": \"0065714c-ba23-41bc-97bc-0305fdff53aa\",\n \"name\": \"Python Programming\"\n },\n \"program_identifiers\": [\"prog-123\", \"prog-456\"],\n \"completed_at\": \"2024-01-15T10:30:00Z\"\n },\n \"results\": {\n \"domain_score\": {\n \"identifier\": \"8cc33637-628c-4f1a-aa02-d489d91d1778\",\n \"score\": 220,\n \"proficiency_level\": \"accomplished\"\n },\n \"skill_ratings\": [\n {\n \"identifier\": \"skill-001\",\n \"name\": \"Data Structures\",\n \"proficiency_level\": \"accomplished\",\n \"is_verified\": true\n },\n {\n \"identifier\": \"skill-002\",\n \"name\": \"Algorithms\",\n \"proficiency_level\": \"developing\",\n \"is_verified\": true\n }\n ]\n }\n}\n```\n\n#### Skill Progress Assessment Example\n\n```json\n{\n \"identifier\": \"9dd44748-739d-4f2b-bb03-e5aa0e2e2889\",\n \"source\": \"skill_boost\",\n \"user\": {\n \"identifier\": \"1165714c-ba23-41bc-97bc-0305fdff53e7\",\n \"email\": \"john.doe@company.com\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\"\n },\n \"employee\": {\n \"identifier\": \"EMP12345\"\n },\n \"assessment\": {\n \"domain\": {\n \"identifier\": \"0065714c-ba23-41bc-97bc-0305fdff53aa\",\n \"name\": \"Python Programming\"\n },\n \"program_identifiers\": [\"prog-123\", \"prog-456\"],\n \"completed_at\": \"2024-01-20T14:45:00Z\"\n },\n \"results\": {\n \"domain_score\": {\n \"identifier\": \"9dd44748-739d-4f2b-bb03-e5aa0e2e2889\",\n \"score\": 250,\n \"proficiency_level\": \"accomplished\"\n },\n \"skill_ratings\": [\n {\n \"identifier\": \"skill-001\",\n \"name\": \"Data Structures\",\n \"proficiency_level\": \"accomplished\",\n \"is_verified\": true\n },\n {\n \"identifier\": \"skill-002\",\n \"name\": \"Algorithms\",\n \"proficiency_level\": \"accomplished\",\n \"is_verified\": true\n }\n ]\n }\n}\n```\n\n#### Payload Fields\n\n- **identifier**: Unique identifier for the capability score\n- **source**: Either `\"baseline\"` for initial assessments or `\"skill_boost\"` for skill boost sessions\n- **user**: Information about the user who completed the assessment\n- **employee**: Enterprise employee information (required for webhook delivery)\n- **assessment**:\n - **domain**: The skill capability that was assessed\n - **program_identifiers**: List of program IDs the user is enrolled in for this capability\n - **completed_at**: ISO 8601 timestamp when the assessment was completed\n- **results**:\n - **domain_score**: Overall proficiency score for the capability (0-300 scale)\n - **skill_ratings**: Individual skill proficiency ratings within the capability\n\n### Program Completed Webhook\n\nThe `program_completed` webhook is sent when a learner reaches target scores for a program's required (non-elective) capabilities.\n\n**Event Type**: `program_completed`\n\n**When Triggered**:\n\n- A learner's latest score causes them to satisfy the program completion threshold (`total_required`) for required capabilities\n- The event is emitted once per learner per program\n\n**Payload Structure**:\n\n```json\n{\n \"event_type\": \"program_completed\",\n \"user\": {\n \"identifier\": \"1165714c-ba23-41bc-97bc-0305fdff53e7\",\n \"email\": \"john.doe@company.com\",\n \"employee\": {\n \"identifier\": \"EMP12345\"\n }\n },\n \"program\": {\n \"identifier\": \"e26dc707-6ec0-44d3-aee9-9b558ad5d77b\",\n \"name\": \"Data Engineering Foundations\",\n \"initiative_type\": \"skills_evaluation\"\n },\n \"completed_at\": \"2024-01-20T14:45:00Z\"\n}\n```\n\n#### Payload Fields\n\n- **event_type**: The webhook event type (`\"program_completed\"`)\n- **user**: User who completed the program\n - **identifier**: User identifier\n - **email**: User email\n - **employee.identifier**: Enterprise employee identifier\n- **program**:\n - **identifier**: Program identifier\n - **name**: Program name\n - **initiative_type**: Initiative type of the completed program. One of `\"skills_evaluation\"`, `\"skills_growth\"`, `\"limited_disclosure\"`, or `\"benchmark\"`. `skills_evaluation` is the canonical high-stakes type; consumers decide which types they treat as high-stakes. Always present.\n- **completed_at**: ISO 8601 timestamp when completion was reached\n\n### Assessment Started Webhook\n\nThe `assessment_started` webhook is sent once when a learner begins an assessment, at the moment the assessment is created. It is the parallel start signal to `assessment_completed`, closing the funnel gap between assigning a program or sending a deeplink and the learner finishing. Use it for enrollment confirmation, engagement nudges, and started-but-not-completed reporting.\n\n**Event Type**: `assessment_started`\n\n**When Triggered**:\n\n- User begins a baseline assessment\n- User begins a mini assessment (scoring-v2)\n- User begins a full reassessment (creates a new assessment)\n\n**Not Triggered**:\n\n- On resume of an in-progress assessment (the existing assessment is reused; no new event fires)\n- For non-enterprise learners (no resolvable enterprise employee association)\n\n**Payload Structure**:\n\n```json\n{\n \"event_type\": \"assessment_started\",\n \"assessment_identifier\": \"018f3c4a-7b21-7d9c-8a3d-5c1e2f3a4b5c\",\n \"source\": \"baseline_assessment\",\n \"started_at\": \"2024-01-15T10:30:00Z\",\n \"domain\": {\n \"identifier\": \"0065714c-ba23-41bc-97bc-0305fdff53aa\",\n \"name\": \"Python Programming\",\n \"program_identifiers\": [\"prog-123\", \"prog-456\"]\n },\n \"user\": {\n \"identifier\": \"1165714c-ba23-41bc-97bc-0305fdff53e7\",\n \"email\": \"john.doe@company.com\",\n \"employee\": {\n \"identifier\": \"EMP12345\"\n }\n }\n}\n```\n\n#### Payload Fields\n\n- **event_type**: The webhook event type (`\"assessment_started\"`)\n- **assessment_identifier**: Unique identifier for the assessment. This is a different ID space from the `identifier` field on `assessment_completed` (which is the domain score); the two do not correlate.\n- **source**: One of `\"baseline_assessment\"`, `\"mini_assessment\"`, or `\"full_reassessment\"` (same vocabulary as `assessment_completed`)\n- **started_at**: ISO 8601 timestamp when the assessment was started\n- **domain**:\n - **identifier**: Unique capability identifier\n - **name**: Capability name\n - **program_identifiers**: List of program identifiers this capability belongs to\n- **user**: Information about the user who started the assessment\n - **identifier**: User identifier\n - **email**: User email address\n - **employee.identifier**: Enterprise employee ID (required for webhook delivery)\n\n> **Note**: The field set for `assessment_started` is intentionally open, not frozen. Additional fields (for example a target score) may be added non-breakingly in a future revision, so consumers should tolerate unknown fields.\n\n### Assessment Completed Webhook\n\nThe `assessment_completed` webhook is sent when a learner completes an assessment that generates a new capability score. This is the v2 replacement for `score_updated`, using a flat payload structure with topic-level skill ratings and behaviors.\n\n**Event Type**: `assessment_completed`\n\n**When Triggered**:\n\n- User completes a baseline assessment\n- User completes a mini assessment (scoring-v2)\n- User completes a full reassessment\n\n**Payload Structure**:\n\n```json\n{\n \"event_type\": \"assessment_completed\",\n \"identifier\": \"8cc33637-628c-4f1a-aa02-d489d91d1778\",\n \"source\": \"baseline_assessment\",\n \"initiative_type\": \"skills_evaluation\",\n \"completed_at\": \"2024-01-15T10:30:00Z\",\n \"score\": 220,\n \"proficiency_level\": \"accomplished\",\n \"domain\": {\n \"identifier\": \"0065714c-ba23-41bc-97bc-0305fdff53aa\",\n \"name\": \"Python Programming\",\n \"program_identifiers\": [\"prog-123\", \"prog-456\"]\n },\n \"skill_ratings\": [\n {\n \"identifier\": \"skill-001\",\n \"name\": \"Data Structures\",\n \"rating\": 3,\n \"behaviors\": [\n { \"identifier\": \"behavior-001\", \"name\": \"Implement linked lists\" },\n { \"identifier\": \"behavior-002\", \"name\": \"Use hash maps effectively\" }\n ]\n },\n {\n \"identifier\": \"skill-002\",\n \"name\": \"Algorithms\",\n \"rating\": 4,\n \"behaviors\": []\n }\n ],\n \"user\": {\n \"identifier\": \"1165714c-ba23-41bc-97bc-0305fdff53e7\",\n \"email\": \"john.doe@company.com\",\n \"employee\": {\n \"identifier\": \"EMP12345\"\n }\n }\n}\n```\n\n#### Payload Fields\n\n- **event_type**: The webhook event type (`\"assessment_completed\"`)\n- **identifier**: Unique identifier for the domain score\n- **source**: One of `\"baseline_assessment\"`, `\"mini_assessment\"`, or `\"full_reassessment\"`\n- **initiative_type**: Initiative type of the program the assessment was taken under (attributed via the assessment's program), or `null` for standalone/program-less assessments. One of `\"skills_evaluation\"`, `\"skills_growth\"`, `\"limited_disclosure\"`, or `\"benchmark\"`. `skills_evaluation` is the canonical high-stakes type; consumers decide which types they treat as high-stakes. This is distinct from `domain.program_identifiers`, which lists every program the capability belongs to. The event always fires regardless of `initiative_type` — filtering is the consumer's choice.\n- **completed_at**: ISO 8601 timestamp when the assessment was completed\n- **score**: Proficiency score of the capability (0–300)\n- **proficiency_level**: One of `\"beginner\"`, `\"developing\"`, `\"accomplished\"`, or `\"expert\"`\n- **domain**:\n - **identifier**: Unique capability identifier\n - **name**: Capability name\n - **program_identifiers**: List of program identifiers this capability belongs to\n- **skill_ratings**: Skill-level ratings within the capability\n - **identifier**: Unique skill identifier\n - **name**: Skill name\n - **rating**: Skill rating (1–4)\n - **behaviors**: Behaviors that belong to this skill, each with an `identifier` and `name`\n- **user**: Information about the user who completed the assessment\n - **identifier**: User identifier\n - **email**: User email address\n - **employee.identifier**: Enterprise employee ID (required for webhook delivery)\n\n### Appeal Approved Webhook\n\nThe `appeal_approved` webhook is sent when a scoring appeal is approved and the learner's capability score has been updated as a result. This signals external systems to fetch updated score data after an appeal correction.\n\n**Event Type**: `appeal_approved`\n\n**When Triggered**:\n\n- A scoring appeal is approved with the question re-graded as `correct`, `partially_correct`, or `mostly_incorrect`\n\n**Not Triggered**:\n\n- When an appeal is rejected (no score change occurs)\n\n**Payload Structure**:\n\n```json\n{\n \"event_type\": \"appeal_approved\",\n \"appeal\": {\n \"identifier\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"decision\": \"correct\",\n \"reasoning\": \"The answer demonstrated correct understanding of the concept.\",\n \"user_appeal_reason\": \"I believe my answer was correct because I accounted for the edge case in the prompt.\",\n \"resolved_at\": \"2024-01-15T10:30:00Z\"\n },\n \"assessment_identifier\": \"018f3c4a-7b21-7d9c-8a3d-5c1e2f3a4b5c\",\n \"score_before_appeal\": 150,\n \"score_after_appeal\": 185,\n \"domain\": {\n \"identifier\": \"0065714c-ba23-41bc-97bc-0305fdff53aa\",\n \"name\": \"Generative AI Essentials\",\n \"program_identifiers\": [\"prog-123\"]\n },\n \"user\": {\n \"identifier\": \"1165714c-ba23-41bc-97bc-0305fdff53e7\",\n \"email\": \"john.doe@company.com\",\n \"employee\": {\n \"identifier\": \"EMP12345\"\n }\n }\n}\n```\n\n#### Payload Fields\n\n- **event_type**: The webhook event type (`\"appeal_approved\"`)\n- **appeal**: Details about the resolved appeal\n - **identifier**: Unique appeal identifier\n - **decision**: The reviewer's correctness verdict — one of `\"correct\"`, `\"partially_correct\"`, or `\"mostly_incorrect\"`\n - **reasoning**: Reviewer explanation for the decision\n - **user_appeal_reason**: Message the learner provided when filing the initial appeal\n - **resolved_at**: ISO 8601 timestamp when the appeal was resolved\n- **assessment_identifier**: Identifier of the assessment the appealed question is linked to\n- **score_before_appeal**: Capability score before the appeal correction (0–300)\n- **score_after_appeal**: Capability score after the appeal correction (0–300). Note: these represent the score delta from this appeal, not necessarily the user's current best score\n- **domain**:\n - **identifier**: Unique capability identifier\n - **name**: Capability name\n - **program_identifiers**: List of program identifiers this capability belongs to\n- **user**: Information about the user whose appeal was approved\n - **identifier**: User identifier\n - **email**: User email address\n - **employee.identifier**: Enterprise employee ID (required for webhook delivery)\n\n### Self Score Completed Webhook\n\nThe `self_score_completed` webhook is sent when a learner submits a self-assessment score for a capability via the contextualized self-assessment flow. This is distinct from `score_updated` / `assessment_completed`, which fire on objective assessment results.\n\n**Event Type**: `self_score_completed`\n\n**When Triggered**:\n\n- A learner successfully submits a self-assessment score for a capability\n\n**Not Triggered**:\n\n- For users without an enterprise employee association (silently skipped)\n- For email addresses on the company's webhook exclusion list\n\n**Payload Structure**:\n\n```json\n{\n \"event_type\": \"self_score_completed\",\n \"identifier\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"score\": 150,\n \"domain\": {\n \"identifier\": \"0065714c-ba23-41bc-97bc-0305fdff53aa\",\n \"name\": \"Python Programming\"\n },\n \"user\": {\n \"identifier\": \"1165714c-ba23-41bc-97bc-0305fdff53e7\",\n \"email\": \"john.doe@company.com\",\n \"employee\": {\n \"identifier\": \"EMP12345\"\n }\n },\n \"completed_at\": \"2024-01-15T10:30:00Z\"\n}\n```\n\n#### Payload Fields\n\n- **event_type**: The webhook event type (`\"self_score_completed\"`)\n- **identifier**: Unique self-assessment score identifier\n- **score**: Self-assessment score (1–300)\n- **domain**:\n - **identifier**: Unique capability identifier\n - **name**: Capability name\n- **user**:\n - **identifier**: User identifier\n - **email**: User email address\n - **employee.identifier**: Enterprise employee ID (required for webhook delivery)\n- **completed_at**: ISO 8601 timestamp when the self-assessment score was submitted\n\n### Webhook Implementation Tips\n\n1. **Idempotency**: Use the `identifier` field to ensure you don't process the same score update multiple times\n2. **Async Processing**: Respond with a 2xx status code quickly, then process the webhook data asynchronously\n3. **Source Differentiation**: Use the `source` field to handle baseline vs skill progress events differently if needed\n4. **Error Handling**: Implement proper error handling and logging for webhook processing failures\n\n### Testing Webhooks\n\nYou can fetch score data via the REST API to test your processing logic or retrieve missed webhook data:\n\n```\nGET /api/v2/scores/{score_identifier}\n```\n\nThis returns the flat, topic-level score shape used by the `assessment_completed` webhook.\n\n## Audit Events\n\nThe Audit Events API provides SIEM-compatible access to enterprise audit logs. This endpoint allows security teams to pull audit events for compliance monitoring, security analysis, and integration with SIEM platforms. It requires the `audit_events` scope.\n\n### Endpoint\n\n```\nGET /api/v1/audit_events\n```\n\n### Query Parameters\n\n| Parameter | Type | Description |\n| ----------------- | ----------------- | ---------------------------------------------------------- |\n| `from` | ISO 8601 datetime | Filter events from this timestamp (inclusive) |\n| `to` | ISO 8601 datetime | Filter events to this timestamp (exclusive) |\n| `action` | string | Filter by action type (e.g., `auth.login`, `user.created`) |\n| `actor_id` | UUID | Filter by actor ID |\n| `target_type` | string | Filter by target type (e.g., `user`, `program`) |\n| `target_id` | string | Filter by target ID |\n| `limit` | integer | Number of results to return (default: 50, max: 100) |\n| `next_page_after` | ISO 8601 datetime | Cursor for pagination |\n| `order` | string | Sort order: `asc` or `desc` (default: `desc`) |\n\n### Response\n\n```json\n{\n \"data\": [\n {\n \"id\": \"01936e0a-1234-7000-8000-000000000001\",\n \"action\": \"auth.login\",\n \"actor_id\": \"462db21e-618d-4211-931a-9c5c43522e65\",\n \"actor_type\": \"user\",\n \"actor_enterprise_id\": \"EMP12345\",\n \"targets\": [\n { \"type\": \"user\", \"id\": \"462db21e-618d-4211-931a-9c5c43522e65\" }\n ],\n \"location\": \"192.168.1.1\",\n \"user_agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)\",\n \"request_id\": \"FwK2X3Pg_qUABB4AAABI\",\n \"session_id\": \"abc123def456\",\n \"metadata\": {},\n \"created_at\": \"2026-01-10T14:30:00Z\"\n }\n ],\n \"has_more\": true,\n \"next_page\": \"https://skills.workera.ai/api/v1/audit_events?limit=50&next_page_after=2026-01-10T14:30:00Z&order=desc\"\n}\n```\n\n### Response Fields\n\n| Field | Type | Description |\n| --------------------- | ------ | ------------------------------------------------------------------ |\n| `id` | UUID | Unique identifier for the audit event (UUIDv7) |\n| `action` | string | The action that was performed (e.g., `auth.login`, `user.created`) |\n| `actor_id` | UUID | Identifier of the actor who performed the action |\n| `actor_type` | string | Type of actor: `user`, `admin`, `api_key`, or `system` |\n| `actor_enterprise_id` | string | Enterprise employee ID for SIEM correlation |\n| `targets` | array | List of entities affected by the action |\n| `location` | string | IP address of the request origin |\n| `user_agent` | string | User agent string from the request |\n| `request_id` | string | Request ID for correlation with application logs |\n| `session_id` | string | Session ID for tracking user sessions |\n| `metadata` | object | Additional event-specific data (PII-safe) |\n| `created_at` | string | ISO 8601 timestamp when the event occurred |\n\n### Action Types\n\nAudit events use a `{domain}.{action}` naming convention:\n\n**Authentication Events:**\n\n- `auth.login` - User logged in\n- `auth.login_failed` - Failed login attempt\n- `auth.logout` - User logged out\n- `auth.password_reset_requested` - Password reset requested\n- `auth.password_reset_completed` - Password reset completed\n- `auth.mfa_setup` - MFA was set up\n- `auth.mfa_verified` - MFA verification completed\n- `auth.account_locked` - Account was locked\n\n**User/Admin Events:**\n\n- `user.created` - User account created\n- `user.deactivated` - User account deactivated\n- `user.role_changed` - User role was changed\n- `admin.impersonation_started` - Admin started impersonating a user\n- `admin.impersonation_ended` - Admin stopped impersonating a user\n\n**Data Events:**\n\n- `data.exported` - Data was exported\n- `data.sensitive_read` - Sensitive data was accessed\n- `data.bulk_updated` - Bulk data update performed\n\n**API Events:**\n\n- `api.auth_failed` - API authentication failed\n- `api.rate_limited` - API request was rate limited\n- `api.key_created` - API key was created\n- `api.key_revoked` - API key was revoked\n\n**Program Events:**\n\n- `program.created` - Program was created\n- `program.launched` - Program was launched\n- `program.updated` - Program was updated\n- `program.deleted` - Program was deleted\n- `program.learner_added` - Learner was added to program\n- `program.learner_removed` - Learner was removed from program\n\n**Configuration Events:**\n\n- `config.updated` - System configuration was changed\n\n### Example: Filtering by Date Range\n\n```bash\ncurl -H \"authorization: Bearer YOUR_KEY\" \\\n \"https://skills.workera.ai/api/v1/audit_events?from=2026-01-01T00:00:00Z&to=2026-01-02T00:00:00Z\"\n```\n\n### Example: Filtering by Action Type\n\n```bash\ncurl -H \"authorization: Bearer YOUR_KEY\" \\\n \"https://skills.workera.ai/api/v1/audit_events?action=auth.login\"\n```\n\n### Example: Pagination\n\n```bash\n# First page\ncurl -H \"authorization: Bearer YOUR_KEY\" \\\n \"https://skills.workera.ai/api/v1/audit_events?limit=100\"\n\n# Next page (use next_page URL from response, or extract cursor)\ncurl -H \"authorization: Bearer YOUR_KEY\" \\\n \"https://skills.workera.ai/api/v1/audit_events?limit=100&next_page_after=2026-01-10T14:30:00Z\"\n```\n\n### SIEM Integration\n\nThe audit events API is designed for SIEM integration:\n\n1. **Polling**: Configure your SIEM to poll the endpoint periodically (e.g., every minute)\n2. **Cursor Tracking**: Store the `created_at` of the last processed event as your cursor\n3. **Enterprise ID Correlation**: Use `actor_enterprise_id` to correlate with your HR system\n4. **Request Tracing**: Use `request_id` to correlate with application logs\n", "title": "Workera API", "version": "1.0" }, "openapi": "3.0.0", "paths": { "/api/v1/audit_events": { "get": { "callbacks": {}, "description": "Returns a paginated list of audit events for SIEM integration. Requires the audit_events scope. Events are scoped to the company associated with the API token.", "operationId": "WorkeraWebappsWeb.Rest.Controllers.AuditEventsController.index", "parameters": [ { "description": "Filter events from this timestamp (inclusive)", "in": "query", "name": "from", "required": false, "schema": { "format": "date-time", "type": "string" } }, { "description": "Filter events to this timestamp (exclusive)", "in": "query", "name": "to", "required": false, "schema": { "format": "date-time", "type": "string" } }, { "description": "Filter by action (e.g., auth.login, user.created)", "in": "query", "name": "action", "required": false, "schema": { "type": "string" } }, { "description": "Filter by actor ID", "in": "query", "name": "actor_id", "required": false, "schema": { "format": "uuid", "type": "string" } }, { "description": "Filter by target type (e.g., user, program)", "in": "query", "name": "target_type", "required": false, "schema": { "type": "string" } }, { "description": "Filter by target ID", "in": "query", "name": "target_id", "required": false, "schema": { "type": "string" } }, { "description": "Cursor value for pagination. Returns results with `created_at` after this timestamp when order is `asc`, or before this timestamp when order is `desc`. Format: ISO 8601 datetime", "example": "2024-09-25T00:00:00Z", "in": "query", "name": "next_page_after", "required": false, "schema": { "type": "string" } }, { "description": "The number of results to return per page. Allowed values: `1` to `100` **Default**: `10`", "example": 10, "in": "query", "name": "limit", "required": false, "schema": { "type": "integer" } }, { "description": "The order in which the result data is sorted by, using the `created_at` field. Allowed values: `asc`, `desc`. **Default**: `desc`", "example": "asc", "in": "query", "name": "order", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AuditEventListResponse" } } }, "description": "A paginated list of audit events", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Invalid request parameters" }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "List audit events", "tags": [ "Audit Events" ] } }, "/api/v1/benchmarks": { "get": { "callbacks": {}, "operationId": "WorkeraWebappsWeb.Rest.Controllers.BenchmarkController.all", "parameters": [ { "description": "Comma-separated list of capability identifiers to filter the benchmark data", "example": "8b65714c-ba23-41bc-97bc-0305fdff53f5,\n 0065714c-ba23-41bc-97bc-0305fdff53aa", "in": "query", "name": "domain_identifiers", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BenchmarkListResponse" } } }, "description": "A list of benchmarks", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get benchmarks for all capabilities", "tags": [ "Benchmarks" ] }, "post": { "callbacks": {}, "operationId": "WorkeraWebappsWeb.Rest.Controllers.BenchmarkController.enterprise", "parameters": [ { "description": "List of capability identifiers to get the benchmark data", "example": [ "8b65714c-ba23-41bc-97bc-0305fdff53f5", "0065714c-ba23-41bc-97bc-0305fdff53aa" ], "in": "body", "name": "domain_identifiers", "required": false, "schema": { "type": "array" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BenchmarkListResponse" } } }, "description": "A list of capabilities and their enterprise benchmark data", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "List general enterprise benchmark data", "tags": [ "Benchmarks" ] } }, "/api/v1/benchmarks/{identifier}": { "get": { "callbacks": {}, "operationId": "WorkeraWebappsWeb.Rest.Controllers.BenchmarkController.one", "parameters": [], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/BenchmarkResponse" } } }, "description": "One benchmark", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get benchmarks for one capability", "tags": [ "Benchmarks" ] } }, "/api/v1/domains": { "get": { "callbacks": {}, "operationId": "WorkeraWebappsWeb.Rest.Controllers.DomainController.all", "parameters": [ { "description": "Cursor value for pagination. Returns results with `updated_at` after this timestamp when order is `asc`, or before this timestamp when order is `desc`. Format: ISO 8601 datetime", "example": "2024-09-25T00:00:00Z", "in": "query", "name": "next_page_after", "required": false, "schema": { "type": "string" } }, { "description": "The number of results to return per page. Allowed values: `1` to `100` **Default**: `10`", "example": 10, "in": "query", "name": "limit", "required": false, "schema": { "type": "integer" } }, { "description": "The order in which the result data is sorted by, using the `updated_at` field. Allowed values: `asc`, `desc`. **Default**: `desc`", "example": "asc", "in": "query", "name": "order", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DomainListResponse" } } }, "description": "A list of capabilities", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get all capabilities", "tags": [ "Domains", "Capability" ] } }, "/api/v1/domains/{identifier}": { "get": { "callbacks": {}, "operationId": "WorkeraWebappsWeb.Rest.Controllers.DomainController.one", "parameters": [], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DomainResponse" } } }, "description": "One capability", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get one capability", "tags": [ "Domains", "Capability" ] } }, "/api/v1/domains/{identifier}/competency-model": { "get": { "callbacks": {}, "operationId": "WorkeraWebappsWeb.Rest.Controllers.DomainController.competency_model", "parameters": [], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CompetencyModelExportResponse" } } }, "description": "The capability's full competency model tree", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Export a capability's competency model", "tags": [ "Domains", "Capability" ] } }, "/api/v1/ping": { "get": { "callbacks": {}, "operationId": "WorkeraWebappsWeb.Rest.Controllers.PingController.ping", "parameters": [], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PongResponse" } } }, "description": "Pong", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "returns a pong", "tags": [ "Ping" ] } }, "/api/v1/programs": { "get": { "callbacks": {}, "operationId": "WorkeraWebappsWeb.Rest.Controllers.ProgramController.all", "parameters": [ { "description": "Filter by program status. Allowed: live | draft", "in": "query", "name": "status", "required": false, "schema": { "enum": [ "live", "draft" ], "type": "string" } }, { "description": "Cursor value for pagination. Returns results with `updated_at` after this timestamp when order is `asc`, or before this timestamp when order is `desc`. Format: ISO 8601 datetime", "example": "2024-09-25T00:00:00Z", "in": "query", "name": "next_page_after", "required": false, "schema": { "type": "string" } }, { "description": "The number of results to return per page. Allowed values: `1` to `100` **Default**: `10`", "example": 10, "in": "query", "name": "limit", "required": false, "schema": { "type": "integer" } }, { "description": "The order in which the result data is sorted by, using the `updated_at` field. Allowed values: `asc`, `desc`. **Default**: `desc`", "example": "asc", "in": "query", "name": "order", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProgramListResponse" } } }, "description": "A list of programs", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get all programs (including drafts)", "tags": [ "Programs" ] } }, "/api/v1/programs/{identifier}": { "get": { "callbacks": {}, "operationId": "WorkeraWebappsWeb.Rest.Controllers.ProgramController.one", "parameters": [], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProgramResponse" } } }, "description": "One Program", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get one program", "tags": [ "Programs" ] } }, "/api/v2/scores": { "get": { "callbacks": {}, "description": "Returns paginated assessment scores across all users in the company. Each score\nincludes the capability, proficiency level, score value (0-300), rating (1-4), source,\nand skill-level ratings with behaviors.\n\nUse the optional `source` query parameter to control which scores are returned.\n`latest` (the default) returns only the latest score per user and capability,\n`all` returns the full series of scoring events (e.g. baseline plus every\nreassessment) for progression tracking, and `baseline_assessment`,\n`mini_assessment` or `full_reassessment` return the latest score of that\nassessment type.\n", "operationId": "WorkeraWebappsWeb.Rest.Controllers.V2.ScoresController.index", "parameters": [ { "description": "Which scores to return (defaults to `latest`)", "in": "query", "name": "source", "required": false, "schema": { "enum": [ "latest", "all", "baseline_assessment", "mini_assessment", "full_reassessment" ], "type": "string" } }, { "description": "Cursor value for pagination. Returns results with `created_at` after this timestamp when order is `asc`, or before this timestamp when order is `desc`. Format: ISO 8601 datetime", "example": "2024-09-25T00:00:00Z", "in": "query", "name": "next_page_after", "required": false, "schema": { "type": "string" } }, { "description": "The number of results to return per page. Allowed values: `1` to `100` **Default**: `10`", "example": 10, "in": "query", "name": "limit", "required": false, "schema": { "type": "integer" } }, { "description": "The order in which the result data is sorted by, using the `created_at` field. Allowed values: `asc`, `desc`. **Default**: `desc`", "example": "asc", "in": "query", "name": "order", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/V2ScoreListResponse" } } }, "description": "A list of assessment scores", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get all scores", "tags": [ "Scores" ] } }, "/api/v2/scores/{score_identifier}": { "get": { "callbacks": {}, "description": "Returns a single assessment score by its identifier, including the capability,\nproficiency level, score value (0-300), source, and skill-level ratings\nwith behaviors.\n", "operationId": "WorkeraWebappsWeb.Rest.Controllers.V2.ScoresController.show", "parameters": [ { "description": "Score identifier", "in": "path", "name": "score_identifier", "required": true, "schema": { "format": "uuid", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/V2ScoreResponse" } } }, "description": "Assessment score detail", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Not found" }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get detailed score", "tags": [ "Scores" ] } }, "/api/v2/self-ratings": { "get": { "callbacks": {}, "description": "Returns paginated self-assessment ratings across all users in the company.\nEach rating includes the capability, score, and user with employee information.\n", "operationId": "WorkeraWebappsWeb.Rest.Controllers.V2.SelfRatingsController.index", "parameters": [ { "description": "Cursor value for pagination. Returns results with `created_at` after this timestamp when order is `asc`, or before this timestamp when order is `desc`. Format: ISO 8601 datetime", "example": "2024-09-25T00:00:00Z", "in": "query", "name": "next_page_after", "required": false, "schema": { "type": "string" } }, { "description": "The number of results to return per page. Allowed values: `1` to `100` **Default**: `10`", "example": 10, "in": "query", "name": "limit", "required": false, "schema": { "type": "integer" } }, { "description": "The order in which the result data is sorted by, using the `created_at` field. Allowed values: `asc`, `desc`. **Default**: `desc`", "example": "asc", "in": "query", "name": "order", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/V2SelfRatingListResponse" } } }, "description": "A list of self-ratings", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get all self-ratings", "tags": [ "Self Ratings" ] } }, "/api/v2/self-ratings/{rating_identifier}": { "get": { "callbacks": {}, "description": "Returns a single self-assessment rating by its identifier, including the\ncapability, score, and user with employee information.\n", "operationId": "WorkeraWebappsWeb.Rest.Controllers.V2.SelfRatingsController.show", "parameters": [ { "description": "Self-rating identifier", "in": "path", "name": "rating_identifier", "required": true, "schema": { "format": "uuid", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/V2SelfRatingResponse" } } }, "description": "Self-rating detail", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Not found" }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get detailed self-rating", "tags": [ "Self Ratings" ] } }, "/api/v2/users/{user_identifier}/scores": { "get": { "callbacks": {}, "description": "Returns paginated assessment scores for a specific user. Each score includes\nthe capability, proficiency level, score value (0-300), rating (1-4), source\n(baseline_assessment, mini_assessment, or full_reassessment), and skill-level\nratings with behaviors.\n\nUse the optional `domain` query parameter to filter results to a single capability.\n", "operationId": "WorkeraWebappsWeb.Rest.Controllers.V2.UserScoresController.index", "parameters": [ { "description": "User identifier", "in": "path", "name": "user_identifier", "required": true, "schema": { "format": "uuid", "type": "string" } }, { "description": "Filter by capability identifier", "in": "query", "name": "domain", "required": false, "schema": { "format": "uuid", "type": "string" } }, { "description": "Cursor value for pagination. Returns results with `created_at` after this timestamp when order is `asc`, or before this timestamp when order is `desc`. Format: ISO 8601 datetime", "example": "2024-09-25T00:00:00Z", "in": "query", "name": "next_page_after", "required": false, "schema": { "type": "string" } }, { "description": "The number of results to return per page. Allowed values: `1` to `100` **Default**: `10`", "example": 10, "in": "query", "name": "limit", "required": false, "schema": { "type": "integer" } }, { "description": "The order in which the result data is sorted by, using the `created_at` field. Allowed values: `asc`, `desc`. **Default**: `desc`", "example": "asc", "in": "query", "name": "order", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/V2ScoreListResponse" } } }, "description": "A list of assessment scores", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request has to be authenticated to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Request is not authorized to access this resource", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 10", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Not found" }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }, "description": "Rate limit has been reached", "headers": { "x-ratelimit-limit": { "description": "The maximum amount of request within the rate limit window", "example": "x-ratelimit-limit: 100", "style": "simple" }, "x-ratelimit-remaining": { "description": "The remaining amount of request within the rate limit window", "example": "x-ratelimit-remaining: 0", "style": "simple" }, "x-ratelimit-reset": { "description": "The amount of seconds until the rate limit window resets and the remaining amount of requests is reset to the maximum amount of requests", "example": "x-ratelimit-reset: 10", "style": "simple" } } } }, "summary": "Get scores for a user", "tags": [ "Scores" ] } } }, "security": [ { "authorization": [] } ], "servers": [ { "url": "https://skills.workera.ai", "variables": {} } ], "tags": [] }