Documentación de la API - Endpoints y Ejemplos

Pais por ciudad

Descripcion general

El endpoint de pais por ciudad te permite encontrar el pais que contiene una ciudad especifica. Esto es util para aplicaciones de geocodificacion, validacion de direcciones y servicios basados en ubicacion donde necesitas determinar el pais a partir del nombre de una ciudad.


Autenticacion

Todas las solicitudes requieren una clave API pasada como parametro de consulta. Puedes obtener tu clave API registrandote en CountryDataAPI.

Peticion

HTTP GET

https://api.countrydataapi.com/v1/countries/city

Retorna el pais que tiene esa ciudad.

Algunos ejemplos de la estructura

Pais: EEUU, Estado: Colorado, Ciudad: Denver

Pais: Espana, Estado: Comunidad Valenciana, Ciudad: Valencia

Informacion relevante

Ten en cuenta que hay muchas ciudades con el mismo nombre

Hay 4 tipos de operaciones:

  • BASIC: Retorna los campos id, lang, country_name, country_short_iso, country_phone_code, country_cca2, country_ccn3, country_cca3, country_cioc.

  • NORMAL: Retorna los campos anteriores y agrega country_independent, country_status, country_unMember, country_flag, country_map_googleMaps, country_map_openStreetMaps, country_fifa, country_flag_png, country_flag_svg, country_flag_alt, country_coatOfArms_png, country_coatOfArms_svg, country_startofWeek, country_continent_code, country_current_currency, country_GDP, country_location, country_land, country_terrain, country_climate, country_natural_hazards, country_note, country_history, country_GDP_per_capita_PPP, country_life_expectancy, country_median_age, country_birth_rate, country_death_rate, country_sex_ratio, country_literacy, country_roadways, country_airports, country_railways, country_waterways, country_heliports, country_airports_paved, country_wikipedia_url.

  • ADVANCED: Retorna los campos anteriores y agrega country_car_info, _country_idd_info.

  • ALL: Retorna los campos anteriores y agrega country_tld, country_capital, country_altSpellings, country_latLng, country_borders, country_timezones, country_continents, country_currencies, country_languages, country_translations, country_capital_info, country_demonyms, country_name.nativeName.

Cada pais retornado con el metodo BASIC costara 1 tokens.

Cada pais retornado con el metodo NORMAL costara 2 tokens.

Cada pais retornado con el metodo ADVANCED costara 3 tokens.

Cada pais retornado con el metodo ALL costara 4 tokens.

Parametros de consulta


Parametro Tipo Descripcion
apikey requerido, token Clave de autenticacion de la cuenta
city requerido, string Nombre de la ciudad que se encuentra en el pais
limitToken opcional, number 1000 (por defecto). Numero maximo de paises a retornar
lang opcional, lang en (por defecto). Idioma esperado de la respuesta
fields opcional, string id,lang,country_name (por defecto). Campos esperados en la respuesta

Respuesta

Ejemplo de respuesta

[
  {
    "id": "f7a8b9c0-1234-5678-90ab-cdef12345678",
    "lang": "en",
    "country_name": "United States",
    "country_short_iso": "US",
    "country_phone_code": "1",
    "country_cca2": "US",
    "country_ccn3": "840",
    "country_cca3": "USA",
    "country_cioc": "USA"
  }
]

Ejemplos de codigo

cURL

curl -X GET "https://api.countrydataapi.com/v1/countries/city?apikey=YOUR_API_KEY&city=Denver"

JavaScript (Fetch)

const API_KEY = 'YOUR_API_KEY';

async function getCountryByCity(cityName) {
  try {
    const response = await fetch(
      `https://api.countrydataapi.com/v1/countries/city?apikey=${API_KEY}&city=${encodeURIComponent(cityName)}`
    );

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }

    const countries = await response.json();
    console.log(countries);
    return countries;
  } catch (error) {
    console.error('Error fetching country by city:', error);
    throw error;
  }
}

// Find country for Denver
getCountryByCity('Denver');

JavaScript (Axios)

import axios from 'axios';

const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://api.countrydataapi.com/v1';

async function getCountryByCity(cityName) {
  try {
    const { data } = await axios.get(`${BASE_URL}/countries/city`, {
      params: {
        apikey: API_KEY,
        city: cityName,
        fields: 'id,country_name,country_short_iso,country_flag_png'
      }
    });

    console.log(data);
    return data;
  } catch (error) {
    console.error('Error fetching country by city:', error.response?.data || error.message);
    throw error;
  }
}

// Find country for Valencia
getCountryByCity('Valencia');

React

import { useState } from 'react';

const API_KEY = 'YOUR_API_KEY';

function CityToCountrySearch() {
  const [city, setCity] = useState('');
  const [countries, setCountries] = useState([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  async function handleSearch(e) {
    e.preventDefault();
    if (!city.trim()) return;

    setLoading(true);
    setError(null);

    try {
      const response = await fetch(
        `https://api.countrydataapi.com/v1/countries/city?apikey=${API_KEY}&city=${encodeURIComponent(city)}`
      );

      if (!response.ok) {
        throw new Error('Failed to find country');
      }

      const data = await response.json();
      setCountries(data);
    } catch (err) {
      setError(err.message);
    } finally {
      setLoading(false);
    }
  }

  return (
    <div className="city-search">
      <h2>Find Country by City</h2>

      <form onSubmit={handleSearch}>
        <input
          type="text"
          value={city}
          onChange={(e) => setCity(e.target.value)}
          placeholder="Enter city name..."
        />
        <button type="submit" disabled={loading}>
          {loading ? 'Searching...' : 'Search'}
        </button>
      </form>

      {error && <div className="error">Error: {error}</div>}

      {countries.length > 0 && (
        <div className="results">
          <h3>Results ({countries.length} countries found)</h3>
          <p className="note">Note: Some cities exist in multiple countries</p>
          <ul>
            {countries.map((country) => (
              <li key={country.id}>
                <span className="flag">{country.country_flag}</span>
                <span className="name">{country.country_name}</span>
                <span className="code">({country.country_cca2})</span>
              </li>
            ))}
          </ul>
        </div>
      )}
    </div>
  );
}

export default CityToCountrySearch;

Vue 3

<script setup>
import { ref } from 'vue';

const API_KEY = 'YOUR_API_KEY';

const city = ref('');
const countries = ref([]);
const loading = ref(false);
const error = ref(null);

async function searchByCity() {
  if (!city.value.trim()) return;

  loading.value = true;
  error.value = null;

  try {
    const response = await fetch(
      `https://api.countrydataapi.com/v1/countries/city?apikey=${API_KEY}&city=${encodeURIComponent(city.value)}`
    );

    if (!response.ok) {
      throw new Error('Failed to find country');
    }

    countries.value = await response.json();
  } catch (err) {
    error.value = err.message;
  } finally {
    loading.value = false;
  }
}
</script>

<template>
  <div class="city-search">
    <h2>Find Country by City</h2>

    <form @submit.prevent="searchByCity">
      <input
        v-model="city"
        type="text"
        placeholder="Enter city name..."
      />
      <button type="submit" :disabled="loading">
        {{ loading ? 'Searching...' : 'Search' }}
      </button>
    </form>

    <div v-if="error" class="error">Error: {{ error }}</div>

    <div v-if="countries.length > 0" class="results">
      <h3>Results ({{ countries.length }} countries found)</h3>
      <p class="note">Note: Some cities exist in multiple countries</p>
      <ul>
        <li v-for="country in countries" :key="country.id">
          <span class="flag">{{ country.country_flag }}</span>
          <span class="name">{{ country.country_name }}</span>
          <span class="code">({{ country.country_cca2 }})</span>
        </li>
      </ul>
    </div>
  </div>
</template>

Angular

import { Component, inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';

interface Country {
  id: string;
  country_name: string;
  country_short_iso: string;
  country_cca2: string;
  country_flag?: string;
}

@Component({
  selector: 'app-city-search',
  standalone: true,
  imports: [CommonModule, FormsModule],
  template: `
    <div class="city-search">
      <h2>Find Country by City</h2>

      <form (ngSubmit)="searchByCity()">
        <input
          [(ngModel)]="city"
          name="city"
          type="text"
          placeholder="Enter city name..."
        />
        <button type="submit" [disabled]="loading">
          {{ loading ? 'Searching...' : 'Search' }}
        </button>
      </form>

      <div *ngIf="error" class="error">Error: {{ error }}</div>

      <div *ngIf="countries.length > 0" class="results">
        <h3>Results ({{ countries.length }} countries found)</h3>
        <p class="note">Note: Some cities exist in multiple countries</p>
        <ul>
          <li *ngFor="let country of countries">
            <span class="flag">{{ country.country_flag }}</span>
            <span class="name">{{ country.country_name }}</span>
            <span class="code">({{ country.country_cca2 }})</span>
          </li>
        </ul>
      </div>
    </div>
  `
})
export class CitySearchComponent {
  private http = inject(HttpClient);
  private readonly API_KEY = 'YOUR_API_KEY';
  private readonly BASE_URL = 'https://api.countrydataapi.com/v1';

  city = '';
  countries: Country[] = [];
  loading = false;
  error: string | null = null;

  searchByCity(): void {
    if (!this.city.trim()) return;

    this.loading = true;
    this.error = null;

    this.http.get<Country[]>(
      `${this.BASE_URL}/countries/city`,
      {
        params: {
          apikey: this.API_KEY,
          city: this.city
        }
      }
    ).subscribe({
      next: (data) => {
        this.countries = data;
        this.loading = false;
      },
      error: (err) => {
        this.error = err.message;
        this.loading = false;
      }
    });
  }
}

Python

import requests
from urllib.parse import quote

API_KEY = 'YOUR_API_KEY'
BASE_URL = 'https://api.countrydataapi.com/v1'

def get_country_by_city(city_name):
    """Find the country that contains a specific city."""
    try:
        response = requests.get(
            f'{BASE_URL}/countries/city',
            params={
                'apikey': API_KEY,
                'city': city_name
            }
        )
        response.raise_for_status()

        countries = response.json()
        return countries
    except requests.exceptions.RequestException as e:
        print(f'Error fetching country by city: {e}')
        raise

# Usage
if __name__ == '__main__':
    # Find country for Denver
    city_name = 'Denver'
    countries = get_country_by_city(city_name)

    print(f"Countries containing '{city_name}':")
    for country in countries:
        print(f"  - {country['country_name']} ({country['country_short_iso']})")

    # Note: Some cities exist in multiple countries
    city_name = 'Valencia'
    countries = get_country_by_city(city_name)

    print(f"\nCountries containing '{city_name}':")
    for country in countries:
        print(f"  - {country['country_name']} ({country['country_short_iso']})")

PHP

<?php

$apiKey = 'YOUR_API_KEY';
$baseUrl = 'https://api.countrydataapi.com/v1';

function getCountryByCity($apiKey, $baseUrl, $cityName) {
    $url = sprintf(
        '%s/countries/city?apikey=%s&city=%s',
        $baseUrl,
        urlencode($apiKey),
        urlencode($cityName)
    );

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => ['Accept: application/json']
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode !== 200) {
        throw new Exception("HTTP Error: $httpCode");
    }

    return json_decode($response, true);
}

// Usage
try {
    // Find country for Denver
    $cityName = 'Denver';
    $countries = getCountryByCity($apiKey, $baseUrl, $cityName);

    echo "Countries containing '$cityName':\n";
    foreach ($countries as $country) {
        echo sprintf(
            "  - %s (%s)\n",
            $country['country_name'],
            $country['country_short_iso']
        );
    }

    // Note: Some cities exist in multiple countries
    $cityName = 'Valencia';
    $countries = getCountryByCity($apiKey, $baseUrl, $cityName);

    echo "\nCountries containing '$cityName':\n";
    foreach ($countries as $country) {
        echo sprintf(
            "  - %s (%s)\n",
            $country['country_name'],
            $country['country_short_iso']
        );
    }
} catch (Exception $e) {
    echo 'Error: ' . $e->getMessage();
}

Manejo de errores

Codigo de estado Descripcion
200 Exito - Retorna array de paises
400 Solicitud incorrecta - Falta el parametro requerido city
401 No autorizado - Clave API invalida o faltante
404 No encontrado - No se encontro ningun pais con esa ciudad
429 Demasiadas solicitudes - Limite de tasa excedido
500 Error interno del servidor - Algo salio mal de nuestro lado

Ejemplo de respuesta de error

{
  "statusCode": 404,
  "message": "No country found with city: UnknownCity",
  "error": "Not Found"
}

Notas

  • Nombres de ciudad duplicados: Muchas ciudades comparten el mismo nombre en diferentes paises (ej., "Valencia" existe en Espana y Venezuela). La API puede retornar multiples paises al buscar tales ciudades.
  • Distincion de mayusculas/minusculas: Los nombres de ciudades no distinguen entre mayusculas y minusculas.
  • Caracteres especiales: Los nombres de ciudades con caracteres especiales (acentos, dieresis) deben estar codificados en URL.