{"openapi":"3.1.0","info":{"title":"PrismaData — Identity","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":"# Identity - GeoIP Compliance API\n\nAPI de Identificacao de Pais por IP/Coordenada para Compliance PLD/FT.\n\nIdentifica o pais de origem de um acesso a partir de endereco IP ou coordenada geografica, retornando classificacao de risco, status em listas de sancoes internacionais (GAFI, OFAC, UE), paraisos fiscais (RFB, UE), deteccao de VPN/Proxy/TOR/Datacenter/Satelite, ASN (Autonomous System Number) e indice de confianca da geolocalizacao.\n\nCada resposta inclui assinatura digital Ed25519, funcionando como laudo tecnico verificavel por terceiros (auditores, BACEN, PF).\n\n## Casos de Uso\n\n- Monitoramento de pais de acesso para compliance com Circular BACEN 3.978/2020\n- Deteccao de acessos via VPN, TOR, proxy ou satelite em plataformas financeiras\n- Identificacao de ASN e organizacao responsavel pelo IP\n- Avaliacao de confianca da geolocalizacao (reduzida para conexoes via satelite)\n- Enriquecimento de dados para analise de risco PLD/FT\n- Geracao de evidencias auditaveis para o BACEN\n"},"servers":[{"url":"https://api.prismadata.io/v1","description":"Ambiente de Produção"}],"security":[{"X-Apikey":[]},{"api_key":[]},{"BearerAuth":[]}],"tags":[{"name":"Identity","description":"# Identity - GeoIP Compliance API\n\nAPI de Identificacao de Pais por IP/Coordenada para Compliance PLD/FT.\n\nIdentifica o pais de origem de um acesso a partir de endereco IP ou coordenada geografica, retornando classificacao de risco, status em listas de sancoes internacionais (GAFI, OFAC, UE), paraisos fiscais (RFB, UE), deteccao de VPN/Proxy/TOR/Datacenter/Satelite, ASN (Autonomous System Number) e indice de confianca da geolocalizacao.\n\nCada resposta inclui assinatura digital Ed25519, funcionando como laudo tecnico verificavel por terceiros (auditores, BACEN, PF).\n\n## Casos de Uso\n\n- Monitoramento de pais de acesso para compliance com Circular BACEN 3.978/2020\n- Deteccao de acessos via VPN, TOR, proxy ou satelite em plataformas financeiras\n- Identificacao de ASN e organizacao responsavel pelo IP\n- Avaliacao de confianca da geolocalizacao (reduzida para conexoes via satelite)\n- Enriquecimento de dados para analise de risco PLD/FT\n- Geracao de evidencias auditaveis para o BACEN\n"}],"paths":{"/identity/ipinfo":{"get":{"tags":["Identity"],"summary":"País de origem de um IP ou coordenada","description":"Identifica o pais a partir de IP ou coordenada.","operationId":"identity_country","parameters":[{"name":"input_type","in":"query","required":true,"schema":{"type":"string","description":"Tipo de entrada: 'ip' ou 'coordinate'","title":"Input Type"},"description":"Tipo de entrada: 'ip' ou 'coordinate'"},{"name":"ip","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Endereco IP","title":"Ip"},"description":"Endereco IP"},{"name":"latitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"description":"Latitude","title":"Latitude"},"description":"Latitude"},{"name":"longitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"description":"Longitude","title":"Longitude"},"description":"Longitude"},{"name":"enrich","in":"query","required":false,"schema":{"type":"boolean","description":"Ativa retorno de VPN/proxy/TOR/datacenter","default":true,"title":"Enrich"},"description":"Ativa retorno de VPN/proxy/TOR/datacenter"},{"name":"check_sanctions","in":"query","required":false,"schema":{"type":"boolean","description":"Verifica listas de sancoes e paraisos fiscais","default":true,"title":"Check Sanctions"},"description":"Verifica listas de sancoes e paraisos fiscais"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"description":"Modelo com a resposta esperada da API.","properties":{"prismadata__ipinfo__input_type":{"description":"Tipo de entrada: 'ip' ou 'coordinate'","title":"Prismadata  Ipinfo  Input Type","type":"string"},"prismadata__ipinfo__input_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"IP informado na consulta. null quando input_type=coordinate","title":"Prismadata  Ipinfo  Input Ip"},"prismadata__ipinfo__input_latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Latitude informada na consulta. null quando input_type=ip","title":"Prismadata  Ipinfo  Input Latitude"},"prismadata__ipinfo__input_longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Longitude informada na consulta. null quando input_type=ip","title":"Prismadata  Ipinfo  Input Longitude"},"prismadata__ipinfo__resolved_latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Latitude resolvida (centroide do pais quando a entrada e um IP)","title":"Prismadata  Ipinfo  Resolved Latitude"},"prismadata__ipinfo__resolved_longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Longitude resolvida (centroide do pais quando a entrada e um IP)","title":"Prismadata  Ipinfo  Resolved Longitude"},"prismadata__ipinfo__country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Codigo ISO 3166-1 alpha-2 do pais. null quando o pais nao pode ser determinado","title":"Prismadata  Ipinfo  Country Code"},"prismadata__ipinfo__country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nome do pais em ingles. null quando o pais nao pode ser determinado","title":"Prismadata  Ipinfo  Country Name"},"prismadata__ipinfo__continent":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nome do continente. null quando o pais nao pode ser determinado","title":"Prismadata  Ipinfo  Continent"},"prismadata__ipinfo__risk_level":{"description":"Classificacao de risco: low, medium, high, very_high ou indeterminate (pais nao resolvido)","title":"Prismadata  Ipinfo  Risk Level","type":"string"},"prismadata__ipinfo__is_sanctioned":{"description":"Se o pais esta em lista de sancoes","title":"Prismadata  Ipinfo  Is Sanctioned","type":"boolean"},"prismadata__ipinfo__gafi_status":{"description":"Status GAFI: not_listed, grey_list, black_list","title":"Prismadata  Ipinfo  Gafi Status","type":"string"},"prismadata__ipinfo__ofac_status":{"description":"Status OFAC: not_listed, sanctioned","title":"Prismadata  Ipinfo  Ofac Status","type":"string"},"prismadata__ipinfo__eu_status":{"description":"Status UE: not_listed, sanctioned","title":"Prismadata  Ipinfo  Eu Status","type":"string"},"prismadata__ipinfo__bacen_alert":{"description":"Se o pais possui alerta especifico do BACEN","title":"Prismadata  Ipinfo  Bacen Alert","type":"boolean"},"prismadata__ipinfo__is_tax_haven_rfb":{"description":"Paraiso fiscal segundo IN RFB 1.037","title":"Prismadata  Ipinfo  Is Tax Haven Rfb","type":"boolean"},"prismadata__ipinfo__is_tax_haven_eu":{"description":"Paraiso fiscal segundo lista UE","title":"Prismadata  Ipinfo  Is Tax Haven Eu","type":"boolean"},"prismadata__ipinfo__rfb_type":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tipo de enquadramento na IN RFB 1.037: 'full' (paraiso fiscal), 'partial' (regime fiscal privilegiado) ou null","title":"Prismadata  Ipinfo  Rfb Type"},"prismadata__ipinfo__is_vpn":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"IP pertence a provedor VPN conhecido","title":"Prismadata  Ipinfo  Is Vpn"},"prismadata__ipinfo__is_proxy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"IP utiliza proxy","title":"Prismadata  Ipinfo  Is Proxy"},"prismadata__ipinfo__is_tor_exit_node":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"IP e no de saida TOR","title":"Prismadata  Ipinfo  Is Tor Exit Node"},"prismadata__ipinfo__is_datacenter":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"IP pertence a datacenter","title":"Prismadata  Ipinfo  Is Datacenter"},"prismadata__ipinfo__connection_type":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tipo de conexao: residential, vpn, tor, datacenter, satellite","title":"Prismadata  Ipinfo  Connection Type"},"prismadata__ipinfo__asn":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Autonomous System Number do IP","title":"Prismadata  Ipinfo  Asn"},"prismadata__ipinfo__asn_org":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Nome da organizacao dona do ASN","title":"Prismadata  Ipinfo  Asn Org"},"prismadata__ipinfo__geoip_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Confianca da geolocalizacao (0.0 a 1.0). Reduzida para 0.25 em conexoes via satelite","title":"Prismadata  Ipinfo  Geoip Confidence"},"prismadata__ipinfo__country_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Timezone IANA do pais (ex: America/Sao_Paulo)","title":"Prismadata  Ipinfo  Country Timezone"},"prismadata__ipinfo__country_utc_offset":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Offset UTC no formato -03:00","title":"Prismadata  Ipinfo  Country Utc Offset"},"prismadata__ipinfo__local_time":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hora local no formato ISO 8601","title":"Prismadata  Ipinfo  Local Time"},"prismadata__ipinfo__is_business_hours":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Se esta em horario comercial local (seg-sex 8h-18h)","title":"Prismadata  Ipinfo  Is Business Hours"},"prismadata__ipinfo__query_id":{"description":"UUID v4 unico da consulta","title":"Prismadata  Ipinfo  Query Id","type":"string"},"prismadata__ipinfo__timestamp":{"description":"Timestamp UTC da consulta em formato ISO 8601","title":"Prismadata  Ipinfo  Timestamp","type":"string"},"prismadata__ipinfo__requester_ip":{"description":"IP do solicitante (origem da requisicao)","title":"Prismadata  Ipinfo  Requester Ip","type":"string"},"prismadata__ipinfo__requester_razao_social":{"description":"Razao social da empresa solicitante","title":"Prismadata  Ipinfo  Requester Razao Social","type":"string"},"prismadata__ipinfo__requester_cnpj":{"description":"CNPJ da empresa solicitante","title":"Prismadata  Ipinfo  Requester Cnpj","type":"string"},"prismadata__ipinfo__query_time_ms":{"description":"Tempo de processamento em milissegundos","title":"Prismadata  Ipinfo  Query Time Ms","type":"integer"},"prismadata__ipinfo__signature_algorithm":{"description":"Algoritmo de assinatura digital (Ed25519)","title":"Prismadata  Ipinfo  Signature Algorithm","type":"string"},"prismadata__ipinfo__signature_value":{"description":"Assinatura digital em base64","title":"Prismadata  Ipinfo  Signature Value","type":"string"},"prismadata__ipinfo__signature_key_id":{"description":"ID da chave usada na assinatura","title":"Prismadata  Ipinfo  Signature Key Id","type":"string"},"prismadata__ipinfo__signature_timestamp":{"description":"Timestamp UTC da assinatura em formato ISO 8601","title":"Prismadata  Ipinfo  Signature Timestamp","type":"string"}},"required":["prismadata__ipinfo__input_type","prismadata__ipinfo__country_code","prismadata__ipinfo__country_name","prismadata__ipinfo__continent","prismadata__ipinfo__risk_level","prismadata__ipinfo__is_sanctioned","prismadata__ipinfo__gafi_status","prismadata__ipinfo__ofac_status","prismadata__ipinfo__eu_status","prismadata__ipinfo__bacen_alert","prismadata__ipinfo__is_tax_haven_rfb","prismadata__ipinfo__is_tax_haven_eu","prismadata__ipinfo__query_id","prismadata__ipinfo__timestamp","prismadata__ipinfo__query_time_ms"],"title":"CountryResponse","type":"object"},"example":{"prismadata__ipinfo__input_type":"ip","prismadata__ipinfo__input_ip":"185.220.101.42","prismadata__ipinfo__resolved_latitude":52.52,"prismadata__ipinfo__resolved_longitude":13.405,"prismadata__ipinfo__country_code":"DE","prismadata__ipinfo__country_name":"Germany","prismadata__ipinfo__continent":"Europe","prismadata__ipinfo__risk_level":"low","prismadata__ipinfo__is_sanctioned":false,"prismadata__ipinfo__gafi_status":"not_listed","prismadata__ipinfo__ofac_status":"not_listed","prismadata__ipinfo__eu_status":"not_listed","prismadata__ipinfo__bacen_alert":false,"prismadata__ipinfo__is_tax_haven_rfb":false,"prismadata__ipinfo__is_tax_haven_eu":false,"prismadata__ipinfo__is_vpn":true,"prismadata__ipinfo__is_proxy":false,"prismadata__ipinfo__is_tor_exit_node":true,"prismadata__ipinfo__is_datacenter":true,"prismadata__ipinfo__connection_type":"tor","prismadata__ipinfo__asn":51167,"prismadata__ipinfo__asn_org":"Contabo GmbH","prismadata__ipinfo__geoip_confidence":0.95,"prismadata__ipinfo__country_timezone":"Europe/Berlin","prismadata__ipinfo__country_utc_offset":"+01:00","prismadata__ipinfo__local_time":"2026-03-01T14:32:05+01:00","prismadata__ipinfo__is_business_hours":true,"prismadata__ipinfo__query_id":"550e8400-e29b-41d4-a716-446655440000","prismadata__ipinfo__timestamp":"2026-03-01T13:32:05.123Z","prismadata__ipinfo__requester_ip":"203.0.113.42","prismadata__ipinfo__requester_razao_social":"Toro Investimentos S.A.","prismadata__ipinfo__requester_cnpj":"18.631.838/0001-46","prismadata__ipinfo__query_time_ms":7,"prismadata__ipinfo__signature_algorithm":"Ed25519","prismadata__ipinfo__signature_value":"base64_encoded_signature_here","prismadata__ipinfo__signature_key_id":"prismadata-signing-key-2026-01","prismadata__ipinfo__signature_timestamp":"2026-03-01T13:32:05.130Z"}}},"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"}}},"400":{"description":"Invalid input - IP or coordinate format invalid","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","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"}}},"422":{"description":"Validation Error","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":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"429":{"$ref":"#/components/responses/RateLimitExceeded"}},"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.prismadata.io/v1/identity/ipinfo?input_type=valor\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\""},{"lang":"Python","source":"import httpx\n\nresp = httpx.get(\n    \"https://api.prismadata.io/v1/identity/ipinfo\",\n    params={\"input_type\": 'valor'},\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\")\n# Por IP\nr = client.ipinfo(input_type=\"ip\", ip=\"8.8.8.8\", enrich=True)\n# Por coordenada\nr = client.ipinfo(input_type=\"coordinate\", lat=-23.55, lng=-46.63)\n# Com check contra listas de sancoes\nr = client.ipinfo(input_type=\"ip\", ip=\"1.2.3.4\", check_sanctions=True)"}]}},"/identity/batch/ipinfo":{"post":{"tags":["Identity"],"summary":"País de origem de IPs ou coordenadas em lote","description":"Identifica o pais para um lote de IPs ou coordenadas (max 1024).","operationId":"identity_country_batch","parameters":[{"name":"input_type","in":"query","required":true,"schema":{"type":"string","description":"Tipo de entrada: 'ip' ou 'coordinate'","title":"Input Type"},"description":"Tipo de entrada: 'ip' ou 'coordinate'"},{"name":"enrich","in":"query","required":false,"schema":{"type":"boolean","description":"Ativa retorno de VPN/proxy/TOR/datacenter","default":true,"title":"Enrich"},"description":"Ativa retorno de VPN/proxy/TOR/datacenter"},{"name":"check_sanctions","in":"query","required":false,"schema":{"type":"boolean","description":"Verifica listas de sancoes e paraisos fiscais","default":true,"title":"Check Sanctions"},"description":"Verifica listas de sancoes e paraisos fiscais"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Dicionario indexado por query_id com os objetos de resposta do ipinfo."}}},"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/identity/batch/ipinfo\" \\\n  -H \"X-Apikey: ak_xxxxxxxxxxxxxxxx\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"1\": [-23.55, -46.63], \"2\": [-22.90, -43.17]}'"},{"lang":"Python","source":"import httpx\n\nresp = httpx.post(\n    \"https://api.prismadata.io/v1/identity/batch/ipinfo\",\n    json={\"1\": [-23.55, -46.63], \"2\": [-22.90, -43.17]},\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\")\n# Ate 1024 itens por chamada\nr = client.ipinfo_batch(\n    {\"a\": {\"ip\": \"8.8.8.8\"}, \"b\": {\"ip\": \"1.1.1.1\"}},\n    input_type=\"ip\",\n    enrich=True,\n)"}]}}},"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":{"BatchItem":{"properties":{"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip","description":"Endereco IP"},"latitude":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Longitude"}},"type":"object","title":"BatchItem","description":"Item individual do lote."},"BatchRequest":{"additionalProperties":{"$ref":"#/components/schemas/BatchItem"},"type":"object","maxProperties":1024,"title":"BatchRequest","description":"Body do endpoint batch: Dict[str, BatchItem], max 1024."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"}}}}
