El endpoint /v1/zipcodes/all devuelve una lista completa de todos los códigos postales de todas las ciudades del mundo. Este endpoint es ideal para aplicaciones que necesitan poblar bases de datos con información completa de códigos postales.
GET https://api.countrydataapi.com/v1/zipcodes/all
Incluye tu clave API como parámetro de consulta:
?apikey=tu-clave-api
Tu clave API es como una contraseña, mantenla segura. Obtén tu clave desde el panel de cuenta.
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
apikey |
string | Sí | Tu clave de autenticación API |
lang |
string | No | Código de idioma para la respuesta (predeterminado: en) |
limitToken |
number | No | Máximo de tokens a gastar en esta petición (predeterminado: 1000) |
en - Inglés (predeterminado)es - Españolpt - Portuguésfr - Francésde - Alemánit - ItalianoCada código postal devuelto costará 1 token.
Importante: Este endpoint puede devolver una gran cantidad de datos. Usa
limitTokenpara controlar costos e implementa paginación para conjuntos de datos grandes.
[
{
"id": "8dd25479-067a-43b0-ac4a-8e7faf2bcaf",
"country_name": "Algeria",
"state_names": [
{
"id": "8dd25479-067a-43b0-ac4a-8e7faf2bcad",
"name": "Oran",
"postal_code": [
"31004",
"31016",
"31019",
"31020"
]
}
]
},
{
"id": "9ae35480-178b-54c1-bd5b-9f8gbf3cdeg",
"country_name": "United States",
"state_names": [
{
"id": "9ae35480-178b-54c1-bd5b-9f8gbf3cdeh",
"name": "California",
"postal_code": [
"90001",
"90002",
"90003"
]
}
]
}
]
| Campo | Tipo | Descripción |
|---|---|---|
id |
string | Identificador único del país |
country_name |
string | Nombre del país en el idioma solicitado |
state_names |
array | Array de objetos de estado que contienen códigos postales |
state_names[].id |
string | Identificador único del estado |
state_names[].name |
string | Nombre del estado/provincia |
state_names[].postal_code |
array | Array de códigos postales para este estado |
{
"success": false,
"error": {
"code": "INVALID_API_KEY",
"message": "The provided API key is invalid"
}
}
Consulta la documentación de códigos de error para todos los códigos de error posibles.
curl -X GET "https://api.countrydataapi.com/v1/zipcodes/all?apikey=tu-clave-api&lang=en&limitToken=100"
const API_KEY = 'tu-clave-api';
const BASE_URL = 'https://api.countrydataapi.com/v1';
async function getAllZipcodes(limitToken = 1000) {
try {
const response = await fetch(
`${BASE_URL}/zipcodes/all?apikey=${API_KEY}&lang=en&limitToken=${limitToken}`
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching zipcodes:', error);
throw error;
}
}
// Uso
const zipcodes = await getAllZipcodes(100);
console.log(zipcodes);
import axios from 'axios';
const API_KEY = 'tu-clave-api';
const BASE_URL = 'https://api.countrydataapi.com/v1';
async function getAllZipcodes(limitToken = 1000) {
try {
const response = await axios.get(`${BASE_URL}/zipcodes/all`, {
params: {
apikey: API_KEY,
lang: 'en',
limitToken: limitToken
}
});
return response.data;
} catch (error) {
console.error('Error fetching zipcodes:', error.response?.data || error.message);
throw error;
}
}
// Uso
const zipcodes = await getAllZipcodes(100);
console.log(zipcodes);
import { useState, useEffect } from 'react';
const API_KEY = 'tu-clave-api';
const BASE_URL = 'https://api.countrydataapi.com/v1';
function useAllZipcodes(limitToken = 1000) {
const [zipcodes, setZipcodes] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchZipcodes() {
try {
setLoading(true);
const response = await fetch(
`${BASE_URL}/zipcodes/all?apikey=${API_KEY}&lang=en&limitToken=${limitToken}`
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setZipcodes(data);
setError(null);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
}
fetchZipcodes();
}, [limitToken]);
return { zipcodes, loading, error };
}
// Ejemplo de componente
function ZipcodeList() {
const { zipcodes, loading, error } = useAllZipcodes(100);
if (loading) return <div>Cargando códigos postales...</div>;
if (error) return <div>Error: {error}</div>;
return (
<div>
<h2>Todos los Códigos Postales</h2>
{zipcodes.map(country => (
<div key={country.id}>
<h3>{country.country_name}</h3>
{country.state_names.map(state => (
<div key={state.id}>
<h4>{state.name}</h4>
<p>{state.postal_code.join(', ')}</p>
</div>
))}
</div>
))}
</div>
);
}
export default ZipcodeList;
<script setup>
import { ref, onMounted } from 'vue';
const API_KEY = 'tu-clave-api';
const BASE_URL = 'https://api.countrydataapi.com/v1';
const zipcodes = ref([]);
const loading = ref(true);
const error = ref(null);
async function fetchAllZipcodes(limitToken = 1000) {
try {
loading.value = true;
const response = await fetch(
`${BASE_URL}/zipcodes/all?apikey=${API_KEY}&lang=en&limitToken=${limitToken}`
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
zipcodes.value = await response.json();
error.value = null;
} catch (err) {
error.value = err.message;
} finally {
loading.value = false;
}
}
onMounted(() => fetchAllZipcodes(100));
</script>
<template>
<div>
<div v-if="loading">Cargando códigos postales...</div>
<div v-else-if="error">Error: {{ error }}</div>
<div v-else>
<h2>Todos los Códigos Postales</h2>
<div v-for="country in zipcodes" :key="country.id">
<h3>{{ country.country_name }}</h3>
<div v-for="state in country.state_names" :key="state.id">
<h4>{{ state.name }}</h4>
<p>{{ state.postal_code.join(', ') }}</p>
</div>
</div>
</div>
</div>
</template>
// zipcode.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';
interface State {
id: string;
name: string;
postal_code: string[];
}
interface ZipcodeResponse {
id: string;
country_name: string;
state_names: State[];
}
@Injectable({
providedIn: 'root'
})
export class ZipcodeService {
private readonly API_KEY = 'tu-clave-api';
private readonly BASE_URL = 'https://api.countrydataapi.com/v1';
constructor(private http: HttpClient) {}
getAllZipcodes(limitToken: number = 1000): Observable<ZipcodeResponse[]> {
const params = new HttpParams()
.set('apikey', this.API_KEY)
.set('lang', 'en')
.set('limitToken', limitToken.toString());
return this.http.get<ZipcodeResponse[]>(
`${this.BASE_URL}/zipcodes/all`,
{ params }
);
}
}
// zipcode-list.component.ts
import { Component, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ZipcodeService } from './zipcode.service';
@Component({
selector: 'app-zipcode-list',
standalone: true,
imports: [CommonModule],
template: `
<div *ngIf="loading">Cargando códigos postales...</div>
<div *ngIf="error">Error: {{ error }}</div>
<div *ngIf="!loading && !error">
<h2>Todos los Códigos Postales</h2>
<div *ngFor="let country of zipcodes">
<h3>{{ country.country_name }}</h3>
<div *ngFor="let state of country.state_names">
<h4>{{ state.name }}</h4>
<p>{{ state.postal_code.join(', ') }}</p>
</div>
</div>
</div>
`
})
export class ZipcodeListComponent implements OnInit {
zipcodes: any[] = [];
loading = true;
error: string | null = null;
constructor(private zipcodeService: ZipcodeService) {}
ngOnInit() {
this.zipcodeService.getAllZipcodes(100).subscribe({
next: (data) => {
this.zipcodes = data;
this.loading = false;
},
error: (err) => {
this.error = err.message;
this.loading = false;
}
});
}
}
<?php
$apiKey = 'tu-clave-api';
$limitToken = 100;
$url = "https://api.countrydataapi.com/v1/zipcodes/all?apikey={$apiKey}&lang=en&limitToken={$limitToken}";
// Usando cURL
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'Accept: application/json'
]
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
$zipcodes = json_decode($response, true);
foreach ($zipcodes as $country) {
echo "País: " . $country['country_name'] . "\n";
foreach ($country['state_names'] as $state) {
echo " Estado: " . $state['name'] . "\n";
echo " Códigos Postales: " . implode(', ', $state['postal_code']) . "\n";
}
}
} else {
echo "Error: HTTP {$httpCode}\n";
echo $response;
}
// Alternativa usando file_get_contents
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' => 'Accept: application/json'
]
]);
$response = file_get_contents($url, false, $context);
$zipcodes = json_decode($response, true);
?>
import requests
from typing import List, Dict, Any, Optional
API_KEY = 'tu-clave-api'
BASE_URL = 'https://api.countrydataapi.com/v1'
def get_all_zipcodes(limit_token: int = 1000, lang: str = 'en') -> List[Dict[str, Any]]:
"""
Obtener todos los códigos postales de todos los países.
Args:
limit_token: Máximo de tokens a gastar en esta petición
lang: Código de idioma para la respuesta
Returns:
Lista de países con sus códigos postales
"""
try:
response = requests.get(
f'{BASE_URL}/zipcodes/all',
params={
'apikey': API_KEY,
'lang': lang,
'limitToken': limit_token
},
timeout=30
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f'Error fetching zipcodes: {e}')
raise
# Uso
if __name__ == '__main__':
zipcodes = get_all_zipcodes(limit_token=100)
for country in zipcodes:
print(f"País: {country['country_name']}")
for state in country['state_names']:
print(f" Estado: {state['name']}")
print(f" Códigos Postales: {', '.join(state['postal_code'][:5])}...")
# Versión asíncrona con aiohttp
import aiohttp
import asyncio
async def get_all_zipcodes_async(limit_token: int = 1000) -> List[Dict[str, Any]]:
"""Versión asíncrona usando aiohttp"""
async with aiohttp.ClientSession() as session:
async with session.get(
f'{BASE_URL}/zipcodes/all',
params={
'apikey': API_KEY,
'lang': 'en',
'limitToken': limit_token
}
) as response:
return await response.json()
# Ejecutar async
# zipcodes = asyncio.run(get_all_zipcodes_async(100))
Siempre implementa un manejo de errores adecuado en tu aplicación:
async function getAllZipcodesWithErrorHandling() {
try {
const response = await fetch(
'https://api.countrydataapi.com/v1/zipcodes/all?apikey=tu-clave-api'
);
if (!response.ok) {
if (response.status === 401) {
throw new Error('Clave API inválida');
} else if (response.status === 429) {
throw new Error('Límite de tasa excedido. Por favor intenta más tarde.');
} else if (response.status === 402) {
throw new Error('Tokens insuficientes. Por favor actualiza tu plan.');
}
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
if (!Array.isArray(data)) {
throw new Error('Formato de respuesta inválido');
}
return data;
} catch (error) {
console.error('Error al obtener códigos postales:', error.message);
// Maneja el error apropiadamente (mostrar mensaje al usuario, reintentar, etc.)
throw error;
}
}
| Código de Error | Descripción | Solución |
|---|---|---|
INVALID_API_KEY |
La clave API es inválida | Verifica tu clave API en el panel de cuenta |
QUOTA_EXCEEDED |
Límite diario de tokens alcanzado | Actualiza tu plan o espera el reinicio |
RATE_LIMITED |
Demasiadas peticiones | Implementa limitación de tasa en tu app |
INVALID_LANGUAGE |
Código de idioma no soportado | Usa uno de los códigos de idioma soportados |
limitToken: Controla la cantidad de datos devueltos para gestionar costosConsulta nuestra página de precios para más detalles.