Ordem de criação
O que precisa existir antes de cada chamada, de onde vem cada id, a sequência dos fluxos comuns e os erros que aparecem quando um passo é pulado.
Quase tudo na Memberfy depende de algo criado antes: a aula precisa do módulo, o módulo do curso, o curso do espaço. Chamar a API fora de ordem não estraga nada, mas cada chamada adiantada é recusada. Este guia mostra a ordem certa e o id que passa de uma chamada para a seguinte.
O mapa de dependências
Lido de outro jeito:
| Para criar… | Precisa antes de… | E passa |
|---|---|---|
| Espaço | uma secção | sectionId |
| Post, evento, curso, imagem | um espaço | spaceId |
| Módulo de curso | um curso | courseId |
| Aula | um módulo | moduleId |
| Plano | as opções de faturação (produtos SUBSCRIPTION) | productIds |
| Adicional no plano | o plano, e um produto mensal que não seja opção de plano | addOnProductIds |
| Acesso a um espaço por plano ou produto | o plano ou o produto | access.subscriptionGroupIds, access.productIds |
| Cupão só para alguns produtos | os produtos | applicableProducts |
| Qualquer venda ou levantamento | Informação Comercial e conta de recebimento aprovadas | — |
Em todas as chamadas abaixo vão Authorization e X-CommunityId. Ver Autenticação e X-CommunityId.
Curso
- Secção (se ainda não houver):
POST /api/sectionscomtitleevisibility. Guardedata.idcomosectionId. - Espaço de Cursos:
POST /api/spacescomsectionId,titleemodule: "courses". Guarde ospaceId. - Curso:
POST /api/coursescomcommunityId(o mesmo do header),spaceId,title,slugelevel(beginner,intermediate,advanced). Nasce como rascunho. Guarde ocourseId. - Módulos:
POST /api/courses/modulecomcourseIdetitle, um por módulo. Guarde cadamoduleId. - Aulas:
POST /api/courses/lessoncommoduleId,titleetype(text,image,video,link). - Publicar:
PUT /api/courses/{id}comstatus: "published". Só curso publicado aceita matrícula.
Para ajustar depois: PUT e DELETE /api/courses/module/{moduleId} mudam o nome, reordenam e eliminam um módulo (com as aulas); PUT e DELETE /api/courses/lesson/{lessonId} mudam o título, o tipo, a duração e a ordem de uma aula, passam a aula para outro módulo do mesmo curso (moduleId) e eliminam-na. Eliminar guarda o progresso de quem já a viu.
Para vender o curso, siga com um produto que libera o espaço (veja Evento, passos 3 e 4, que valem igual).
Mentoria
Uma turma com mural próprio, encontros e cobrança mensal. (Com a duração do contrato, a opção do passo 3 ganha commitmentMonths.)
- Espaço privado da turma:
POST /api/spacescommodule: "feed"evisibility: "private". Guarde ospaceId. - Encontros:
POST /api/events, um por encontro, comspaceId,title,slug,type: "online",startTimeeendTime. - Opção de faturação:
POST /api/productscomtype: "SUBSCRIPTION",title,price,billingInterval: "MONTHLY"eallowedPaymentMethods. Guarde oiddo produto. - Plano:
POST /api/subscription-groupscomnameeproductIds: [<id do passo 3>]. Guarde oiddo plano. - Liberar o espaço para o plano:
PUT /api/spaces/{id}comaccess: { "subscriptionGroupIds": [<id do plano>] }.
O passo 5 só funciona depois do 4: o plano precisa existir para ser citado no acesso.
Evento
Um evento presencial com ingresso pago e aviso no Feed.
- Espaço de Eventos:
POST /api/spacescommodule: "events". - Evento:
POST /api/eventscomspaceId,title,slug,type: "in_person",startTime,endTimee o endereço (street,number,city…). - Ingresso:
POST /api/productscomtype: "ONE_TIME",price,hasStock: trueestockQuantity. Depois, publique. - Liberar o espaço para quem comprou:
PUT /api/spaces/{id}comvisibility: "private"eaccess: { "productIds": [<id do ingresso>] }. - Aviso fixado:
POST /api/contentno espaço do Feed, ePUT /api/feed/{type}/{id}/pincom o id do post.
Plano com adicionais
- Opções de faturação do plano: um
POST .../productspor opção (Mensal, Anual),type: "SUBSCRIPTION". - O adicional: outro
POST .../products,type: "SUBSCRIPTION",billingInterval: "MONTHLY". Ele não entra emproductIdsde plano nenhum. - Plano:
POST .../subscription-groupscomproductIdsdo passo 1. - Adicionais no plano:
PUT .../subscription-groups/{id}comaddOnProductIds: [<id do passo 2>].
Antes de vender: o recebimento
Uma ordem que vale para qualquer venda:
POST .../business-informatione.../submit.POST .../payout-settingse.../submit.- Esperar as duas aprovações (até 7 dias úteis).
GET .../payout-settings/prerequisitesdiz o que falta.
Produtos, opções, planos, adicionais, cupões e ofertas de downsell podem ser criados e editados antes da aprovação: o produto nasce DRAFT, com a moeda do país da Informação Comercial (em qualquer estado) ou BRL sem ela. Publicar (POST .../products/{id}/publish, ou PUT .../products/{id} com status: ACTIVE), o checkout e o levantamento esperam pela aprovação. Uma Informação Comercial aprovada que seja editada volta a PENDING e precisa de novo de .../submit; até à nova aprovação, o checkout recusa.
Os erros de quem pulou um passo
| Chamada | Faltou | Resposta |
|---|---|---|
POST /api/spaces | a secção | 400 · Secção não encontrada ou não pertence a esta comunidade. |
POST /api/spaces (ou PUT) | a secção é mais fechada | 400 · Este espaço não pode ser mais aberto que a secção "…", que é … |
PUT /api/spaces/{id} com access | o plano, produto ou grupo citado | 400 · A concessão de acesso "…" não existe nesta comunidade. (param: access) |
POST /api/courses | o espaço | 400 · ID do espaço é obrigatório. ou Espaço não encontrado ou não pertence a esta comunidade. |
POST /api/courses/module | o curso | 404 · Curso não encontrado. |
POST /api/courses/lesson | o módulo | 404 · Módulo não encontrado. |
POST .../subscription-groups | as opções de faturação | 400 · Produto não encontrado |
PUT .../subscription-groups/{id} com addOnProductIds | o produto do adicional, ou ele já é opção de um plano | 400 · Um dos adicionais não existe nesta comunidade ou foi eliminado. / Um produto que é opção de faturação de um plano não pode ser adicional de outro. |
| Configuração do checkout | o recebimento aprovado | 400 · Configuração de pagamento não foi realizada para esta comunidade |
POST .../products/{id}/publish (ou PUT com status: ACTIVE) | a Informação Comercial aprovada | 403 · Para publicar e começar a vender, a comunidade tem de ter as informações comerciais aprovadas… |
POST .../products/{id}/publish | o produto na moeda do país aprovado | 400 · Este produto está em … mas a moeda das informações comerciais aprovadas é … (param: currency) |
POST /api/checkout | a Informação Comercial aprovada | 403 · A comunidade deve ter informações de negócio aprovadas para habilitar produtos pagos |
POST .../payouts | saldo para o valor e a taxa | 400 · Saldo insuficiente. Disponível: … |
| Qualquer uma | o header | 400 · X-CommunityId é obrigatório |
Algumas validações de formato ainda respondem em inglês (como Valid course ID is required quando o id não é um UUID).
Dicas
- Guarde cada id que volta em
data.id: é ele que a chamada seguinte pede. - Envie o mesmo
communityIdno corpo (quando a rota pede) e no header. - Repetir não desfaz: se uma sequência parar no meio, continue do passo que falhou, em vez de recomeçar (recomeçar cria duplicados).
- No MCP, as ferramentas compostas fazem essa ordem sozinhas.