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
Dicho de otra forma:
| Para crear… | Necesitas antes… | Y pasas |
|---|---|---|
| Espacio | una sección | sectionId |
| Publicación, evento, curso, imagen | un espacio | spaceId |
| Módulo de curso | un curso | courseId |
| Lección | un módulo | moduleId |
| Plan | las opciones de cobro (productos SUBSCRIPTION) | productIds |
| Adicional en el plan | el plan, y un producto mensual que no sea opción de ningún plan | addOnProductIds |
| Acceso a un espacio por plan o producto | el plan o el producto | access.subscriptionGroupIds, access.productIds |
| Cupón solo para algunos productos | los productos | applicableProducts |
| Cualquier venta o retiro | Informació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
- Sección (si todavía no hay ninguna):
POST /api/sectionscontitleyvisibility. Guardadata.idcomosectionId. - Espacio de Cursos:
POST /api/spacesconsectionId,titleymodule: "courses". Guarda elspaceId. - Curso:
POST /api/coursesconcommunityId(el mismo de la cabecera),spaceId,title,slugylevel(beginner,intermediate,advanced). Nace como borrador. Guarda elcourseId. - Módulos:
POST /api/courses/moduleconcourseIdytitle, uno por módulo. Guarda cadamoduleId. - Lecciones:
POST /api/courses/lessonconmoduleId,titleytype(text,image,video,link). - Publicar:
PUT /api/courses/{id}constatus: "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.)
- Espacio privado del grupo:
POST /api/spacesconmodule: "feed"yvisibility: "private". Guarda elspaceId. - Encuentros:
POST /api/events, uno por encuentro, conspaceId,title,slug,type: "online",startTimeyendTime. - Opción de cobro:
POST /api/productscontype: "SUBSCRIPTION",title,price,billingInterval: "MONTHLY"yallowedPaymentMethods. Guarda eliddel producto. - Plan:
POST /api/subscription-groupsconnameyproductIds: [<id del paso 3>]. Guarda eliddel plan. - Abrir el espacio al plan:
PUT /api/spaces/{id}conaccess: { "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.
- Espacio de Eventos:
POST /api/spacesconmodule: "events". - Evento:
POST /api/eventsconspaceId,title,slug,type: "in_person",startTime,endTimey la dirección (street,number,city…). - Entrada:
POST /api/productscontype: "ONE_TIME",price,hasStock: trueystockQuantity. Después, publícala. - Abrir el espacio a quien compró:
PUT /api/spaces/{id}convisibility: "private"yaccess: { "productIds": [<id de la entrada>] }. - Aviso fijado:
POST /api/contenten el espacio del Feed, yPUT /api/feed/{type}/{id}/pincon el id de la publicación.
Plan con adicionales
- Opciones de cobro del plan: un
POST .../productspor opción (Mensual, Anual),type: "SUBSCRIPTION". - El adicional: otro
POST .../products,type: "SUBSCRIPTION",billingInterval: "MONTHLY". No entra en losproductIdsde ningún plan. - Plan:
POST .../subscription-groupscon losproductIdsdel paso 1. - Adicionales en el plan:
PUT .../subscription-groups/{id}conaddOnProductIds: [<id del paso 2>].
Antes de vender: el cobro
Un orden que vale para cualquier venta:
POST .../business-informationy.../submit.POST .../payout-settingsy.../submit.- Esperar las dos aprobaciones (hasta 7 días laborables).
GET .../payout-settings/prerequisitesdice 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.
| Llamada | Faltaba | Respuesta |
|---|---|---|
POST /api/spaces | la sección | 400 · 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 restringida | 400 · This space cannot be more open than the section "…", which is … |
PUT /api/spaces/{id} con access | el plan, producto o grupo citado | 400 · The access grant "…" does not exist in this community. (param: access) |
POST /api/courses | el espacio | 400 · 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/module | el curso | 404 · Course not found |
POST /api/courses/lesson | el módulo | 404 · Module not found |
POST .../subscription-groups | las opciones de cobro | 400 · Producto no encontrado |
PUT .../subscription-groups/{id} con addOnProductIds | el producto del adicional, o ya es opción de un plan | 400 · 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 checkout | el cobro aprobado | 400 · 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 aprobada | 403 · Para publicar y empezar a vender, la comunidad necesita tener la información empresarial aprobada… |
POST .../products/{id}/publish | el producto en la moneda del país aprobado | 400 · Este producto está en …, pero la moneda de la información empresarial aprobada es … (param: currency) |
POST /api/checkout | la Información Empresarial aprobada | 403 · La comunidad debe tener información comercial aprobada para habilitar productos de pago |
POST .../payouts | saldo para el importe y la comisión | 400 · Saldo insuficiente. Disponible: … |
| Cualquiera | la cabecera | 400 · 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
communityIden 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.