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 https://www.arielton.com/api/v1/holidays/brazil/2026| URL base | https://www.arielton.com/api/v1 |
|---|---|
| Autenticação | Nenhuma, sem chave nem cadastro |
| Formato | JSON, UTF-8, indentado |
| CORS | Access-Control-Allow-Origin: * em toda resposta |
| Cache | Dados de referência: public, max-age=86400. CPF/CNPJ: no-store |
| Versões | Prefixo /v1 no caminho. Mudanças incompatíveis sairiam como /v2 |
| Índice | GET /api/v1 lista todos os endpoints |
Endpoints
| Método | Caminho | Retorna |
|---|---|---|
| GET | /api/v1/holidays/{country}/{year} | Todos os feriados nacionais, federais e facultativos de um país em um ano |
| GET | /api/v1/http-status | Todos 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/colors | As 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/validate | O 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/validate | O 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
| Nome | Onde | Descrição |
|---|---|---|
country | path | brazil, united-states ou portugal, ou o código ISO 3166-1 em minúsculas: br, us, pt. |
year | path | 2026, 2027 ou 2028. |
Exemplos
curl https://www.arielton.com/api/v1/holidays/brazil/2026const 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);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
| Campo | Tipo | Descrição |
|---|---|---|
country | object | slug, código ISO e nome em inglês e português. |
count | number | Quantidade de itens em holidays. |
holidays[].id | string | Identificador estável, por exemplo tiradentes ou juneteenth. |
holidays[].date | string | Data legal, AAAA-MM-DD. |
holidays[].observed | string | O 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[].weekday | string | Dia da semana de date, em inglês e minúsculas (monday). |
holidays[].type | string | national (Brasil, Portugal), federal (EUA) ou optional. |
holidays[].name | object | Nome em inglês (en) e português (pt). |
holidays[].officialName | string | Nome na língua oficial do país, como está na lei. |
holidays[].legalBasis | string | Lei ou portaria que cria o dia. |
holidays[].rule | object | Como a data é definida, por extenso (fixa, dias depois da Páscoa, terceira segunda-feira). |
holidays[].movable | boolean | true para datas ligadas à Páscoa. |
holidays[].partialDay | object | null | Pontos facultativos de meio período, como a Quarta-feira de Cinzas até as 14h. |
holidays[].federalStaffOnly | boolean | true para o Dia do Servidor Público (só servidores federais). |
Exemplo de resposta
{
"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
| Nome | Onde | Descrição |
|---|---|---|
code | path | Código de três dígitos, por exemplo 404. O endpoint de lista mostra todos os códigos disponíveis. |
Exemplos
curl https://www.arielton.com/api/v1/http-status/429const 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}`);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
| Campo | Tipo | Descrição |
|---|---|---|
code | number | O código. |
title | string | Frase de motivo registrada (Not Found). |
titlePt | string | Tradução do título para o português (Não encontrado). |
class | string | informational, success, redirection, client, server ou unofficial. classInfo acrescenta a faixa (4xx) e um nome legível. |
meaning | object | Significado em uma linha, em en e pt. |
official | boolean | false para códigos do nginx e da Cloudflare; unofficialBy diz de qual. |
retry | object | Se o cliente pode repetir o pedido, em uma frase curta. |
cacheable | string | heuristic (cacheável por padrão, RFC 9110 seção 15.1), explicit (só com Cache-Control ou Expires), never, ou validator (304). |
spec | object | label e url do documento que define o código. |
deprecated | object | null | Preenchido para códigos reservados ou obsoletos. |
Exemplo de resposta
{
"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
| Nome | Onde | Descrição |
|---|---|---|
name | path | Uma palavra-chave do CSS em minúsculas (rebeccapurple) ou uma cor do Tailwind no formato matiz-tom (blue-500). |
Exemplos
curl https://www.arielton.com/api/v1/colors/rebeccapurpleconst 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;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
| Campo | Tipo | Descrição |
|---|---|---|
kind | string | css ou tailwind. |
hex | string | #rrggbb em minúsculas. |
rgb / hsl / oklch | object | Canais numéricos. oklch.l vai de 0 a 1. |
css | object | Strings CSS prontas para colar: hex, rgb(), hsl() e oklch(). |
contrast | object | Razã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 / family | string[] / string | Só cores CSS: palavras-chave de mesmo valor (gray, grey) e família de matiz. |
tailwind | object | Só cores do Tailwind: hue, shade, token, inSrgbGamut. |
Exemplo de resposta
{
"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
| Nome | Onde | Descrição |
|---|---|---|
cpf | path | 11 dígitos; pontos, hífen e espaços são ignorados. |
cpf | body | Corpo JSON {"cpf": "529.982.247-25"}, até 1 KB. |
Exemplos
curl -X POST https://www.arielton.com/api/v1/cpf/validate \
-H 'Content-Type: application/json' \
-d '{"cpf": "529.982.247-25"}'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();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
| Campo | Tipo | Descrição |
|---|---|---|
valid | boolean | true quando os dois dígitos verificadores conferem e os dígitos não são todos iguais. |
formatted | string | null | Com máscara 000.000.000-00 quando há 11 dígitos. |
reason | string | valid, empty, invalidChars, invalidLength, repeated, firstDigit, secondDigit, bothDigits ou tooLong. |
message | object | O motivo em uma frase, em en e pt. |
fiscalRegion | object | null | O 9º dígito e os estados da região fiscal que emitiu o número. |
Exemplo de resposta
{
"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
| Nome | Onde | Descrição |
|---|---|---|
cnpj | path | 14 caracteres sem a barra, por exemplo 11222333000181 ou 12ABC34501DE35. |
cnpj | body | Corpo JSON {"cnpj": "12.ABC.345/01DE-35"}, com ou sem máscara, até 1 KB. |
Exemplos
curl https://www.arielton.com/api/v1/cnpj/validate/11222333000181const 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();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
| Campo | Tipo | Descrição |
|---|---|---|
valid | boolean | true quando os dois dígitos verificadores conferem. |
formatted | string | null | Com máscara 00.000.000/0000-00 quando há 14 caracteres. |
reason / message | string / object | Mesmos valores do endpoint de CPF. |
format | string | null | numeric ou alphanumeric. |
branch / headquarters | string / boolean | Os 4 caracteres da filial; 0001 é a matriz. |
Exemplo de resposta
{
"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:
<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.
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.