Aller au contenu

Atualiza products

PUT/api/products/{id}

Auth
Jeton requis
Qui peut l’appeler:
owner
admin
moderator
finance
Clé d’API:
store: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.

Uma atualização que mexe em `type`, `subscriptionGroupIds` ou `prerequisiteGroupIds` e deixaria uma opção de cobrança (`SUBSCRIPTION` que não é adicional) sem nenhum plano não excluído responde 400 com `param = subscriptionGroupIds`. Plano só desativado ainda conta. Estoque (E1): uma atualização que mexe em `type`, `hasStock` ou `stockQuantity` e deixaria `hasStock` sem quantidade (400, `param = stockQuantity`) ou em `SUBSCRIPTION` (400, `param = hasStock`) é recusada. O `stockQuantity` enviado é o disponível agora (E9). Owner, admin ou **financeiro** (preço é trabalho financeiro; o financeiro edita preço, `capacity`, publica/despublica e define os planos que incluem o produto; criar e excluir continuam de owner e admin, e o moderador só lê; os outros papéis recebem 403). Aceita `directLinkEnabled` (boolean opcional) para ligar ou desligar a compra por link direto de um produto avulso; omitido, mantém o valor atual. `prerequisiteGroupIds` (array de UUID opcional) substitui os planos que o adicional exige; `[]` limpa, omitido mantém. Mesmas validações da criação: grupo de outra comunidade ou grupo em que o produto está dá 400. A resposta traz `prerequisiteGroupIds`. **Obsoleto na escrita:** prefira `addOnProductIds` no plano; este campo continua aceito e gravando. `commitmentMonths` (1 a 36, ou `null` para remover o contrato) muda a duração do contrato; omitido, mantém. É conferido contra o produto depois da atualização: só `SUBSCRIPTION` `MONTHLY` (senão 400, `param = commitmentMonths`). Vale para assinaturas novas e para a renovação do contrato das existentes; uma assinatura feita sem contrato continua sem. `installmentInterestPayer` (`BUYER` ou `ORGANIZATION`): quem paga os juros de parcelamento no cartão. Ausente não muda. **`status: ACTIVE` é publicar** e segue as regras de `POST .../publish`: sem informações comerciais `APPROVED`, 403 com a mensagem traduzida que aponta onde preenchê-las; com a moeda do produto diferente da do país aprovado, 400 (`param = currency`). As mesmas regras valem ao trocar `currency` de um produto já `ACTIVE`. Editar qualquer outro campo, de rascunho ou de produto no ar, não exige aprovação. `currency` (BRL, USD, EUR, GBP, MXN ou ARS) e `status` (DRAFT, ACTIVE, INACTIVE ou BLOCKED) fora da lista dão 400 traduzido. A primeira ida a `ACTIVE` agenda o aviso por e-mail da loja como em `POST .../publish` (campo opcional `notifyByEmail`, padrão ligado) e a resposta traz `data.emailNotice`. Um `slug` novo que já está em uso por outro produto, ativo ou excluído, responde 400 (`param = slug`); a corrida com outra gravação, 409 (`param = slug`). A resposta traz `pricingMode` e `pointsPrice`.

Paramètres

NomEmplacementTypeDescription
idobligatoirepathstring

En-têtes

NomTypeDescription
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
titlefacultatifstring
descriptionfacultatifstringHTML.
shortDescriptionfacultatifstring
internalNamefacultatifstringNome visto só pela equipe.
bannerUrlfacultatifstring (uri)
featuredImageUrlfacultatifstring (uri)
slugfacultatifstring
typefacultatifSUBSCRIPTION | ONE_TIME | INSTALLMENT
pricefacultatifnumber`0` é produto gratuito (`ONE_TIME` ou `SUBSCRIPTION`; `INSTALLMENT` com preço 0 dá 400, `param = price`). Um gratuito vai ao ar sem informações comerciais aprovadas; o cliente o pega por `POST /api/checkout`, sem cobrança. · ≥ 0
kindfacultatifdigital | physical | event | course | downloadO que o produto é, independente de `type` (a forma de cobrar). `digital` (padrão, estoque opcional); `physical` (estoque obrigatório: `hasStock` + `stockQuantity`, senão 400 `param = hasStock`; o checkout pede o endereço de entrega). `event` e `course` nascem com o evento ou o curso (1:1) e **não** se criam por esta rota (400, `param = kind`); `download` é reservado. Não muda depois de criado (400 `param = kind`).
capacityfacultatifintegerSó na edição de produto `event`/`course`: capacidade **total** (vagas). `null` = ilimitada. As vagas livres (`available`) são recalculadas; reduzir abaixo dos inscritos não remove ninguém. Nesses produtos `hasStock`/`stockQuantity` dão 400 (`param = capacity`). · ≥ 0
includedInPlanIdsfacultatifstring (uuid)[]Planos (grupos de assinatura) que incluem este produto sem custo extra; quem tem assinatura ativa de um deles tem o produto. Substitui a lista; `[]` limpa; omitido mantém.
billingIntervalfacultatifHOURLY | DAILY | WEEKLY | MONTHLY | YEARLYSó para `SUBSCRIPTION`.
trialDaysfacultatifinteger≥ 0, ≤ 365
requiresCardForTrialfacultatifboolean
allowCancellationfacultatifboolean
commitmentMonthsfacultatifintegerFidelidade. Só `SUBSCRIPTION` `MONTHLY`. · ≥ 1, ≤ 36
installmentsfacultatifintegerPara `INSTALLMENT`. · ≥ 2, ≤ 24
installmentPricefacultatifnumber≥ 0.01
allowedPaymentMethodsfacultatifstring[]Métodos aceitos no checkout, como `CREDIT_CARD`, `PIX` e `BOLETO`.
maxInstallmentsfacultatifinteger≥ 1, ≤ 12
installmentInterestPayerfacultatifBUYER | ORGANIZATION
feePayerfacultatifORGANIZATION | BUYER
accessDurationfacultatifintegerDias de acesso; ausente = vitalício. Na edição, null volta o produto a vitalício. · ≥ 1
hasStockfacultatifbooleanControla estoque. Só produto avulso (`ONE_TIME`, `INSTALLMENT`); em `SUBSCRIPTION` responde 400 (`param = hasStock`). Exige `stockQuantity` (400, `param = stockQuantity`).
stockQuantityfacultatifintegerUnidades disponíveis agora: o número informado é o disponível, e cada pedido em aberto já desconta a dele. Visível só nas respostas de gestão; o comprador vê apenas `soldOut`. · ≥ 0
isHighlightedfacultatifboolean
directLinkEnabledfacultatifboolean
grantedCreditsfacultatifintegerCréditos concedidos uma vez quando a compra é concluída (idempotente por compra; reembolso ou contestação revoga o que não foi usado). Só produto digital de pagamento único (outro tipo: 400, `param = grantedCredits`). Valor acima de 0 exige um space de Reservas ou de Agendamento na comunidade, senão 403. Produto incluído em plano não concede. Padrão 0. · ≥ 0, ≤ 100000
grantedCreditsValidityDaysfacultatifintegerValidade, em dias, dos créditos de `grantedCredits`; `null` ou ausente = não vencem. · ≥ 1, ≤ 3650
pricingModefacultatifMONEY | POINTS | POINTS_OR_MONEYComo o produto é pago. `POINTS` (só pontos) e `POINTS_OR_MONEY` (a pessoa escolhe) só em `ONE_TIME` de `kind` `digital`, `physical`, `event` (por tipo de ingresso), `course` ou `download`; assinatura, parcelado, reserva e adicional dão 400 (`param = pricingMode`). Com `POINTS` o `price` fica 0 e o produto **nunca** sai pelo checkout em dinheiro, pelo resgate grátis nem por cupom (400): é resgatado em `POST /api/storefront/products/{id}/redeem`.
pointsPricefacultatifintegerO preço em pontos, obrigatório fora de `MONEY` (400, `param = pointsPrice`). Vale para resgates seguintes; quem já resgatou não muda. · ≥ 1
sortOrderfacultatifinteger≥ 0
spaceIdsfacultatifstring (uuid)[]
subscriptionGroupIdsfacultatifstring (uuid)[]
prerequisiteGroupIdsfacultatifstring (uuid)[]Obsoleto na escrita; prefira `addOnProductIds` no plano.
thankYouMessagefacultatifstringmax 5000
redirectUrlfacultatifstring (uri)
metadatafacultatifobject

Réponses

StatutDescription
200Operação realizada com sucesso.
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.
409Requisição inválida — falha de validação.
500Erro interno do servidor.

Exemple curl

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