CPFHub.io

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"}
  ]
end

Depois:

bash
mix deps.get

Requerimentos: 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, opcional

Para 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)
end

Estrutura 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}
end

Códigos de erro

reason.codereason.status_codeDescrição
CPF_NOT_FOUND404CPF não encontrado (sem consumo de crédito)
INVALID_CPF_FORMAT400Formato inválido
INVALID_CPF_DIGITS422Dígitos verificadores inválidos
MISSING_API_KEY401API Key ausente
INVALID_API_KEY401API Key inválida
RATE_LIMIT_EXCEEDED429Limite de taxa excedido
INSUFFICIENT_CREDITS403Sem 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
end

Ecto 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
end

Repositório e suporte


Atualizado em 12 de maio de 2026