{"openapi":"3.0.3","info":{"title":"Eleva by Accuracy Public API","version":"1.0.0","description":"API pública versionada para integrações com HRIS, BI, SCIM e parceiros. Autenticação via API key gerada em /backoffice/[slug]/integrations.","contact":{"name":"Suporte Accuracy","email":"suporte@accuracy.com.br"}},"servers":[{"url":"https://eleva.accuracy.com.br/api/v1","description":"Produção"}],"security":[{"ApiKeyAuth":[]}],"paths":{"/public":{"get":{"summary":"Endpoint multi-resource","description":"Aponte com `?resource=courses|users|enrollments|stats|bi_events|dictionary`. Retorna paginado (50 default, max 500). Rate limit: 60 req/min por chave. Escopos legados `read`/`all` continuam validos; novas chaves podem usar escopos granulares `public:{resource}:read`.","x-eleva-required-scopes":{"courses":["public:courses:read","read","all"],"users":["public:users:read","read","all"],"enrollments":["public:enrollments:read","read","all"],"stats":["public:stats:read","read","all"],"bi_events":["public:bi_events:read","read","all"],"dictionary":["public:dictionary:read","read","all"]},"parameters":[{"name":"resource","in":"query","required":true,"schema":{"type":"string","enum":["courses","users","enrollments","stats","bi_events","dictionary"]},"description":"Tipo de recurso"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1},"description":"Página (1-based)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"maximum":500},"description":"Itens por página"},{"name":"since","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Cursor incremental ISO 8601 (resource=bi_events)"},{"name":"courseId","in":"query","required":false,"schema":{"type":"string"},"description":"Filtro (só resource=enrollments)"},{"name":"userId","in":"query","required":false,"schema":{"type":"string"},"description":"Filtro (só resource=enrollments)"},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"Filtro (só resource=enrollments)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse"}}}},"401":{"description":"API key inválida ou expirada"},"403":{"description":"Escopo insuficiente. Use `read`, `all` ou o escopo granular `public:{resource}:read`."},"429":{"description":"Rate limit excedido (60 req/min/key)","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp ms quando o limite reseta"}}}}}},"/scim/v2/ServiceProviderConfig":{"get":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Service Provider Config","description":"Informa capacidades SCIM suportadas. Bulk esta habilitado para Users com limite de 20 operacoes e 1 MB por requisicao; Groups permanecem read-only.","responses":{"200":{"description":"Configuração SCIM","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimServiceProviderConfig"}}}},"401":{"description":"API key inválida ou expirada"},"403":{"description":"Escopo insuficiente"}}}},"/scim/v2/Bulk":{"post":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Bulk","description":"Executa lote SCIM com `POST /Users`, `GET/PATCH/DELETE /Users/{id}` e erro 501 para mutacoes em Groups. Limites: 20 operacoes e 1 MB de payload.","requestBody":{"required":true,"content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimBulkRequest"}}}},"responses":{"200":{"description":"BulkResponse com status por operacao","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimBulkResponse"}}}},"400":{"description":"BulkRequest invalido ou operacao nao suportada"},"401":{"description":"API key inválida ou expirada"},"403":{"description":"Escopo insuficiente"},"413":{"description":"Limite de operacoes ou payload excedido"}}}},"/scim/v2/ResourceTypes":{"get":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Lista ResourceTypes","responses":{"200":{"description":"ResourceTypes SCIM","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimListResponse"}}}},"401":{"description":"API key inválida ou expirada"}}}},"/scim/v2/ResourceTypes/{id}":{"get":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Obtém ResourceType","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","enum":["User","Group"]}}],"responses":{"200":{"description":"ResourceType SCIM","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimResourceType"}}}},"404":{"description":"ResourceType não encontrado"}}}},"/scim/v2/Schemas":{"get":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Lista Schemas","responses":{"200":{"description":"Schemas SCIM","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimListResponse"}}}},"401":{"description":"API key inválida ou expirada"}}}},"/scim/v2/Schemas/{id}":{"get":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Obtém Schema","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Schema SCIM","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimSchema"}}}},"404":{"description":"Schema não encontrado"}}}},"/scim/v2/Groups":{"get":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Lista grupos","description":"Lista departamentos do tenant como SCIM Groups read-only. Suporta `filter=displayName eq \"Departamento\"`, `startIndex` e `count`.","parameters":[{"name":"filter","in":"query","required":false,"schema":{"type":"string"},"description":"Filtro SCIM suportado: displayName eq \"Departamento\""},{"name":"startIndex","in":"query","required":false,"schema":{"type":"integer","default":1},"description":"Índice inicial 1-based"},{"name":"count","in":"query","required":false,"schema":{"type":"integer","default":100,"maximum":500},"description":"Itens por página"}],"responses":{"200":{"description":"ListResponse SCIM","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimListResponse"}}}},"401":{"description":"API key inválida ou expirada"},"403":{"description":"Escopo insuficiente"}}},"post":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Criação de grupos não suportada","responses":{"501":{"description":"Groups read-only; use backoffice ou HRIS worker governado"}}}},"/scim/v2/Users":{"get":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Lista usuários","description":"Lista usuários do tenant da API key. Suporta `filter=userName eq \"email\"`, `startIndex` e `count`.","parameters":[{"name":"filter","in":"query","required":false,"schema":{"type":"string"},"description":"Filtro SCIM suportado: userName eq \"email\""},{"name":"startIndex","in":"query","required":false,"schema":{"type":"integer","default":1},"description":"Índice inicial 1-based"},{"name":"count","in":"query","required":false,"schema":{"type":"integer","default":100,"maximum":500},"description":"Itens por página"}],"responses":{"200":{"description":"ListResponse SCIM","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimListResponse"}}}},"401":{"description":"API key inválida ou expirada"},"403":{"description":"Escopo insuficiente"}}},"post":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Cria usuário","description":"Provisiona usuário student no tenant da API key e vincula user_tenants.","requestBody":{"required":true,"content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimCreateUser"}}}},"responses":{"201":{"description":"Usuário criado","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimUser"}}}},"401":{"description":"API key inválida ou expirada"},"403":{"description":"Escopo insuficiente"},"409":{"description":"Usuário já existe no tenant"}}}},"/scim/v2/Users/{id}":{"get":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Obtém usuário","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Usuário SCIM","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimUser"}}}},"404":{"description":"Usuário não encontrado"}}},"patch":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Atualiza usuário","description":"Suporta Replace de active, displayName e name/formatted.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimPatchRequest"}}}},"responses":{"200":{"description":"Usuário atualizado","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimUser"}}}},"404":{"description":"Usuário não encontrado"}}},"delete":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Desativa usuário","description":"Remove o acesso ativo do usuário ao tenant da API key. Se o tenant for o tenant primário, também desativa o usuário.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Usuário desativado"},"404":{"description":"Usuário não encontrado"}}}},"/scim/v2/Groups/{id}":{"get":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Obtém grupo","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Grupo SCIM","content":{"application/scim+json":{"schema":{"$ref":"#/components/schemas/ScimGroup"}}}},"404":{"description":"Grupo não encontrado"}}},"patch":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Atualização de grupos não suportada","responses":{"501":{"description":"Groups read-only; use backoffice ou HRIS worker governado"}}},"delete":{"servers":[{"url":"https://eleva.accuracy.com.br/api","description":"Produção"}],"summary":"SCIM 2.0 — Remoção de grupos não suportada","responses":{"501":{"description":"Groups read-only; use backoffice ou HRIS worker governado"}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key no formato `acc_xxx...`. Gere em /backoffice/[slug]/integrations. Escopos publicos granulares: `public:courses:read`, `public:users:read`, `public:enrollments:read`, `public:stats:read`, `public:bi_events:read`, `public:dictionary:read`. Escopos legados `read` e `all` seguem aceitos por compatibilidade."}},"schemas":{"PaginatedResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}},"pagination":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"pages":{"type":"integer"}}}}},"Course":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"category":{"type":"string","nullable":true},"is_published":{"type":"boolean"},"scorm_version":{"type":"string","enum":["1.2","2004"],"nullable":true},"content_type":{"type":"string","enum":["scorm","native","video","live"]},"duration_minutes":{"type":"integer","nullable":true},"created_at":{"type":"string","format":"date-time"}}},"User":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"email":{"type":"string","format":"email"},"name":{"type":"string"},"role":{"type":"string","enum":["student","tenant_admin","accuracy_admin"]},"is_active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"}}},"Enrollment":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"user_name":{"type":"string"},"user_email":{"type":"string","format":"email"},"course_id":{"type":"string","format":"uuid"},"course_title":{"type":"string"},"status":{"type":"string","enum":["not_started","in_progress","completed","failed"]},"progress":{"type":"integer","minimum":0,"maximum":100},"score":{"type":"number","nullable":true},"started_at":{"type":"string","format":"date-time","nullable":true},"completed_at":{"type":"string","format":"date-time","nullable":true}}},"Stats":{"type":"object","properties":{"total_users":{"type":"integer"},"total_courses":{"type":"integer"},"total_enrollments":{"type":"integer"},"completed_enrollments":{"type":"integer"},"completion_rate":{"type":"integer","description":"Percentual 0-100"}}},"ScimCreateUser":{"type":"object","required":["userName"],"properties":{"schemas":{"type":"array","items":{"type":"string"}},"userName":{"type":"string","format":"email"},"active":{"type":"boolean","default":true},"displayName":{"type":"string"},"externalId":{"type":"string"},"name":{"type":"object","properties":{"formatted":{"type":"string"},"givenName":{"type":"string"},"familyName":{"type":"string"}}},"emails":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","format":"email"},"primary":{"type":"boolean"}}}}}},"ScimPatchRequest":{"type":"object","required":["Operations"],"properties":{"schemas":{"type":"array","items":{"type":"string"}},"Operations":{"type":"array","items":{"type":"object","required":["op"],"properties":{"op":{"type":"string","enum":["Replace"]},"path":{"type":"string","enum":["active","displayName","name","name.formatted"]},"value":{}}}}}},"ScimBulkOperation":{"type":"object","required":["method","path"],"properties":{"method":{"type":"string","enum":["POST","GET","PATCH","DELETE"]},"path":{"type":"string","example":"/Users/2819c223-7f76-453a-919d-413861904646"},"bulkId":{"type":"string"},"data":{"oneOf":[{"$ref":"#/components/schemas/ScimCreateUser"},{"$ref":"#/components/schemas/ScimPatchRequest"}]}}},"ScimBulkRequest":{"type":"object","required":["Operations"],"properties":{"schemas":{"type":"array","items":{"type":"string"},"example":["urn:ietf:params:scim:api:messages:2.0:BulkRequest"]},"failOnErrors":{"type":"integer","minimum":1},"Operations":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/ScimBulkOperation"}}}},"ScimBulkResponse":{"type":"object","properties":{"schemas":{"type":"array","items":{"type":"string"},"example":["urn:ietf:params:scim:api:messages:2.0:BulkResponse"]},"Operations":{"type":"array","items":{"type":"object","properties":{"method":{"type":"string"},"status":{"type":"string"},"location":{"type":"string"},"bulkId":{"type":"string"},"response":{"type":"object"}}}}}},"ScimUser":{"type":"object","properties":{"schemas":{"type":"array","items":{"type":"string"}},"id":{"type":"string","format":"uuid"},"userName":{"type":"string","format":"email"},"active":{"type":"boolean"},"displayName":{"type":"string"},"name":{"type":"object"},"emails":{"type":"array","items":{"type":"object"}},"roles":{"type":"array","items":{"type":"object"}},"meta":{"type":"object"}}},"ScimGroup":{"type":"object","properties":{"schemas":{"type":"array","items":{"type":"string"}},"id":{"type":"string","format":"uuid"},"displayName":{"type":"string"},"members":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","format":"uuid"},"display":{"type":"string"},"$ref":{"type":"string"}}}},"meta":{"type":"object"}}},"ScimResourceType":{"type":"object","properties":{"schemas":{"type":"array","items":{"type":"string"}},"id":{"type":"string","enum":["User","Group"]},"name":{"type":"string"},"endpoint":{"type":"string"},"description":{"type":"string"},"schema":{"type":"string"},"schemaExtensions":{"type":"array","items":{"type":"object"}},"meta":{"type":"object"}}},"ScimSchema":{"type":"object","properties":{"schemas":{"type":"array","items":{"type":"string"}},"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"attributes":{"type":"array","items":{"type":"object"}},"meta":{"type":"object"}}},"ScimServiceProviderConfig":{"type":"object","properties":{"schemas":{"type":"array","items":{"type":"string"}},"documentationUri":{"type":"string"},"patch":{"type":"object"},"bulk":{"type":"object"},"filter":{"type":"object"},"changePassword":{"type":"object"},"sort":{"type":"object"},"etag":{"type":"object"},"authenticationSchemes":{"type":"array","items":{"type":"object"}}}},"ScimListResponse":{"type":"object","properties":{"schemas":{"type":"array","items":{"type":"string"}},"totalResults":{"type":"integer"},"startIndex":{"type":"integer"},"itemsPerPage":{"type":"integer"},"Resources":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/ScimUser"},{"$ref":"#/components/schemas/ScimGroup"},{"$ref":"#/components/schemas/ScimResourceType"},{"$ref":"#/components/schemas/ScimSchema"}]}}}}}}}