La API del Maker
Agrega y actualiza tus Listings desde un script o un agente, con los mismos campos que tiene el Editor. Un Listing nuevo siempre llega como Borrador; publicar queda dentro del tope de tus Listings.
Tu token
Envía tu token en cada llamada. Cada Maker tiene uno; al rotarlo, el anterior deja de funcionar de inmediato.
Authorization: Bearer YOUR_TOKEN
Hasta 60 llamadas por minuto. Tu token solo llega a tu propio Catálogo.
El paquete
Un Listing viaja como un archivo JSON más sus medios. La API lee y devuelve la misma forma, así que un paquete que descargas se puede enviar de vuelta tal cual.
| CAMPO | TIPO | NOTA |
|---|---|---|
slug | string | Único dentro de tu Catálogo. Se vuelve overnighters.app/@tu/apps/slug. |
kind | external | Siempre External para los Makers. Solo las apps del Operador son Alojadas. |
external_url | url | Dónde corre el Listing. |
category | key | Una clave de las Categorías compartidas. |
name_en | string | Los textos necesitan al menos inglés o español; el otro usa el que exista. |
name_es | string | La misma regla que name_en. |
tagline_en | string | Hasta 70 caracteres. |
tagline_es | string | Hasta 70 caracteres. |
description_en | text | Texto simple. Una línea en blanco empieza un párrafo. |
description_es | text | Texto simple. Una línea en blanco empieza un párrafo. |
tags | array | Una lista de palabras cortas. |
ships_in | array | Idiomas que habla el Listing: es, en. |
tech_stack | string | Texto libre. |
launched_on | date | AAAA-MM-DD. |
for_sale | boolean | Abre la Consulta de interés de compra. |
asking_price | integer | Dólares enteros. Omítelo para Abierto a ofertas. |
featured | boolean | Máximo uno por Catálogo; destacar uno reemplaza al anterior. |
acquired | boolean | Para apps Externas que cambiaron de manos. |
status | draft|published|retired | Se ignora al crear. Al actualizar: draft, published o retired. El Listing debe estar completo para publicarse. |
retired_mode | farewell|redirect | farewell (por omisión) o redirect. Se usa cuando status es retired. |
redirect_url | url | Adónde van los visitantes tras un retiro con redirección. |
Medios
Envía los archivos como partes multipart llamadas cover, shot-1, shot-2, shot-3, loop. Imágenes de hasta 10 MB; el loop es un MP4 o WebM corto y sin sonido.
{
"slug": "lonchera",
"kind": "external",
"external_url": "https://lonchera.app",
"category": "kitchen",
"name_en": "Lonchera",
"tagline_en": "A week of school lunches, planned on Sunday.",
"tagline_es": "Una semana de loncheras, planeada el domingo.",
"ships_in": ["es", "en"],
"for_sale": true,
"asking_price": 1200
}
Endpoints
GET/maker/api/listings/:slug
Devuelve el paquete de uno de tus Listings, con las URL de sus medios.
curl https://overnighters.app/maker/api/listings/lonchera \
-H "Authorization: Bearer $OVERNIGHTERS_TOKEN"
POST/maker/api/listings
Crea un Borrador a partir de un paquete y sus archivos. Nunca publica.
curl https://overnighters.app/maker/api/listings \
-H "Authorization: Bearer $OVERNIGHTERS_TOKEN" \
-F "package=@lonchera/package.json;type=application/json" \
-F "cover=@lonchera/cover.png" \
-F "shot-1=@lonchera/shot-1.png" \
-F "loop=@lonchera/loop.mp4"
PATCH/maker/api/listings/:slug
Cambia solo los campos y archivos que envíes. Envía status published para publicar.
curl -X PATCH https://overnighters.app/maker/api/listings/lonchera \
-H "Authorization: Bearer $OVERNIGHTERS_TOKEN" \
-F 'package={"asking_price": 900, "status": "published"};type=application/json'
Cuando algo falla
400- No hay paquete, o no es JSON válido.
401- No hay token, el token ya se rotó o la cuenta está suspendida.
403- Llegaste a tu límite de Listings, así que este Listing no se puede publicar. Los Borradores se siguen guardando; despublica o retira un Listing, o pide más espacio.
404- No hay un Listing con ese slug en tu Catálogo.
409- El slug ya está ocupado en tu Catálogo. La respuesta trae el paquete existente para que compares.
422- El paquete no es válido. La respuesta indica qué falla.
429- Demasiadas llamadas. Espera un minuto.