{"openapi":"3.1.0","info":{"title":"PrismaData — Autenticacao","version":"1.0.0","termsOfService":"https://prismadata.io/terms","contact":{"name":"PrismaData Support Team","url":"https://prismadata.io/contact","email":"suporte.api@prismadata.io"},"license":{"name":"Proprietary","url":"https://api.prismadata.io/license"},"description":"O servico de autenticacao PrismaData gerencia credenciais, tokens JWT e API Keys para acesso as APIs de dados PrismaData.\n\n## Metodos de Autenticacao\n\nExistem duas formas de autenticar nas APIs PrismaData. **Recomendamos o uso de API Key** por sua simplicidade e menor latencia.\n\n### 1. API Key (recomendado)\n\nA API Key e a forma mais simples de autenticacao. Basta envia-la no header `X-Apikey` em qualquer request ao gateway:\n\n```bash\ncurl https://api.prismadata.io/v1/location/prison?lat=-25.5&lng=-54.5 \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\"\n```\n\n**Vantagens da API Key:**\n- Nao expira (a menos que seja revogada pelo administrador)\n- O gateway gerencia o token JWT automaticamente (gera, cacheia e renova)\n- Nenhum controle de validade necessario pelo cliente\n- Menor latencia: o token e cacheado no gateway e reutilizado entre requests\n\n### 2. Login com usuario e senha\n\nPara obter um token JWT diretamente, envie suas credenciais via `POST /token`:\n\n```bash\ncurl -X POST https://api.prismadata.io/v1/auth/token \\\n  -d \"username=seu_usuario&password=sua_senha\"\n```\n\nEm seguida, use o token retornado no header `Authorization`:\n\n```bash\ncurl https://api.prismadata.io/v1/location/prison?lat=-25.5&lng=-54.5 \\\n  -H \"Authorization: Bearer eyJ...\"\n```\n\n**Importante sobre tokens JWT:**\n- O token possui um tempo de expiracao (claim `exp`), tipicamente 15 minutos\n- O cliente deve controlar a validade do token e renova-lo antes da expiracao\n- Apos expirado, o token e rejeitado pelo gateway e um novo deve ser obtido via `POST /token`\n\n## Comparativo\n\n| | API Key | Token JWT |\n|---|---------|-----------|\n| **Obtencao** | Fornecida pelo administrador | `POST /token` com usuario/senha |\n| **Expiracao** | Nao expira | Expira (claim `exp`, tipicamente 15min) |\n| **Renovacao** | Automatica pelo gateway | Manual pelo cliente |\n| **Uso** | Header `X-Apikey` | Header `Authorization: Bearer` |\n| **Latencia** | Menor (token cacheado no gateway) | Maior (requer chamada ao /token a cada expiracao) |\n| **Recomendado para** | Integracao backend-to-backend, scripts, automacoes | Browsers, apps com login de usuario |\n\n## Endpoint POST /token\n\nO endpoint `/token` aceita dois modos de autenticacao via `application/x-www-form-urlencoded`:\n\n**Com API Key (campo `api_key`):**\n```bash\ncurl -X POST https://api.prismadata.io/v1/auth/token \\\n  -d \"api_key=ak_xxxxxxxxxxxxxxxx\"\n```\n\n**Com usuario e senha (campos `username` e `password`):**\n```bash\ncurl -X POST https://api.prismadata.io/v1/auth/token \\\n  -d \"username=seu_usuario&password=sua_senha\"\n```\n\n## Estrutura do Token JWT\n\nO token JWT contém os seguintes claims:\n\n| Claim | Tipo | Descricao |\n|-------|------|-----------|\n| `sub` | string | Username do usuario |\n| `roles` | string[] | Roles atribuidos ao usuario |\n| `rate_limit` | float | Limite de requisicoes por minuto |\n| `allowed_network` | string | CIDR permitido (vazio = sem restricao) |\n| `sandbox` | bool | Modo sandbox (dados sinteticos) |\n| `tenant_id` | int/null | ID do tenant |\n| `quota_limit` | int/null | Limite global de quota |\n| `quota_limits` | object/null | Limites por endpoint |\n| `quota_expiry` | int/null | Unix timestamp de expiracao da quota |\n| `exp` | int | Unix timestamp de expiracao do token |\n\nHeaders do JWT: `kid` (Key ID), `iss` (\"PrismaDataAuth\"), `alg` (RS256).\n\n## Rate Limiting\n\nOs endpoints de autenticacao possuem rate limiting de **5 requisicoes por minuto** por IP.\n\n## Contato\n\nCredenciais de acesso sao fornecidas pela equipe PrismaData. Para solicitar acesso, entre em contato pelo [portal](https://prismadata.io/contact).\n"},"servers":[{"url":"https://api.prismadata.io/v1","description":"Ambiente de Produção"}],"security":[{"X-Apikey":[]},{"api_key":[]},{"BearerAuth":[]}],"tags":[{"name":"Autenticacao","description":"O servico de autenticacao PrismaData gerencia credenciais, tokens JWT e API Keys para acesso as APIs de dados PrismaData.\n\n## Metodos de Autenticacao\n\nExistem duas formas de autenticar nas APIs PrismaData. **Recomendamos o uso de API Key** por sua simplicidade e menor latencia.\n\n### 1. API Key (recomendado)\n\nA API Key e a forma mais simples de autenticacao. Basta envia-la no header `X-Apikey` em qualquer request ao gateway:\n\n```bash\ncurl https://api.prismadata.io/v1/location/prison?lat=-25.5&lng=-54.5 \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\"\n```\n\n**Vantagens da API Key:**\n- Nao expira (a menos que seja revogada pelo administrador)\n- O gateway gerencia o token JWT automaticamente (gera, cacheia e renova)\n- Nenhum controle de validade necessario pelo cliente\n- Menor latencia: o token e cacheado no gateway e reutilizado entre requests\n\n### 2. Login com usuario e senha\n\nPara obter um token JWT diretamente, envie suas credenciais via `POST /token`:\n\n```bash\ncurl -X POST https://api.prismadata.io/v1/auth/token \\\n  -d \"username=seu_usuario&password=sua_senha\"\n```\n\nEm seguida, use o token retornado no header `Authorization`:\n\n```bash\ncurl https://api.prismadata.io/v1/location/prison?lat=-25.5&lng=-54.5 \\\n  -H \"Authorization: Bearer eyJ...\"\n```\n\n**Importante sobre tokens JWT:**\n- O token possui um tempo de expiracao (claim `exp`), tipicamente 15 minutos\n- O cliente deve controlar a validade do token e renova-lo antes da expiracao\n- Apos expirado, o token e rejeitado pelo gateway e um novo deve ser obtido via `POST /token`\n\n## Comparativo\n\n| | API Key | Token JWT |\n|---|---------|-----------|\n| **Obtencao** | Fornecida pelo administrador | `POST /token` com usuario/senha |\n| **Expiracao** | Nao expira | Expira (claim `exp`, tipicamente 15min) |\n| **Renovacao** | Automatica pelo gateway | Manual pelo cliente |\n| **Uso** | Header `X-Apikey` | Header `Authorization: Bearer` |\n| **Latencia** | Menor (token cacheado no gateway) | Maior (requer chamada ao /token a cada expiracao) |\n| **Recomendado para** | Integracao backend-to-backend, scripts, automacoes | Browsers, apps com login de usuario |\n\n## Endpoint POST /token\n\nO endpoint `/token` aceita dois modos de autenticacao via `application/x-www-form-urlencoded`:\n\n**Com API Key (campo `api_key`):**\n```bash\ncurl -X POST https://api.prismadata.io/v1/auth/token \\\n  -d \"api_key=ak_xxxxxxxxxxxxxxxx\"\n```\n\n**Com usuario e senha (campos `username` e `password`):**\n```bash\ncurl -X POST https://api.prismadata.io/v1/auth/token \\\n  -d \"username=seu_usuario&password=sua_senha\"\n```\n\n## Estrutura do Token JWT\n\nO token JWT contém os seguintes claims:\n\n| Claim | Tipo | Descricao |\n|-------|------|-----------|\n| `sub` | string | Username do usuario |\n| `roles` | string[] | Roles atribuidos ao usuario |\n| `rate_limit` | float | Limite de requisicoes por minuto |\n| `allowed_network` | string | CIDR permitido (vazio = sem restricao) |\n| `sandbox` | bool | Modo sandbox (dados sinteticos) |\n| `tenant_id` | int/null | ID do tenant |\n| `quota_limit` | int/null | Limite global de quota |\n| `quota_limits` | object/null | Limites por endpoint |\n| `quota_expiry` | int/null | Unix timestamp de expiracao da quota |\n| `exp` | int | Unix timestamp de expiracao do token |\n\nHeaders do JWT: `kid` (Key ID), `iss` (\"PrismaDataAuth\"), `alg` (RS256).\n\n## Rate Limiting\n\nOs endpoints de autenticacao possuem rate limiting de **5 requisicoes por minuto** por IP.\n\n## Contato\n\nCredenciais de acesso sao fornecidas pela equipe PrismaData. Para solicitar acesso, entre em contato pelo [portal](https://prismadata.io/contact).\n"}],"paths":{"/auth/token":{"post":{"tags":["Autenticacao"],"summary":"Obtém token JWT (usuário/senha ou API Key)","description":"Autentica via usuario/senha ou API Key e retorna um token JWT assinado com RS256. O token e retornado no body e tambem em um cookie httpOnly para uso em browsers.\n\n**Login com API Key (recomendado):** envie no campo `api_key`. A API Key nao expira e o gateway gerencia o token automaticamente, sem necessidade de controle de validade pelo cliente.\n\n```\ncurl -X POST .../token -d \"api_key=ak_xxxxxxxx\"\n```\n\n**Login com senha:** envie `username` e `password` como form-urlencoded. O token JWT retornado possui expiracao (claim `exp`) e o cliente deve controlar sua validade, renovando-o antes da expiracao.\n\n```\ncurl -X POST .../token -d \"username=user&password=pass\"\n```","operationId":"obter_token","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_obter_token"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"},"example":{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InByaXNtYWRhdGEtMSIsImlzcyI6IlByaXNtYURhdGFBdXRoIn0...","token_type":"bearer"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"Unauthorized - Invalid username, password, or API key","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}},"x-codeSamples":[{"lang":"curl","source":"curl -X POST \"https://api.prismadata.io/v1/auth/token\" \\\n  -d \"api_key=ak_xxxxxxxxxxxxxxxx\""},{"lang":"Python","source":"import httpx\n\nresp = httpx.post(\n    \"https://api.prismadata.io/v1/auth/token\",\n    data={\"api_key\": \"ak_xxxxxxxxxxxxxxxx\"},\n)\ntoken = resp.json()[\"access_token\"]"},{"lang":"Python SDK","source":"from prismadata import Client\n\nclient = Client(api_key=\"ak_xxxxxxxxxxxxxxxx\")\n# Authentication is handled automatically by the SDK.\n# Just pass your API key when creating the client:\nclient = Client(api_key=\"ak_xxxxxxxxxxxxxxxx\")"},{"lang":"R SDK","source":"library(prismadata)\n\nclient <- prismadata_client(api_key = \"ak_xxxxxxxxxxxxxxxx\")\n# Authentication is handled automatically on client creation.\n# With API key:\nclient <- prismadata_client(api_key = \"ak_xxxxxxxxxxxxxxxx\")\n\n# With username and password:\nclient <- prismadata_client(\n  username = \"user@example.com\",\n  password = \"your_password\"\n)"},{"lang":"TypeScript SDK","source":"import { PrismaDataClient } from \"prismadata\";\n\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });\n// Authentication is handled automatically by the SDK.\n// Just pass your API key when creating the client:\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });"}]}},"/auth/me":{"get":{"tags":["Autenticacao"],"summary":"Dados do usuário autenticado","description":"Retorna os dados do usuario autenticado extraidos do token JWT. O token e obtido do cookie httpOnly ou do header `Authorization: Bearer <token>`.","operationId":"obter_usuario_autenticado","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeResponse"},"example":{"username":"usuario_exemplo","roles":["full_reader"],"tenant_id":1,"tenant_cnpj":"12.345.678/0001-90","tenant_razao_social":"Empresa Exemplo LTDA","sandbox":false,"rate_limit":60.0}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"401":{"description":"Unauthorized - Missing or invalid API key (X-Apikey header or api_key query parameter)","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"403":{"description":"Forbidden - Missing privileges to retrieve data","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}},"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.prismadata.io/v1/auth/me\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\""},{"lang":"Python","source":"import httpx\n\nresp = httpx.get(\n    \"https://api.prismadata.io/v1/auth/me\",\n    headers={\"X-Apikey\": \"ak_xxxxxxxxxxxxxxxx\"},\n)\ndados = resp.json()"},{"lang":"Python SDK","source":"from prismadata import Client\n\nclient = Client(api_key=\"ak_xxxxxxxxxxxxxxxx\")\ninfo = client.me()\nprint(info)"},{"lang":"R SDK","source":"library(prismadata)\n\nclient <- prismadata_client(api_key = \"ak_xxxxxxxxxxxxxxxx\")\nresult <- client$me()\nprint(result)"},{"lang":"TypeScript SDK","source":"import { PrismaDataClient } from \"prismadata\";\n\nconst client = new PrismaDataClient({ apiKey: \"ak_xxxxxxxxxxxxxxxx\" });\nconst info = await client.me();\nconsole.log(info);"}]}},"/auth/users/change_password":{"post":{"tags":["Autenticacao"],"summary":"Altera a senha do usuário autenticado","description":"Altera a senha do usuario autenticado. Requer autenticacao via username/password no body. A nova senha deve ter entre 15 e 30 caracteres. Rate limit: 5 requisicoes por minuto.","operationId":"alterar_senha","parameters":[{"name":"new_password","in":"query","required":true,"schema":{"type":"string","minLength":15,"maxLength":30,"title":"New Password"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Alterar Senha"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}},"x-codeSamples":[{"lang":"curl","source":"curl -X POST \"https://api.prismadata.io/v1/auth/users/change_password\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ ... }'"},{"lang":"Python","source":"import httpx\n\nresp = httpx.post(\n    \"https://api.prismadata.io/v1/auth/users/change_password\",\n    json={...},\n    headers={\"X-Apikey\": \"ak_xxxxxxxxxxxxxxxx\"},\n)\ndados = resp.json()"}]}}},"components":{"securitySchemes":{"X-Apikey":{"type":"apiKey","in":"header","name":"X-Apikey","description":"Token de acesso via header."},"api_key":{"type":"apiKey","in":"query","name":"api_key","description":"Token de acesso via query parameter."},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Token JWT obtido via POST /auth/token"}},"headers":{"X-RateLimit-Limit":{"description":"Número máximo de requisições permitidas por minuto para o usuário.","schema":{"type":"integer","example":60}},"X-RateLimit-Remaining":{"description":"Número de requisições restantes na janela de rate limit atual.","schema":{"type":"integer","example":57}},"X-RateLimit-Reset":{"description":"Unix timestamp (segundos) indicando quando a janela de rate limit será reiniciada.","schema":{"type":"integer","example":1738281600}}},"responses":{"RateLimitExceeded":{"description":"Too Many Requests - Rate limit ou quota excedidos.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"text/plain":{"schema":{"type":"string"},"examples":{"rate_limit":{"summary":"Rate limit excedido","value":"rate limit exceeded"},"quota":{"summary":"Quota excedida","value":"limit exceeded: 1000 requests used, limit is 1000"}}}}}},"schemas":{"Body_obter_token":{"properties":{"username":{"type":"string","title":"Username","default":"","description":"Nome de usuario (usado apenas no login com senha)."},"password":{"type":"string","title":"Password","default":"","description":"Senha do usuario (usado apenas no login com senha)."},"api_key":{"type":"string","title":"Api Key","default":"","description":"API Key para autenticacao (recomendado). Quando informado, os campos username e password sao ignorados."}},"type":"object","title":"Body_obter_token"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"TokenResponse":{"description":"Modelo com a resposta do endpoint /token.","properties":{"access_token":{"description":"Token JWT assinado com RS256.","title":"Access Token","type":"string"},"token_type":{"default":"bearer","description":"Tipo do token (sempre 'bearer').","title":"Token Type","type":"string"}},"required":["access_token"],"title":"TokenResponse","type":"object"},"UserLogin":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","password"],"title":"UserLogin","description":"Schema para login de usuario."},"UserMeResponse":{"description":"Modelo com a resposta do endpoint /me.","properties":{"username":{"description":"Username do usuario autenticado.","title":"Username","type":"string"},"roles":{"default":[],"description":"Lista de roles atribuidos ao usuario.","items":{"type":"string"},"title":"Roles","type":"array"},"tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"ID do tenant ao qual o usuario pertence.","title":"Tenant Id"},"tenant_cnpj":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"CNPJ formatado do tenant ao qual o usuario pertence. Nulo quando o usuario nao esta vinculado a um tenant.","title":"Tenant Cnpj"},"tenant_razao_social":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Razao social do tenant ao qual o usuario pertence. Nulo quando o usuario nao esta vinculado a um tenant.","title":"Tenant Razao Social"},"sandbox":{"default":false,"description":"Indica se o usuario opera em modo sandbox (dados sinteticos).","title":"Sandbox","type":"boolean"},"rate_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Limite de requisicoes por minuto do usuario.","title":"Rate Limit"}},"required":["username"],"title":"UserMeResponse","type":"object"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}
