Skip to content

Desenvolvedores

API pública gratuita de feriados, status HTTP, cores e CPF/CNPJ

O arielton.com mantém uma API JSON gratuita e só de leitura em https://www.arielton.com/api/v1, com feriados do Brasil, dos Estados Unidos e de Portugal, todos os códigos de status HTTP, as cores do CSS e do Tailwind CSS v4 e a validação dos dígitos de CPF e CNPJ. Não tem chave nem cadastro, e o CORS aceita qualquer origem, então dá para chamar direto do navegador.

Primeiros passos

Todo endpoint é um GET HTTPS simples que devolve JSON. Teste um no terminal:

curl
curl https://www.arielton.com/api/v1/holidays/brazil/2026
O básico da API
URL basehttps://www.arielton.com/api/v1
AutenticaçãoNenhuma, sem chave nem cadastro
FormatoJSON, UTF-8, indentado
CORSAccess-Control-Allow-Origin: * em toda resposta
CacheDados de referência: public, max-age=86400. CPF/CNPJ: no-store
VersõesPrefixo /v1 no caminho. Mudanças incompatíveis sairiam como /v2
ÍndiceGET /api/v1 lista todos os endpoints

Endpoints

Endpoints
MétodoCaminhoRetorna
GET/api/v1/holidays/{country}/{year}Todos os feriados nacionais, federais e facultativos de um país em um ano
GET/api/v1/http-statusTodos os códigos com título, classe e significado em uma linha
GET/api/v1/http-status/{code}Um código com detalhes de repetição, cache e especificação
GET/api/v1/colorsAs 148 cores nomeadas do CSS e as 286 cores do Tailwind CSS v4, com hex
GET/api/v1/colors/{name}Uma cor em hex, RGB, HSL e OKLCH com contraste WCAG
GET/api/v1/cpf/validate/{cpf}Resultado dos dígitos verificadores de um CPF
POST/api/v1/cpf/validateO mesmo, com o número no corpo JSON
GET/api/v1/cnpj/validate/{cnpj}Resultado dos dígitos verificadores de um CNPJ, numérico ou alfanumérico
POST/api/v1/cnpj/validateO mesmo, com o número no corpo JSON

Toda resposta também traz source (a página do arielton.com de onde vêm os dados), docs, attribution e, nos dados de referência, updated.

Feriados

  • GET /api/v1/holidays/{country}/{year}

Feriados do Brasil, dos Estados Unidos e de Portugal em 2026, 2027 e 2028, calculados a partir das regras legais e não copiados de outro site: Lei 662/1949, Lei 9.093/1995, Lei 6.802/1980, Lei 14.759/2023 e Portaria MGI 11.460/2025 no Brasil; 5 U.S.C. 6103 e os calendários do OPM nos EUA; artigos 234 e 235 do Código do Trabalho em Portugal.

Os pontos facultativos federais (Carnaval, Corpus Christi, Quarta-feira de Cinzas até as 14h) e o feriado facultativo português (Carnaval) vêm com type "optional". Filtre esses itens quando precisar só das folgas que valem para todo mundo. Feriados estaduais e municipais não entram na lista.

Parâmetros

Feriados: Parâmetros
NomeOndeDescrição
countrypathbrazil, united-states ou portugal, ou o código ISO 3166-1 em minúsculas: br, us, pt.
yearpath2026, 2027 ou 2028.

Exemplos

curl
curl https://www.arielton.com/api/v1/holidays/brazil/2026
JavaScript (fetch)
const res = await fetch('https://www.arielton.com/api/v1/holidays/br/2027');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { holidays } = await res.json();
const daysOff = holidays
  .filter((h) => h.type !== 'optional')
  .map((h) => h.observed);
Python (requests)
import requests

res = requests.get("https://www.arielton.com/api/v1/holidays/united-states/2027", timeout=10)
res.raise_for_status()
for h in res.json()["holidays"]:
    print(h["observed"], h["name"]["en"])

Campos da resposta

Feriados: Campos da resposta
CampoTipoDescrição
countryobjectslug, código ISO e nome em inglês e português.
countnumberQuantidade de itens em holidays.
holidays[].idstringIdentificador estável, por exemplo tiradentes ou juneteenth.
holidays[].datestringData legal, AAAA-MM-DD.
holidays[].observedstringO dia de folga. Só difere de date nos feriados federais dos EUA que caem no fim de semana: sábado passa para sexta, domingo para segunda. O Ano-Novo num sábado é observado em 31 de dezembro do ano anterior.
holidays[].weekdaystringDia da semana de date, em inglês e minúsculas (monday).
holidays[].typestringnational (Brasil, Portugal), federal (EUA) ou optional.
holidays[].nameobjectNome em inglês (en) e português (pt).
holidays[].officialNamestringNome na língua oficial do país, como está na lei.
holidays[].legalBasisstringLei ou portaria que cria o dia.
holidays[].ruleobjectComo a data é definida, por extenso (fixa, dias depois da Páscoa, terceira segunda-feira).
holidays[].movablebooleantrue para datas ligadas à Páscoa.
holidays[].partialDayobject | nullPontos facultativos de meio período, como a Quarta-feira de Cinzas até as 14h.
holidays[].federalStaffOnlybooleantrue para o Dia do Servidor Público (só servidores federais).

Exemplo de resposta

Brasil 2026, primeiros 2 de 19 itens.
{
  "country": {
    "slug": "brazil",
    "code": "BR",
    "name": {
      "en": "Brazil",
      "pt": "Brasil"
    }
  },
  "year": 2026,
  "count": 19,
  "holidays": [
    {
      "id": "confraternizacao",
      "date": "2026-01-01",
      "observed": "2026-01-01",
      "weekday": "thursday",
      "type": "national",
      "name": {
        "en": "New Year's Day",
        "pt": "Confraternização Universal"
      },
      "officialName": "Confraternização Universal",
      "legalBasis": "Lei 662/1949",
      "rule": {
        "en": "Fixed: January 1",
        "pt": "Fixo: 1º de janeiro"
      },
      "movable": false,
      "partialDay": null,
      "federalStaffOnly": false
    },
    {
      "id": "carnaval-segunda",
      "date": "2026-02-16",
      "observed": "2026-02-16",
      "weekday": "monday",
      "type": "optional",
      "name": {
        "en": "Carnival Monday",
        "pt": "Carnaval (segunda-feira)"
      },
      "officialName": "Carnaval",
      "legalBasis": "Portaria MGI",
      "rule": {
        "en": "48 days before Easter",
        "pt": "48 dias antes da Páscoa"
      },
      "movable": true,
      "partialDay": null,
      "federalStaffOnly": false
    }
  ],
  "updated": "2026-09-27",
  "source": "https://www.arielton.com/holidays/brazil/2026",
  "docs": "https://www.arielton.com/developers#holidays",
  "attribution": "Data by Arielton Oberek (arielton.com). Free to use; please link to the source URL when you publish it."
}

Códigos de status HTTP

  • GET /api/v1/http-status
  • GET /api/v1/http-status/{code}

Os códigos registrados no registro de códigos de status HTTP da IANA e na RFC 9110, mais os não oficiais que aparecem em logs de verdade: 444 e 499 do nginx e a faixa 520 a 526 da Cloudflare, marcados com official: false.

Cada item traz o significado em uma linha, em inglês e português, pronto para exibir junto de uma mensagem de erro, e o link para a seção da RFC que define o código.

Parâmetros

Códigos de status HTTP: Parâmetros
NomeOndeDescrição
codepathCódigo de três dígitos, por exemplo 404. O endpoint de lista mostra todos os códigos disponíveis.

Exemplos

curl
curl https://www.arielton.com/api/v1/http-status/429
JavaScript (fetch)
const res = await fetch('https://www.arielton.com/api/v1/http-status/503');
const status = await res.json();
console.log(`${status.code} ${status.title}: ${status.meaning.en}`);
Python (requests)
import requests

codes = requests.get("https://www.arielton.com/api/v1/http-status", timeout=10).json()["statuses"]
server_errors = [s["code"] for s in codes if s["class"] == "server"]
print(server_errors)

Campos da resposta

Códigos de status HTTP: Campos da resposta
CampoTipoDescrição
codenumberO código.
titlestringFrase de motivo registrada (Not Found).
titlePtstringTradução do título para o português (Não encontrado).
classstringinformational, success, redirection, client, server ou unofficial. classInfo acrescenta a faixa (4xx) e um nome legível.
meaningobjectSignificado em uma linha, em en e pt.
officialbooleanfalse para códigos do nginx e da Cloudflare; unofficialBy diz de qual.
retryobjectSe o cliente pode repetir o pedido, em uma frase curta.
cacheablestringheuristic (cacheável por padrão, RFC 9110 seção 15.1), explicit (só com Cache-Control ou Expires), never, ou validator (304).
specobjectlabel e url do documento que define o código.
deprecatedobject | nullPreenchido para códigos reservados ou obsoletos.

Exemplo de resposta

GET /api/v1/http-status/429
{
  "code": 429,
  "title": "Too Many Requests",
  "titlePt": "Pedidos demais",
  "class": "client",
  "meaning": {
    "en": "Rate limited: too many requests in a time window. Wait, then retry.",
    "pt": "Limite de taxa atingido: pedidos demais num intervalo. Espere e tente de novo."
  },
  "official": true,
  "source": "https://www.arielton.com/http-status/429",
  "classInfo": {
    "key": "client",
    "range": "4xx",
    "name": {
      "en": "Client errors",
      "pt": "Erros do cliente"
    }
  },
  "alsoKnownAs": [],
  "unofficialBy": null,
  "deprecated": null,
  "retry": {
    "en": "Yes, after the delay in Retry-After, or with exponential backoff and jitter if there is none",
    "pt": "Sim, depois do tempo indicado em Retry-After, ou com espera exponencial e jitter se ele não vier"
  },
  "cacheable": "never",
  "spec": {
    "label": "RFC 6585 §4",
    "url": "https://www.rfc-editor.org/rfc/rfc6585#section-4"
  },
  "updated": "2026-09-27",
  "docs": "https://www.arielton.com/developers#http-status",
  "attribution": "Data by Arielton Oberek (arielton.com). Free to use; please link to the source URL when you publish it."
}

Cores

  • GET /api/v1/colors
  • GET /api/v1/colors/{name}

As 148 cores nomeadas do CSS Color Module Level 4 e a paleta padrão do Tailwind CSS v4 (tailwindcss 4.3.3). O Tailwind v4 define as cores em OKLCH; tailwind.token é o valor exato do tema, e hex é o valor sRGB depois do mapeamento de gama do CSS Color 4 quando a cor fica fora do sRGB (inSrgbGamut: false).

As razões de contraste seguem o WCAG 2.x e são truncadas em duas casas, então 4,499 vira 4,49 e reprova no AA em vez de arredondar para uma aprovação.

Parâmetros

Cores: Parâmetros
NomeOndeDescrição
namepathUma palavra-chave do CSS em minúsculas (rebeccapurple) ou uma cor do Tailwind no formato matiz-tom (blue-500).

Exemplos

curl
curl https://www.arielton.com/api/v1/colors/rebeccapurple
JavaScript (fetch)
const res = await fetch('https://www.arielton.com/api/v1/colors/blue-500');
const color = await res.json();
button.style.background = color.css.oklch;
button.style.color = color.contrast.bestText;
Python (requests)
import requests

c = requests.get("https://www.arielton.com/api/v1/colors/teal", timeout=10).json()
print(c["hex"], c["contrast"]["white"]["ratio"], c["contrast"]["white"]["aa"])

Campos da resposta

Cores: Campos da resposta
CampoTipoDescrição
kindstringcss ou tailwind.
hexstring#rrggbb em minúsculas.
rgb / hsl / oklchobjectCanais numéricos. oklch.l vai de 0 a 1.
cssobjectStrings CSS prontas para colar: hex, rgb(), hsl() e oklch().
contrastobjectRazão contra branco e preto, com aprovação AA/AAA para texto normal e grande, e bestText: a cor de texto com mais contraste.
aliases / familystring[] / stringSó cores CSS: palavras-chave de mesmo valor (gray, grey) e família de matiz.
tailwindobjectSó cores do Tailwind: hue, shade, token, inSrgbGamut.

Exemplo de resposta

GET /api/v1/colors/rebeccapurple
{
  "name": "rebeccapurple",
  "kind": "css",
  "hex": "#663399",
  "rgb": {
    "r": 102,
    "g": 51,
    "b": 153
  },
  "hsl": {
    "h": 270,
    "s": 50,
    "l": 40
  },
  "oklch": {
    "l": 0.4403,
    "c": 0.1603,
    "h": 303.37
  },
  "css": {
    "hex": "#663399",
    "rgb": "rgb(102, 51, 153)",
    "hsl": "hsl(270, 50%, 40%)",
    "oklch": "oklch(44% 0.16 303.4)"
  },
  "contrast": {
    "white": {
      "ratio": 8.4,
      "aa": true,
      "aaLarge": true,
      "aaa": true,
      "aaaLarge": true
    },
    "black": {
      "ratio": 2.49,
      "aa": false,
      "aaLarge": false,
      "aaa": false,
      "aaaLarge": false
    },
    "bestText": "white"
  },
  "aliases": [],
  "family": "purple",
  "source": "https://www.arielton.com/colors/rebeccapurple",
  "updated": "2026-09-27",
  "docs": "https://www.arielton.com/developers#colors",
  "attribution": "Data by Arielton Oberek (arielton.com). Free to use; please link to the source URL when you publish it."
}

Validação de CPF

  • GET /api/v1/cpf/validate/{cpf}
  • POST /api/v1/cpf/validate

Confere os dois dígitos verificadores do CPF (módulo 11) e recusa números com um único dígito repetido, que passam na conta mas nunca são emitidos. Não consulta a Receita Federal: válido quer dizer bem formado, não cadastrado nem regular.

O handler não guarda nem registra nada, e as respostas saem com Cache-Control: no-store, então nenhum cache de CDN ou navegador fica com elas. Com números de pessoas reais, prefira POST: um número no caminho da URL pode parar em logs de acesso de proxies e no histórico do navegador.

Parâmetros

Validação de CPF: Parâmetros
NomeOndeDescrição
cpfpath11 dígitos; pontos, hífen e espaços são ignorados.
cpfbodyCorpo JSON {"cpf": "529.982.247-25"}, até 1 KB.

Exemplos

curl
curl -X POST https://www.arielton.com/api/v1/cpf/validate \
  -H 'Content-Type: application/json' \
  -d '{"cpf": "529.982.247-25"}'
JavaScript (fetch)
const res = await fetch('https://www.arielton.com/api/v1/cpf/validate', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ cpf: input.value })
});
const { valid, formatted, message } = await res.json();
Python (requests)
import requests

r = requests.get("https://www.arielton.com/api/v1/cpf/validate/52998224725", timeout=10).json()
print(r["valid"], r["formatted"], r["reason"])

Campos da resposta

Validação de CPF: Campos da resposta
CampoTipoDescrição
validbooleantrue quando os dois dígitos verificadores conferem e os dígitos não são todos iguais.
formattedstring | nullCom máscara 000.000.000-00 quando há 11 dígitos.
reasonstringvalid, empty, invalidChars, invalidLength, repeated, firstDigit, secondDigit, bothDigits ou tooLong.
messageobjectO motivo em uma frase, em en e pt.
fiscalRegionobject | nullO 9º dígito e os estados da região fiscal que emitiu o número.

Exemplo de resposta

POST {"cpf": "529.982.247-25"}
{
  "valid": true,
  "formatted": "529.982.247-25",
  "reason": "valid",
  "message": {
    "en": "Both check digits match. This confirms the number is well formed, not that it is registered with the Receita Federal.",
    "pt": "Os dois dígitos verificadores conferem. Isso mostra que o número é bem formado, não que esteja cadastrado na Receita Federal."
  },
  "fiscalRegion": {
    "digit": 7,
    "states": [
      "ES",
      "RJ"
    ]
  },
  "source": "https://www.arielton.com/tools/cpf-validator",
  "docs": "https://www.arielton.com/developers#cpf",
  "attribution": "Data by Arielton Oberek (arielton.com). Free to use; please link to the source URL when you publish it."
}

Validação de CNPJ

  • GET /api/v1/cnpj/validate/{cnpj}
  • POST /api/v1/cnpj/validate

Valida os dois formatos de CNPJ: o clássico de 14 dígitos e o CNPJ alfanumérico que a Receita Federal emite a partir de julho de 2026, em que os 12 primeiros caracteres podem ser letras de A a Z. Cada caractere vale seu código ASCII menos 48, então o algoritmo numérico é um caso particular do novo.

O CNPJ com máscara tem uma barra, que não cabe dentro de um segmento de URL. No GET, envie os caracteres sem máscara, ou use POST.

Parâmetros

Validação de CNPJ: Parâmetros
NomeOndeDescrição
cnpjpath14 caracteres sem a barra, por exemplo 11222333000181 ou 12ABC34501DE35.
cnpjbodyCorpo JSON {"cnpj": "12.ABC.345/01DE-35"}, com ou sem máscara, até 1 KB.

Exemplos

curl
curl https://www.arielton.com/api/v1/cnpj/validate/11222333000181
JavaScript (fetch)
const res = await fetch('https://www.arielton.com/api/v1/cnpj/validate', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ cnpj: '12.ABC.345/01DE-35' })
});
const { valid, format } = await res.json();
Python (requests)
import requests

r = requests.post("https://www.arielton.com/api/v1/cnpj/validate", json={"cnpj": "12.ABC.345/01DE-35"}, timeout=10)
print(r.json()["valid"], r.json()["format"])

Campos da resposta

Validação de CNPJ: Campos da resposta
CampoTipoDescrição
validbooleantrue quando os dois dígitos verificadores conferem.
formattedstring | nullCom máscara 00.000.000/0000-00 quando há 14 caracteres.
reason / messagestring / objectMesmos valores do endpoint de CPF.
formatstring | nullnumeric ou alphanumeric.
branch / headquartersstring / booleanOs 4 caracteres da filial; 0001 é a matriz.

Exemplo de resposta

POST {"cnpj": "12.ABC.345/01DE-35"}
{
  "valid": true,
  "formatted": "12.ABC.345/01DE-35",
  "reason": "valid",
  "message": {
    "en": "Both check digits match. This confirms the number is well formed, not that the company exists or is active.",
    "pt": "Os dois dígitos verificadores conferem. Isso mostra que o número é bem formado, não que a empresa exista ou esteja ativa."
  },
  "format": "alphanumeric",
  "branch": "01DE",
  "headquarters": false,
  "source": "https://www.arielton.com/tools/cnpj-validator",
  "docs": "https://www.arielton.com/developers#cnpj",
  "attribution": "Data by Arielton Oberek (arielton.com). Free to use; please link to the source URL when you publish it."
}

Erros

Valores desconhecidos no caminho (um país, ano, código de status ou cor que a API não tem) devolvem HTTP 404. Os endpoints de referência são pré-renderizados, então confira res.ok antes de ler o corpo.

Um POST sem corpo JSON utilizável devolve 400 com {"error": {"status": 400, "message": "..."}}. CPF ou CNPJ inválido não é erro: a resposta é 200 com valid: false e o motivo.

Uso justo

  • Sem chave e sem cota fixa. Use com bom senso: a API roda em um site pessoal.
  • Guarde as respostas em cache. Os dados de referência só mudam quando uma página é revisada, e a CDN já mantém tudo por 24 horas.
  • Use GET /api/v1/http-status e GET /api/v1/colors para buscar tudo em uma requisição em vez de pedir item por item.
  • Mande um User-Agent que identifique seu app, para que um problema seja avisado a você em vez de bloqueado.
  • O serviço é gratuito e sem garantia de disponibilidade. Se o seu produto depende dele, copie os dados de que precisa; as listas são pequenas.

Crédito

O crédito é um pedido, não uma exigência. Se você publicar dados da API, coloque um link para a URL de origem da resposta, por exemplo:

HTML
<p>Feriados: <a href="https://www.arielton.com/holidays/brazil/2026">arielton.com</a></p>

Privacidade na validação de CPF e CNPJ

  • O número serve para calcular a resposta e depois é descartado. O handler não guarda, não registra em log e não envia o número a lugar nenhum.
  • As respostas saem com Cache-Control: private, no-store, então nem a CDN nem o navegador guardam cópia.
  • Como em qualquer requisição web, a URL pode aparecer nos logs de acesso padrão da hospedagem. O POST tira o número da URL.

Widgets para incorporar

Sem escrever código: a contagem regressiva do próximo feriado, a lista de feriados e o cartão de status HTTP estão disponíveis como iframes para colar em qualquer página.

Criar um widget

Precisa de uma API ou integração sob medida?

A mesma abordagem (dados estáticos, JSON pré-renderizado, nenhum banco para manter) serve para tabelas de preço, catálogos, dados internos de referência e bases públicas. O Arielton desenvolve APIs e integrações em TypeScript e Go.

Escreva para contact@arielton.com ou use a página de contato /contact.

Histórico de mudanças

  • Lançamento da v1: feriados, códigos de status HTTP, cores e validação de CPF e CNPJ.
  • Widgets para incorporar: contagem para o próximo feriado, lista de feriados e cartão de status HTTP.

Perguntas frequentes

Preciso de chave de API?
Não. Não há chave, cadastro nem conta. Faça um GET simples (ou POST, no caso de CPF e CNPJ) e leia o JSON.
Existe limite de requisições?
Não há cota fixa publicada. As respostas ficam 24 horas no cache da CDN, então guarde em cache do seu lado também e use os endpoints de lista em vez de pedir item por item. Tráfego com cara de abuso pode ser bloqueado.
Posso usar os dados em um projeto comercial?
Pode. A API é gratuita para projetos pessoais e comerciais. O crédito é um pedido, não uma exigência: um link para a URL de origem de cada resposta é o que mantém o serviço gratuito.
A API diz se um CPF existe?
Não. Ela confere os dois dígitos verificadores e a regra dos dígitos repetidos, que é tudo o que dá para saber a partir do número. Se um CPF está cadastrado e regular, só a Receita Federal informa.
Dá para chamar a API pelo navegador?
Dá. Toda resposta tem Access-Control-Allow-Origin: *, e os endpoints POST respondem ao preflight de CORS, então o fetch funciona de qualquer site sem proxy.

Revisado em por Arielton Oberek.