SDK Elixir
SDK oficial para Elixir com padrão {:ok, result} / {:error, reason}, suporte a supervisionamento OTP e compatível com Phoenix.
Instalação
Adicione ao mix.exs:
Elixir
def deps do
[
{:cpfhub, "~> 1.0"}
]
endDepois:
bash
mix deps.getRequerimentos: Elixir 1.14+ / OTP 25+
Configuração
Elixir
# config/config.exs
config :cpfhub,
api_key: System.get_env("CPFHUB_API_KEY"),
timeout: 10_000 # ms, opcionalPara variáveis em runtime (produção):
Elixir
# config/runtime.exs
config :cpfhub,
api_key: System.fetch_env!("CPFHUB_API_KEY")Uso
CPFHub.lookup/1
Elixir
case CPFHub.lookup("12345678909") do
{:ok, data} ->
IO.puts(data.name) # "João da Silva"
IO.puts(data.gender) # "M"
{:error, reason} ->
IO.inspect(reason)
endEstrutura de retorno:
Elixir
# Em caso de sucesso:
{:ok, %CPFHub.Data{
cpf: "12345678909",
name: "João da Silva",
name_upper: "JOÃO DA SILVA",
gender: "M",
birth_date: "15/04/1985",
day: 15,
month: 4,
year: 1985
}}
# Em caso de erro:
{:error, %CPFHub.Error{
code: "CPF_NOT_FOUND",
message: "CPF not found in our database",
status_code: 404
}}Tratamento de erros
Elixir
case CPFHub.lookup("12345678909") do
{:ok, data} ->
{:ok, %{name: data.name, gender: data.gender}}
{:error, %CPFHub.Error{code: "CPF_NOT_FOUND"}} ->
{:error, :not_found}
{:error, %CPFHub.Error{code: "RATE_LIMIT_EXCEEDED"}} ->
# aguardar e tentar novamente
Process.sleep(1_000)
CPFHub.lookup("12345678909")
{:error, reason} ->
{:error, reason}
endCódigos de erro
reason.code | reason.status_code | Descrição |
|---|---|---|
CPF_NOT_FOUND | 404 | CPF não encontrado (sem consumo de crédito) |
INVALID_CPF_FORMAT | 400 | Formato inválido |
INVALID_CPF_DIGITS | 422 | Dígitos verificadores inválidos |
MISSING_API_KEY | 401 | API Key ausente |
INVALID_API_KEY | 401 | API Key inválida |
RATE_LIMIT_EXCEEDED | 429 | Limite de taxa excedido |
INSUFFICIENT_CREDITS | 403 | Sem créditos disponíveis |
Exemplos de integração
Phoenix Controller
Elixir
defmodule MeuAppWeb.CPFController do
use MeuAppWeb, :controller
def show(conn, %{"cpf" => cpf}) do
case CPFHub.lookup(cpf) do
{:ok, data} ->
json(conn, data)
{:error, %CPFHub.Error{status_code: status, code: code}} ->
conn
|> put_status(status)
|> json(%{error: code})
end
end
endEcto Changeset - validação de CPF
Elixir
defmodule MeuApp.Accounts.User do
use Ecto.Schema
import Ecto.Changeset
def changeset(user, attrs) do
user
|> cast(attrs, [:cpf, :email])
|> validate_required([:cpf])
|> validate_cpf_exists()
end
defp validate_cpf_exists(changeset) do
case get_change(changeset, :cpf) do
nil -> changeset
cpf ->
case CPFHub.lookup(cpf) do
{:ok, _} -> changeset
{:error, %CPFHub.Error{code: "CPF_NOT_FOUND"}} ->
add_error(changeset, :cpf, "não encontrado na base de dados")
_ -> changeset
end
end
end
endRepositório e suporte
- github.com/cpfhub/cpfhub-elixir - código-fonte, issues e contribuições
- hex.pm/packages/cpfhub - versões e changelog
- hexdocs.pm/cpfhub - documentação de referência
Atualizado em 12 de maio de 2026