Saltar al contenido

Estándar abierto OAC

Una especificación JSON neutral para datos de establecimientos — tanto restaurantes como tiendas. Un solo punto de acceso devuelve todo lo que necesitas para mostrar, enrutar o reservar.

Ejemplo rápido

curl https://www.openalacarte.com/api/standard/v1/restaurants/<slug>

Sin autenticación. En caché en el borde durante 5 minutos. CORS abierto — llámalo desde un navegador.

Qué incluye la respuesta

restaurant.*

Identidad, contacto, moneda, dirección con lat/lng, horario de apertura por día, lo que aceptan (reservas / entrega / recogida).

menu.sections[].items[]

El menú activo principal del local (`sortOrder` más bajo) — nombre, descripción, precio, moneda, alérgenos, imagen — agrupado por secciones. Un local con varios menús publica uno; las respuestas con varios menús se contemplan para la v2.

spec + fetched

Sobre versionado (`openalacarte.standard/v1`) + marca de tiempo ISO para que las cachés posteriores sepan lo que tienen.

IDs estables

El `slug` del local es el identificador canónico. Los slugs se asignan al crearlo y nunca se reescriben, así que un slug que guardes seguirá siendo válido.

restaurant.venueType

O bien `restaurant`, o bien `shop`, en todas las respuestas. Ramifica por este campo — no por qué otros campos resultan estar vacíos.

Restaurantes y tiendas

Las panaderías, carnicerías, charcuterías, fruterías y vinotecas son una clase de establecimiento distinta en OpenALaCarte, y este punto de acceso también las sirve:

  • Ambas clases responden en la misma ruta /v1/restaurants/ y llegan bajo la misma clave de primer nivel restaurant. Ambas están congeladas — v1 promete que el código escrito contra él sigue funcionando, y mover las tiendas rompería exactamente eso.
  • restaurant.venueType es el discriminante. Está presente en todas las respuestas, así que puedes leerlo sin valor de reserva.
  • Una tienda siempre informa acceptsReservations: false. Las tiendas no aceptan reservas en ningún plan, así que es un hecho sobre la clase de establecimiento — nunca un restaurante que haya desactivado las reservas.
  • El campo cuisine de una tienda lleva su categoría comercial (panadería, carnicería, frutería), y su menu es su catálogo de productos, con la misma forma de secciones y artículos.
  • Una tienda que vende en puestos de mercado en lugar de en una dirección fija publica address: null y un array hours vacío. Su fila de dirección es un almacén y su horario de venta pertenece a una ruta, así que ninguno describe una puerta a la que un cliente pueda presentarse.

Versionado

SemVer a nivel de URL. Las adiciones v1.* son retrocompatibles (nuevos campos, nunca eliminados/renombrados). Los cambios incompatibles pasan a /v2/ con un solapamiento de 12 meses.

Las deprecaciones se anuncian en el registro de cambios para desarrolladores de esta página + a través del encabezado de respuesta Deprecation.

Dónde aparecen también estos datos

Los mismos datos de los locales se publican en varias formas. Para ser precisos, son representaciones paralelas y no consumidores de este endpoint:

  • Nuestro JSON-LD para Google Maps Reserve y Apple Business Connect — los mismos datos, generados desde la base de datos en lugar de obtenerse de este feed.
  • Los widgets integrados (/restaurants/[slug]) — la misma carga útil, renderizada como HTML.
  • (Futuro) integradores externos — DoorDash, Uber Eats, Tock — cuando quieran datos canónicos de OAC

¿Construyendo sobre esto? Escribe a devs@openalacarte.com y te incluiremos aquí.

¿Por qué estándar «abierto»?

Porque la especificación está documentada + versionada + estable. Nos comprometemos a no romperla. Si escribes código contra /v1/, ese código sigue funcionando — incluso si OAC cambia de rumbo, incluso si nos adquieren.