Si tu stack es PHP — ya sea Laravel, Symfony o vanilla — integrar la API de feriados.io es cuestión de minutos. Todos los endpoints responden JSON estándar y usan autenticación Bearer token, que cualquier cliente HTTP de PHP soporta sin dependencias adicionales.
Autenticación
Todos los endpoints requieren un API key en el header Authorization:
Authorization: Bearer frd_tu_api_key
FERIADOS_API_KEY=frd_tu_api_key
Con file_get_contents (sin dependencias)
<?php$apiKey = getenv(‘FERIADOS_API_KEY’); $date = date(‘Y-m-d’); // hoy
$context = stream_context_create([ ‘http’ => [ ‘header’ => “Authorization: Bearer {$apiKey}\r\n”, ], ]);
$url = “https://api.feriados.io/v1/CL/is-business-day?date={$date}”; $res = file_get_contents($url, false, $context); $data = json_decode($res, true)[‘data’];
if (!$data[‘is_business_day’]) { echo “Hoy es feriado en Chile ({$data[‘day_of_week’]}), saltando proceso.”; } else { procesarCobros(); }
Con cURL
<?phpfunction isBusinessDay(string $country, string $date): bool { $apiKey = getenv(‘FERIADOS_API_KEY’); $url = “https://api.feriados.io/v1/{$country}/is-business-day?date={$date}”;
$ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer {$apiKey}"], ]); $res = curl_exec($ch); curl_close($ch); return json_decode($res, true)['data']['is_business_day'];}
function addBusinessDays(string $country, string $date, int $days): string { $apiKey = getenv(‘FERIADOS_API_KEY’); $url = “https://api.feriados.io/v1/{$country}/business-days/add” . “?date={$date}&days={$days}”;
$ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer {$apiKey}"], ]); $res = curl_exec($ch); curl_close($ch); return json_decode($res, true)['data']['result_date'];}
// Uso $hoy = date(‘Y-m-d’); $esHabil = isBusinessDay(‘CO’, $hoy); $entrega = addBusinessDays(‘MX’, $hoy, 5); // requiere plan Starter, Team o Business
Con Laravel (Http facade)
<?phpnamespace App\Services;
use Illuminate\Support\Facades\Http;
class FeriadosService { private string $baseUrl = ‘https://api.feriados.io/v1’;
private function client() { return Http::withToken(config('services.feriados.key')); } public function isBusinessDay(string $country, string $date): bool { $res = $this->client() ->get("{$this->baseUrl}/{$country}/is-business-day", [ 'date' => $date, ]); return $res->json('data.is_business_day'); } public function addBusinessDays(string $country, string $date, int $days): string { $res = $this->client() ->get("{$this->baseUrl}/{$country}/business-days/add", [ 'date' => $date, 'days' => $days, ]); return $res->json('data.result_date'); } public function countBusinessDays(string $country, string $from, string $to): int { $res = $this->client() ->get("{$this->baseUrl}/{$country}/business-days/between", [ 'from' => $from, 'to' => $to, ]); return $res->json('data.business_days'); }}
'feriados' => [
'key' => env('FERIADOS_API_KEY'),
],
public function calcularEntrega(Request $request, FeriadosService $feriados): JsonResponse
{
$fechaDespacho = $request->date('fecha_despacho')->toDateString();
$fechaEntrega = $feriados->addBusinessDays('CL', $fechaDespacho, 3);
return response()->json(['entrega' => $fechaEntrega]);
}
Con Symfony (HttpClient)
<?phpnamespace App\Service;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class FeriadosClient { private const BASE = ‘https://api.feriados.io/v1’;
public function __construct( private HttpClientInterface $http, private string $apiKey ) {} public function isBusinessDay(string $country, string $date): bool { $res = $this->http->request('GET', self::BASE . "/{$country}/is-business-day", [ 'headers' => ['Authorization' => "Bearer {$this->apiKey}"], 'query' => ['date' => $date], ]); return $res->toArray()['data']['is_business_day']; } public function nextHoliday(string $country): array { $res = $this->http->request('GET', self::BASE . "/{$country}/next-holiday", [ 'headers' => ['Authorization' => "Bearer {$this->apiKey}"], ]); return $res->toArray()['data']; }}
App\Service\FeriadosClient:
arguments:
$apiKey: '%env(FERIADOS_API_KEY)%'
Manejo de errores
La API devuelve siempre un success: bool. Para producción, valida el status HTTP y el campo success:
function safeIsBusinessDay(string $country, string $date): ?bool
{
$apiKey = getenv('FERIADOS_API_KEY');
$url = "https://api.feriados.io/v1/{$country}/is-business-day?date={$date}";
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer {$apiKey}"],
CURLOPT_TIMEOUT => 3,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($body === false || $status !== 200) {
return null; // fallback a tu lógica default
}
$json = json_decode($body, true);
return $json['success'] ? $json['data']['is_business_day'] : null;
}
Los errores retornan success: false con error.code y error.status. Los más comunes: API_KEY_REQUIRED (401), RATE_LIMIT_EXCEEDED (429), COUNTRY_NOT_SUPPORTED (404).
Lista para producción en menos de 5 minutos
Sin tarjeta de crédito. El plan Free cubre is-business-day y consulta de feriados.
API key gratis — sin tarjeta →