Aller au contenu

Edita um rascunho

PUT/api/campaigns/{id}

Auth
Jeton requis
Clé d’API:
campaigns:write
X-CommunityId
X-CommunityId Envoyez le X-CommunityId de la communauté où l’opération a lieu.
Les descriptions des endpoints viennent directement de la spécification de l’API et sont en portugais pour l’instant. L’interface autour est traduite.

Owner, admin, moderador e financeiro. Só rascunho (outro estado devolve 409). Todos os campos são opcionais; `blocks` e `audience` substituem o valor inteiro. Uma variável que não existe (ver `GET /api/campaigns/variables`) no resultado devolve 400. `emailId` troca o e-mail da biblioteca do disparo; conteúdo inline edita a versão principal do e-mail do disparo (se outro disparo usa o mesmo e-mail, cria antes uma cópia só deste).

Paramètres

NomEmplacementTypeDescription
idobligatoirepathstring (uuid)

En-têtes

NomTypeDescription
If-Unmodified-SincefacultatifstringOpcional: a versão lida (`updatedAt` do `GET`), como data HTTP, se não vier `updatedAt` no corpo. Outra gravação depois dela responde 409.
X-CommunityIdfacultatifstring (uuid)ID da comunidade em que a operação acontece. Obrigatório na maioria dos endpoints com escopo de comunidade.

Corps de la requête application/json

NomTypeDescription
updatedAtfacultatifstring (date-time)Opcional: a versão lida (`updatedAt` do `GET`). Diferente da atual responde 409; sem ela grava sem conferir.
emailIdfacultatifstring (uuid)
namefacultatifstringmax 200
subjectfacultatifstringmax 300
preheaderfacultatifstringmax 300
blocksfacultatifobject[]
blocks[].typeobligatoiretext | button | image | latestPosts | upcomingEvents | course | event | product | newCourses | newClassifieds
blocks[].htmlfacultatifstringSó em `text`. HTML rico, sanitizado como nos posts. `{{nome}}` vira o primeiro nome de cada pessoa.
blocks[].textfacultatifstringSó em `button`. · max 80
blocks[].urlfacultatifstringEm `button` (destino) e `image` (endereço; use o de `POST /api/upload/campaigns/image` ou outro https). Só http ou https.
blocks[].altfacultatifstringSó em `image`. · max 200
blocks[].countfacultatifintegerEm `latestPosts`, `upcomingEvents`, `newCourses` e `newClassifieds`: quantos itens. · ≥ 1, ≤ 10
blocks[].spaceIdfacultatifstring (uuid)Em `latestPosts`: o espaço de conteúdo (nulo = todos os abertos).
blocks[].withinDaysfacultatifintegerEm `upcomingEvents`: janela a partir do dia do envio. · ≥ 1, ≤ 90
blocks[].headingfacultatifstringEm `latestPosts` e `upcomingEvents`: título da seção (padrão traduzido). · max 80
blocks[].courseIdsfacultatifstring (uuid)[]Em `course`: de 1 a 6 cursos, na ordem em que aparecem. Ver `productIds`.
blocks[].eventIdsfacultatifstring (uuid)[]Em `event`: de 1 a 6 eventos, na ordem em que aparecem. Ver `productIds`.
blocks[].productIdsfacultatifstring (uuid)[]Em `product`: de 1 a 6 produtos, sem repetidos, na ordem em que aparecem. Um item mostra o cartão de largura inteira; dois ou mais viram uma grade de 2 por linha no computador e 1 por linha no celular. Ao salvar, todos precisam ser visíveis a todos (senão 422 em `blocks[i]`); no envio, o que deixou de ser visível some e o bloco sem nenhum item some inteiro. Lista inválida (vazia, mais de 6, repetida, id malformado) devolve 422 em `blocks[i].productIds`. Vale igual para `eventIds` e `courseIds`.
blocks[].courseIdfacultatifstring (uuid)Em `course`: forma antiga, de um curso só (equivale a `courseIds` com um item). Na resposta, espelha o primeiro de `courseIds`.
blocks[].eventIdfacultatifstring (uuid)Em `event`: forma antiga, de um evento só (equivale a `eventIds` com um item). Na resposta, espelha o primeiro de `eventIds`.
blocks[].productIdfacultatifstring (uuid)Em `product`: forma antiga, de um produto só (equivale a `productIds` com um item). Se `productIds` vier junto, vale a lista. Na resposta, espelha o primeiro de `productIds`.
audiencefacultatifobjectPúblico: a união de todos os critérios, cada pessoa uma vez, menos quem cai em qualquer item de `exclude`. Quem se descadastrou, teve bounce permanente ou reclamou nunca entra.
audience.allfacultatifbooleanToda a base da comunidade.
audience.groupIdsfacultatifstring (uuid)[]
audience.tagsfacultatifstring[]Nomes das tags.
audience.memberIdsfacultatifstring (uuid)[]Pessoas escolhidas na mão. Quem se descadastrou é recusado com erro no campo `audience.memberIds`.
audience.fieldsfacultatifobject[]Opcional. Condições por campo customizado: cada uma é mais uma parte da união, como um grupo ou uma tag (quem está no grupo X **ou** marcou Cloud). Até 10 condições somando as de `exclude.fields`. Só se aplicam no momento da prévia e de cada envio. Quem não tem valor no campo não entra.
audience.fields[].fieldIdfacultatifstring (uuid)Id do campo (`GET /api/member-fields`). Informe este ou `key`.
audience.fields[].keyfacultatifstringChave do campo (aceita também `campo_interesses`). Informe esta ou `fieldId`.
audience.fields[].operatorfacultatifoneOf | containsAny | containsAll | isTrue | isFalseSem operador: `oneOf` na escolha única e `containsAny` na múltipla; no sim/não é obrigatório.
audience.fields[].valuesfacultatifstring[]Valores (`value`) das opções; o rótulo também é aceito, sem diferenciar maiúsculas. Vazio no sim/não.
audience.excludefacultatifobjectOpcional. Quem está em qualquer um destes grupos, tem qualquer uma destas tags ou é uma destas pessoas sai do público, mesmo que também esteja num grupo ou tag incluído. Sozinho não escolhe ninguém: precisa de `all` ou de algum critério de inclusão. Grupos e pessoas precisam ser da comunidade (senão 422 em `audience.exclude.groupIds` ou `audience.exclude.memberIds`). Só aparece na resposta quando há alguma exclusão.
audience.exclude.groupIdsfacultatifstring (uuid)[]
audience.exclude.tagsfacultatifstring[]Nomes das tags.
audience.exclude.memberIdsfacultatifstring (uuid)[]
audience.exclude.fieldsfacultatifobject[]As mesmas condições de `fields`, para tirar do público ("menos quem marcou Linux").
audience.itemAccessfacultatifobjectOpcional. Modo "quem tem acesso a este conteúdo": o público é quem abre o conteúdo no app **no momento** da prévia e de cada envio (agendado ou recorrente, cada disparo recalcula): as regras do espaço (visibilidade, seção, grupos, produtos, planos, cadeado) e a visibilidade do conteúdo (`public`, `members`, `plan`; na comunidade paga, quem está sem plano só lê o que é `public`). A equipe (owner, admin, moderador, financeiro) sempre entra; o autor sem acesso, não. É um modo exclusivo, como `all`: com `all`, `groupIds`, `tags`, `memberIds` ou `fields` junto volta 422 em `audience.itemAccess`; `exclude` continua valendo. Só `type: content` por enquanto (outro tipo: 422 em `audience.itemAccess.type`). Conteúdo de outra comunidade ou apagado: 404; rascunho ou `private`: 422. Se o conteúdo for apagado ou fechado depois, o envio é recusado com 422. Não existe em workflows (422).
audience.itemAccess.typeobligatoirecontentTipo do item. `event` chega na fase 2.
audience.itemAccess.idobligatoirestring (uuid)Id do conteúdo (post ou artigo).

Réponses

StatutDescription
200Rascunho atualizado.
400Requisição inválida — falha de validação.
401Token ausente, inválido ou expirado; token de outra comunidade (o `X-CommunityId` ou o `communityId` do corpo não é o do token); token antigo ou de uma sessão encerrada (troca de senha, convite aceito). Nesses casos a mensagem pede para entrar de novo (`auth.signInAgain`).
403Autenticado, mas sem permissão para esta operação.
404Recurso não encontrado.
409Conflito com o estado atual do recurso.
422Bloco inválido, pessoa que não é da comunidade ou que se descadastrou.
500Erro interno do servidor.

Exemple curl

curl -X PUT "https://api.memberfy.net/api/campaigns/<id>" \
  -H "Authorization: Bearer $TOKEN" \
  -H "X-CommunityId: $COMMUNITY_ID" \
  -H "Content-Type: application/json" \
  -d '{}'