Saltar al contenido

Orden de creación

Qué tiene que existir antes de cada llamada, de dónde sale cada id, la secuencia de los flujos habituales y los errores que aparecen cuando se salta un paso.

Casi todo en Memberfy depende de algo creado antes: la lección necesita el módulo, el módulo el curso, el curso el espacio. Llamar a la API fuera de orden no rompe nada, pero cada llamada adelantada se rechaza. Esta guía muestra el orden correcto y el id que pasa de una llamada a la siguiente.

El mapa de dependencias

Estructura y contenidoComunidad→Sección→Espacio (módulo)→Publicación · Evento · Imagen
CursosEspacio de Cursos→Curso→Módulo→Lección
VentaCobro aprobado→Vender y retirar
SuscripciónOpción de cobro→Plan→Adicionales del plan→Downsell
AccesoPlan o producto→Acceso del espacio
DescuentoProductos→Cupón

Dicho de otra forma:

Para crear…Necesitas antes…Y pasas
Espaciouna secciónsectionId
Publicación, evento, curso, imagenun espaciospaceId
Módulo de cursoun cursocourseId
Lecciónun módulomoduleId
Planlas opciones de cobro (productos SUBSCRIPTION)productIds
Adicional en el planel plan, y un producto mensual que no sea opción de ningún planaddOnProductIds
Acceso a un espacio por plan o productoel plan o el productoaccess.subscriptionGroupIds, access.productIds
Cupón solo para algunos productoslos productosapplicableProducts
Cualquier venta o retiroInformación Empresarial y cuenta de cobro aprobadas—

En todas las llamadas de abajo van Authorization y X-CommunityId. Consulta Autenticación y X-CommunityId.

Curso

  1. Sección (si todavía no hay ninguna): POST /api/sections con title y visibility. Guarda data.id como sectionId.
  2. Espacio de Cursos: POST /api/spaces con sectionId, title y module: "courses". Guarda el spaceId.
  3. Curso: POST /api/courses con communityId (el mismo de la cabecera), spaceId, title, slug y level (beginner, intermediate, advanced). Nace como borrador. Guarda el courseId.
  4. Módulos: POST /api/courses/module con courseId y title, uno por módulo. Guarda cada moduleId.
  5. Lecciones: POST /api/courses/lesson con moduleId, title y type (text, image, video, link).
  6. Publicar: PUT /api/courses/{id} con status: "published". Solo un curso publicado acepta matrículas.

Para ajustarlo después: PUT y DELETE /api/courses/module/{moduleId} renombran, reordenan y eliminan un módulo (con sus clases); PUT y DELETE /api/courses/lesson/{lessonId} cambian el título, el tipo, la duración y el orden de una clase, la llevan a otro módulo del mismo curso (moduleId) y la eliminan. Eliminar conserva el progreso de quien ya la vio.

Para vender el curso, sigue con un producto que abra el espacio (consulta Evento, pasos 3 y 4, que valen igual).

Mentoría

Un grupo con su propio tablón, encuentros y cobro mensual. (Con la duración del contrato, la opción del paso 3 incorpora commitmentMonths.)

  1. Espacio privado del grupo: POST /api/spaces con module: "feed" y visibility: "private". Guarda el spaceId.
  2. Encuentros: POST /api/events, uno por encuentro, con spaceId, title, slug, type: "online", startTime y endTime.
  3. Opción de cobro: POST /api/products con type: "SUBSCRIPTION", title, price, billingInterval: "MONTHLY" y allowedPaymentMethods. Guarda el id del producto.
  4. Plan: POST /api/subscription-groups con name y productIds: [<id del paso 3>]. Guarda el id del plan.
  5. Abrir el espacio al plan: PUT /api/spaces/{id} con access: { "subscriptionGroupIds": [<id del plan>] }.

El paso 5 solo funciona después del 4: el plan tiene que existir para poder citarlo en el acceso.

Evento

Un evento presencial con entrada de pago y aviso en el Feed.

  1. Espacio de Eventos: POST /api/spaces con module: "events".
  2. Evento: POST /api/events con spaceId, title, slug, type: "in_person", startTime, endTime y la dirección (street, number, city…).
  3. Entrada: POST /api/products con type: "ONE_TIME", price, hasStock: true y stockQuantity. Después, publícala.
  4. Abrir el espacio a quien compró: PUT /api/spaces/{id} con visibility: "private" y access: { "productIds": [<id de la entrada>] }.
  5. Aviso fijado: POST /api/content en el espacio del Feed, y PUT /api/feed/{type}/{id}/pin con el id de la publicación.

Plan con adicionales

  1. Opciones de cobro del plan: un POST .../products por opción (Mensual, Anual), type: "SUBSCRIPTION".
  2. El adicional: otro POST .../products, type: "SUBSCRIPTION", billingInterval: "MONTHLY". No entra en los productIds de ningún plan.
  3. Plan: POST .../subscription-groups con los productIds del paso 1.
  4. Adicionales en el plan: PUT .../subscription-groups/{id} con addOnProductIds: [<id del paso 2>].

Antes de vender: el cobro

Un orden que vale para cualquier venta:

  1. POST .../business-information y .../submit.
  2. POST .../payout-settings y .../submit.
  3. Esperar las dos aprobaciones (hasta 7 días laborables). GET .../payout-settings/prerequisites dice lo que falta.

Los productos, las opciones, los planes, los adicionales, los cupones y las ofertas de downsell se pueden crear y editar antes de la aprobación: el producto nace DRAFT, con la moneda del país de la Información Empresarial (en cualquier estado) o BRL si no la hay. Publicar (POST .../products/{id}/publish, o PUT .../products/{id} con status: ACTIVE), el checkout y el retiro esperan la aprobación. Una Información Empresarial aprobada que se edita vuelve a PENDING y necesita .../submit de nuevo; hasta la nueva aprobación, el checkout rechaza los pagos.

Los errores de quien se salta un paso

Con Accept-Language: es-ES, la mayoría de los mensajes llega en español; algunos llegan todavía en inglés o en portugués, y aquí aparecen tal como los devuelve la API.

LlamadaFaltabaRespuesta
POST /api/spacesla sección400 · Seção não encontrada ou não pertence a esta comunidade. ("Sección no encontrada o no pertenece a esta comunidad")
POST /api/spaces (o PUT)la sección es más restringida400 · This space cannot be more open than the section "…", which is …
PUT /api/spaces/{id} con accessel plan, producto o grupo citado400 · The access grant "…" does not exist in this community. (param: access)
POST /api/coursesel espacio400 · ID do espaço é obrigatório. o Espaço não encontrado ou não pertence a esta comunidade. ("Espacio obligatorio" / "Espacio no encontrado")
POST /api/courses/moduleel curso404 · Course not found
POST /api/courses/lessonel módulo404 · Module not found
POST .../subscription-groupslas opciones de cobro400 · Producto no encontrado
PUT .../subscription-groups/{id} con addOnProductIdsel producto del adicional, o ya es opción de un plan400 · Uno de los complementos no existe en esta comunidad o fue eliminado. / Un producto que es opción de cobro de un plan no puede ser complemento de otro.
Configuración del checkoutel cobro aprobado400 · Configuração de pagamento não foi realizada para esta comunidade ("No se ha configurado el cobro para esta comunidad")
POST .../products/{id}/publish (o PUT con status: ACTIVE)la Información Empresarial aprobada403 · Para publicar y empezar a vender, la comunidad necesita tener la información empresarial aprobada…
POST .../products/{id}/publishel producto en la moneda del país aprobado400 · Este producto está en …, pero la moneda de la información empresarial aprobada es … (param: currency)
POST /api/checkoutla Información Empresarial aprobada403 · La comunidad debe tener información comercial aprobada para habilitar productos de pago
POST .../payoutssaldo para el importe y la comisión400 · Saldo insuficiente. Disponible: …
Cualquierala cabecera400 · X-CommunityId é obrigatório / Community ID is required

Algunas validaciones de formato responden en inglés (como Valid course ID is required cuando el id no es un UUID).

Consejos

  • Guarda cada id que vuelve en data.id: es el que pide la llamada siguiente.
  • Envía el mismo communityId en el cuerpo (cuando la ruta lo pide) y en la cabecera.
  • Repetir no deshace: si una secuencia se para a medias, continúa desde el paso que falló, en lugar de empezar de nuevo (empezar de nuevo crea duplicados).
  • En el MCP, las herramientas compuestas harán este orden por su cuenta.