> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tukanmx.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Conteo por isócrona

> Genera un área de tiempo de traslado alrededor de un punto y obtén los lugares dentro de ella.

Cuenta los lugares que hay dentro de un área de tiempo de traslado, como *"todo lo que está a 10 minutos en coche de esta esquina"*.

Manda hasta **10 puntos**, en coordenadas o en direcciones, y recibe para cada uno el área alcanzable en km² y los lugares activos dentro de ella.

* `travel_mode` acepta `DRIVE` (default), `WALK` o `BICYCLE`.
* `duration_minutes` va de 1 a 60 (default 10).
* `coordinates` y `addresses` son **mutuamente excluyentes**. Las direcciones se resuelven automáticamente a coordenadas.

Los lugares vienen en formato ligero, con ID, marca y coordenadas. Los puntos cuya isócrona no se pudo generar aparecen en `isochrone_errors` sin abortar el resto del lote, y las direcciones que no se pudieron resolver, en `geocode_errors`.

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "https://client.tukanmx.com/tukan-atlas/places/isochrone/" \
    -H "Authorization: Token $API_TUKAN" \
    -H "Content-Type: application/json" \
    -d '{
      "coordinates": [[19.7060, -101.1950]],
      "travel_mode": "DRIVE",
      "duration_minutes": 10
    }'
  ```

  ```python Python theme={null}
  import os
  import requests

  headers = {"Authorization": f"Token {os.environ['API_TUKAN']}"}

  # Lugares a 10 minutos en coche del centro de Morelia
  resp = requests.post(
      "https://client.tukanmx.com/tukan-atlas/places/isochrone/",
      headers=headers,
      json={
          "coordinates": [[19.7060, -101.1950]],
          "travel_mode": "DRIVE",
          "duration_minutes": 10,
      },
  )
  resp.raise_for_status()
  for zona in resp.json()["results"]:
      print(f"{zona['area_km2']} km2, {zona['places_count']} lugares")
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "results": [
      {
        "index": 0,
        "latitude": 19.706,
        "longitude": -101.195,
        "travel_mode": "DRIVE",
        "duration_minutes": 10,
        "area_km2": 14.3481,
        "places_count": 1,
        "places": [
          {
            "id": 125,
            "brand_name": "Farmacias del Ahorro",
            "geography": {"latitude": 19.7241, "longitude": -101.1839}
          }
        ]
      }
    ],
    "isochrone_errors": []
  }
  ```
</ResponseExample>


## OpenAPI

````yaml es/atlas/openapi-atlas.json POST /places/isochrone/
openapi: 3.0.3
info:
  title: Atlas API
  description: >-
    API para consultar indicadores geoespaciales, catálogos geográficos y
    densidad de lugares en México.
  version: 1.0.0
  contact:
    name: Soporte Tukan
    email: contacto@tukanmx.com
servers:
  - url: https://client.tukanmx.com/tukan-atlas
    description: Servidor de producción
security:
  - tokenAuth: []
paths:
  /places/isochrone/:
    post:
      summary: Lugares dentro de una isócrona
      description: >-
        Genera un polígono de tiempo de traslado (isócrona) alrededor de hasta
        10 coordenadas o direcciones y regresa los lugares activos dentro de
        cada uno, con su área en km2. Modos: manejando, caminando o en
        bicicleta, de 1 a 60 minutos.
      operationId: getPlacesIsochrone
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IsochroneRequest'
      responses:
        '200':
          description: Isócronas generadas exitosamente
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IsochroneResponse'
        '400':
          description: Solicitud inválida
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Token de autenticación inválido o ausente
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Error interno del servidor
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    IsochroneRequest:
      type: object
      description: >-
        Manda coordinates o addresses, no ambos. Las direcciones se resuelven
        automáticamente a coordenadas antes de generar la isócrona.
      properties:
        coordinates:
          type: array
          maxItems: 10
          description: >-
            Hasta 10 puntos [latitud, longitud]. Mutuamente excluyente con
            addresses.
          items:
            type: array
            items:
              type: number
            minItems: 2
            maxItems: 2
          example:
            - - 19.706
              - -101.195
        addresses:
          type: array
          maxItems: 10
          description: >-
            Hasta 10 direcciones. Se resuelven automáticamente a coordenadas.
            Mutuamente excluyente con coordinates.
          items:
            type: string
          example:
            - Av. Madero Poniente 100, Centro, Morelia, Michoacán
        travel_mode:
          type: string
          enum:
            - DRIVE
            - WALK
            - BICYCLE
          default: DRIVE
          description: Modo de traslado
        duration_minutes:
          type: number
          minimum: 1
          maximum: 60
          default: 10
          description: Tiempo de traslado en minutos (1 a 60)
    IsochroneResponse:
      type: object
      properties:
        results:
          type: array
          items:
            allOf:
              - $ref: '#/components/schemas/IsochroneResultBase'
              - type: object
                properties:
                  places_count:
                    type: integer
                    description: Lugares activos dentro de la isócrona
                    example: 1
                  places:
                    type: array
                    items:
                      $ref: '#/components/schemas/PlaceLightItem'
        isochrone_errors:
          type: array
          items:
            $ref: '#/components/schemas/IsochroneError'
        geocode_errors:
          type: array
          items:
            $ref: '#/components/schemas/GeocodeError'
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
    IsochroneResultBase:
      type: object
      properties:
        index:
          type: integer
          description: Posición original en coordinates o addresses
          example: 0
        latitude:
          type: number
          example: 19.706
        longitude:
          type: number
          example: -101.195
        address:
          type: string
          description: 'Solo en modo addresses: la dirección original'
        travel_mode:
          type: string
          example: DRIVE
        duration_minutes:
          type: number
          example: 10
        area_km2:
          type: number
          description: Área de la isócrona en kilómetros cuadrados
          example: 14.3481
    PlaceLightItem:
      type: object
      description: 'Versión ligera de un lugar: identidad, marca y ubicación.'
      properties:
        id:
          type: integer
          example: 76504
        brand_name:
          type: string
          example: BanBajío
        geography:
          type: object
          properties:
            latitude:
              type: number
              example: 19.7023379
            longitude:
              type: number
              example: -101.2079899
    IsochroneError:
      type: object
      description: Punto cuya isócrona no se pudo generar. No aborta el resto del lote.
      properties:
        index:
          type: integer
          description: Posición original en coordinates o addresses
          example: 1
        latitude:
          type: number
          example: 19.4326
        longitude:
          type: number
          example: -99.1332
        address:
          type: string
          description: Solo en modo addresses
        error:
          type: string
          example: Could not generate isochrone
    GeocodeError:
      type: object
      description: >-
        Dirección que no se pudo resolver a coordenadas (solo en modo
        addresses).
      properties:
        address:
          type: string
        error:
          type: string
  securitySchemes:
    tokenAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Token de autenticación. Formato requerido: Token tu-token (la palabra
        Token, un espacio y tu token). Solicita tu token escribiendo a
        contacto@tukanmx.com.

````