cover_urlstring | null- Portada resuelta, lista para mostrar. null si no hay imagen disponible. Nunca una ruta de Storage. Formato: uri.
cover_sourcestring | null- Origen de la imagen elegida. Valores: "period", "course", "lesson", null.
cover_expires_atstring | null- Refresca la respuesta antes de esta fecha para renovar la URL firmada. null para miniaturas o portadas servidas por la aplicación sin caducidad, o si no hay imagen. Formato: date-time.
cover_modestring- auto: primera portada del contenido en orden, curso y luego clases publicadas; custom: portada propia del periodo. Valores: "auto", "custom".
idstringobject"period"titlestringtargetobjecttarget.kindstring- Valores: "course", "single", "path", "cycle".
target.idstringcourse_idstring | null- null en un periodo de ruta o de ciclo.
parent_period_idstring | null- Periodo de origen de una venta independiente; null en aperturas principales.
independent_purchaseboolean- Este periodo abre una compra independiente, sin conceder acceso a la ruta o carrera completa.
lesson_idsarray | null- Clases originales que abre; null = curso completo, [] = alcance vacío o inválido. Nunca asumir curso entero por course_id si esta lista está limitada.
kindstring- Valores: "open", "dated".
statusstring- Valores: "active", "archived".
visibleboolean- Se ve y se vende en la web.
public_fromstring | null- Formato: date-time.
starts_atstring | null- Formato: date.
ends_atstring | null- Formato: date.
enroll_fromstring | null- Formato: date.
enroll_untilstring | null- Formato: date.
seatsinteger | null- null = sin límite.
certificatebooleancreated_atstring | null- Formato: date-time.
seats_takenintegerseats_availableinteger | null- null = sin límite.
offersarrayoffers[].idstringoffers[].object"offer"offers[].titlestring | nulloffers[].period_idstring | nulloffers[].course_idstring | nulloffers[].parent_period_idstring | null- Periodo de origen cuando esta oferta vende un curso o clase de forma independiente.
offers[].lesson_idsarray | null- Alcance por clase del periodo de esta oferta; null abre el curso entero. No presentar una oferta con clases limitadas como precio del curso completo.
offers[].typestring- Valores: "one_time", "subscription", "installments", "cohort", "free".
offers[].priceinteger- Céntimos (de cada cuota en suscripciones y plazos).
offers[].currencystringoffers[].access_kindstringoffers[].access_daysinteger | nulloffers[].installment_countinteger | nulloffers[].billing_intervalstring | null- Valores: "weekly", "biweekly", "monthly", "quarterly", null.
offers[].seatsinteger | nulloffers[].statusstring- Valores: "active", "archived".
offers[].checkout_urlstring | null- Formato: uri.
offers[].created_atstring | null- Formato: date-time.
membership_offersarraymembership_offers[].idstringObligatoriomembership_offers[].titlestringObligatoriomembership_offers[].pitchstringObligatorio- Frase de presentación en texto plano; cadena vacía si no se configuró.
membership_offers[].descriptionstringObligatorio- Descripción pública en texto plano; cadena vacía si no se configuró.
membership_offers[].benefitsarrayObligatoriomembership_offers[].benefits[].idstringObligatorio- Identificador de la línea en este plan (tipo y posición); apto como clave de renderizado, no como permiso de acceso ni identificador permanente si se reordenan beneficios.
membership_offers[].benefits[].textstringObligatorio- Texto público listo para mostrar como texto, no como HTML. Incluye los detalles configurados.
membership_offers[].benefits[].includedbooleanObligatorio- Si está incluido. Hoy, como en la página pública, solo se enumeran los beneficios incluidos (true); no se inventan exclusiones ni se heredan beneficios.
membership_offers[].badgestringObligatorio- Insignia de comunidad; cadena vacía si no se configuró. No es la etiqueta del plan destacado.
membership_offers[].featuredbooleanObligatorio- Misma regla de la página: segundo de dos planes, central con tres o más; false si solo hay uno. Depende del orden de los planes ofrecidos en este periodo.
membership_offers[].catalogstringObligatorio- Texto público del alcance que se muestra en la tarjeta; no implica acceso al catálogo general.
membership_offers[].scopeobjectObligatoriomembership_offers[].scope.kind"period"Obligatorio- Estas ofertas se contratan para un periodo, nunca como membresía general.
membership_offers[].scope.idstringObligatorio- ID del periodo donde se contrata esta membresía; puede ser el periodo de origen de una venta individual.
membership_offers[].scope.targetobjectObligatoriomembership_offers[].scope.target.kindstringObligatorio- Valores: "course", "single", "path".
membership_offers[].scope.target.idstringObligatorio- ID público del contenido de ese periodo; path abre esa ruta dentro del periodo, no toda la escuela.
membership_offers[].contributiononeOfObligatoriomembership_offers[].contribution.[opción 1].monthly_amountintegerObligatorio- Parte de la cuota mensual destinada al aporte, en céntimos de currency. Mínimo: 1.
membership_offers[].contribution.[opción 1].currencystringObligatorio- Moneda ISO 4217 del plan.
membership_offers[].contribution.[opción 1].labelstringObligatorio- Destino público del aporte.
membership_offers[].contribution.[opción 1].textstringObligatorio- Frase completa con dinero formateado en el locale de la escuela, idéntica a la tarjeta pública.
membership_offers[].monthly_priceintegerObligatorio- Precio mensual en céntimos.
membership_offers[].yearly_priceinteger | nullObligatorio- Precio anual en céntimos; null si solo se paga al mes.
membership_offers[].currencystringObligatoriomembership_offers[].checkout_urlstringObligatorio- Página de membresía del periodo, con ancla al plan y selector mensual/anual. Formato: uri.
contentarraycontent[].kindstringObligatorio- Valores: "course", "single", "lesson".
content[].course_idstringObligatoriocontent[].lesson_idstring | nullObligatorio- null en la ficha del curso; ID original en una clase.
content[].titlestringObligatoriocontent[].positionintegerObligatorio- Posición del curso en su ruta o de la clase en su curso, empezando por 1.
content[].lesson_kindstring | nullObligatorio- Tipo de clase (video, text, quiz, live…); null en un curso.
content[].independent_saleobjectObligatoriocontent[].independent_sale.enabledbooleanObligatorio- Existe una venta independiente activa y coherente para este curso o clase dentro del periodo.
content[].independent_sale.availablebooleanObligatorio- La venta está publicada, su contenido está listo, admite inscripciones y el precio es válido. Es disponibilidad de catálogo; el checkout vuelve a validar acceso, cupo y métodos de cobro.
content[].independent_sale.period_idstring | nullObligatorio- Periodo individual que abre únicamente este contenido; null si no existe una configuración coherente.
content[].independent_sale.unavailable_reasonstring | nullObligatorio- Motivo legible de indisponibilidad; null si available=true.
content[].independent_sale.offeroneOfObligatorio- Oferta propia con precio. null cuando la venta está desactivada o su alcance no coincide.
content[].independent_sale.offer.[opción 1].idstringObligatoriocontent[].independent_sale.offer.[opción 1].titlestringObligatoriocontent[].independent_sale.offer.[opción 1].priceintegerObligatorio- Precio de la compra independiente, en céntimos de currency; por cuota si type es installments o subscription.
content[].independent_sale.offer.[opción 1].typestringObligatorio- one_time en la configuración inicial de venta independiente; conserva el tipo real si se modifica desde las ofertas del periodo. Valores: "one_time", "subscription", "installments", "cohort", "free".
content[].independent_sale.offer.[opción 1].installment_countinteger | nullObligatorio- Cantidad de cuotas si type=installments; null en otro caso.
content[].independent_sale.offer.[opción 1].billing_intervalstring | nullObligatorio- Frecuencia si type=subscription (monthly por defecto); null en otro caso.
content[].independent_sale.offer.[opción 1].currencystringObligatorio- Moneda ISO 4217.
content[].independent_sale.offer.[opción 1].checkout_urlstring | nullObligatorio- Enlace de compra de esta oferta; null si available=false. No usar el checkout del periodo principal para comprar una sola clase. Formato: uri.
content[].membership_offersarrayObligatorio- Planes que incluyen este contenido por el periodo solicitado, su periodo de curso o el de origen de una venta individual. scope.id y checkout_url conservan el alcance real; el mismo plan puede aparecer para distintos alcances.
content[].membership_offers[].idstringObligatoriocontent[].membership_offers[].titlestringObligatoriocontent[].membership_offers[].pitchstringObligatorio- Frase de presentación en texto plano; cadena vacía si no se configuró.
content[].membership_offers[].descriptionstringObligatorio- Descripción pública en texto plano; cadena vacía si no se configuró.
content[].membership_offers[].benefitsarrayObligatoriocontent[].membership_offers[].benefits[].idstringObligatorio- Identificador de la línea en este plan (tipo y posición); apto como clave de renderizado, no como permiso de acceso ni identificador permanente si se reordenan beneficios.
content[].membership_offers[].benefits[].textstringObligatorio- Texto público listo para mostrar como texto, no como HTML. Incluye los detalles configurados.
content[].membership_offers[].benefits[].includedbooleanObligatorio- Si está incluido. Hoy, como en la página pública, solo se enumeran los beneficios incluidos (true); no se inventan exclusiones ni se heredan beneficios.
content[].membership_offers[].badgestringObligatorio- Insignia de comunidad; cadena vacía si no se configuró. No es la etiqueta del plan destacado.
content[].membership_offers[].featuredbooleanObligatorio- Misma regla de la página: segundo de dos planes, central con tres o más; false si solo hay uno. Depende del orden de los planes ofrecidos en este periodo.
content[].membership_offers[].catalogstringObligatorio- Texto público del alcance que se muestra en la tarjeta; no implica acceso al catálogo general.
content[].membership_offers[].scopeobjectObligatoriocontent[].membership_offers[].scope.kind"period"Obligatorio- Estas ofertas se contratan para un periodo, nunca como membresía general.
content[].membership_offers[].scope.idstringObligatorio- ID del periodo donde se contrata esta membresía; puede ser el periodo de origen de una venta individual.
content[].membership_offers[].scope.targetobjectObligatoriocontent[].membership_offers[].scope.target.kindstringObligatorio- Valores: "course", "single", "path".
content[].membership_offers[].scope.target.idstringObligatorio- ID público del contenido de ese periodo; path abre esa ruta dentro del periodo, no toda la escuela.
content[].membership_offers[].contributiononeOfObligatoriocontent[].membership_offers[].contribution.[opción 1].monthly_amountintegerObligatorio- Parte de la cuota mensual destinada al aporte, en céntimos de currency. Mínimo: 1.
content[].membership_offers[].contribution.[opción 1].currencystringObligatorio- Moneda ISO 4217 del plan.
content[].membership_offers[].contribution.[opción 1].labelstringObligatorio- Destino público del aporte.
content[].membership_offers[].contribution.[opción 1].textstringObligatorio- Frase completa con dinero formateado en el locale de la escuela, idéntica a la tarjeta pública.
content[].membership_offers[].monthly_priceintegerObligatorio- Precio mensual en céntimos.
content[].membership_offers[].yearly_priceinteger | nullObligatorio- Precio anual en céntimos; null si solo se paga al mes.
content[].membership_offers[].currencystringObligatoriocontent[].membership_offers[].checkout_urlstringObligatorio- Página de membresía del periodo, con ancla al plan y selector mensual/anual. Formato: uri.