Skip to main content
curl -X POST "https://api.chargefy.io/v1/products" \
  -H "Authorization: Bearer {{API_KEY}}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Serviço sob consulta"
  }'
{
  "id": "prod_123",
  "object": "product",
  "created_at": "2026-05-16T14:09:27Z",
  "default_price": null,
  "description": null,
  "image_url": null,
  "is_active": true,
  "is_tax_applicable": true,
  "livemode": true,
  "metadata": {
    "reference_id": "sku_custom"
  },
  "name": "Serviço sob consulta",
  "prices": [],
  "updated_at": null
}
Cria um recurso product. Você pode criar o produto sem preço e definir os valores depois via POST /v1/prices, ou enviar prices[] inline no mesmo request. Quando prices[] tem itens, o primeiro preço do array vira default_price, ou use default_price_index para escolher outro. Use metadata para correlacionar o produto com IDs do seu sistema. Qualquer chave funciona (ex.: sku, reference_id); o objeto inteiro é retornado em todos os webhooks.

Autenticação

A API key da própria organização atua diretamente. A API key de plataforma exige o header Organization: <organization_id> apontando para uma organização conectada ativa.

Attributes

default_price_index
integer
default:"0"
Índice do preço em prices[] que vira default_price. Só é aceito quando prices[] tem pelo menos um item.
description
string
Descrição livre. Envie null para deixar vazio.
image_url
string
URL retornada por POST /v1/files com purpose=product_image. Envie null para deixar vazio. URLs externas não são aceitas.
is_tax_applicable
boolean
default:"true"
Indica se o produto é tributável.
metadata
object
Objeto livre string → string para correlacionar com o seu sistema. Padrão {}.
name
string
required
Nome do produto exibido em checkout, faturas e webhooks.
prices
array
Lista opcional de preços inline. Cada item segue o mesmo shape de POST /v1/prices (sem product_id). Quando omitido ou vazio, o produto nasce com default_price: null e prices: [].
curl -X POST "https://api.chargefy.io/v1/products" \
  -H "Authorization: Bearer {{API_KEY}}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Serviço sob consulta"
  }'

Resposta

200 OK com o objeto product completo. Todo campo declarado pelo DTO público é sempre retornado; vazio é null, {} ou [].
CampoTipoObservação
idstringID do produto (prod_*)
objectstringSempre "product"
namestring
descriptionstring | null
image_urlstring | null
is_tax_applicableboolean
default_pricestring | nullAponta para um item de prices[], ou null quando o produto ainda não tem preço padrão
is_activebooleanfalse quando arquivado
livemodebooleantrue em produção; false em ambiente de teste
metadataobjectEco do metadata enviado
created_atstringISO 8601
updated_atstring | nullISO 8601
pricesarrayLista de objetos price completos (mesmo shape de GET /v1/prices/:id)
{
  "id": "prod_123",
  "object": "product",
  "created_at": "2026-05-16T14:09:27Z",
  "default_price": null,
  "description": null,
  "image_url": null,
  "is_active": true,
  "is_tax_applicable": true,
  "livemode": true,
  "metadata": {
    "reference_id": "sku_custom"
  },
  "name": "Serviço sob consulta",
  "prices": [],
  "updated_at": null
}

Erros comuns

StatuscodeQuando ocorre
400invalid_requestname ausente; prices não-array; metadata não-objeto; default_price_index sem prices[] ou fora do range
400invalid_requestimage_url não aponta para um file ativo de purpose=product_image da organização
400invalid_requestEm prices[N]: currency não é ISO de 3 letras; unit_amount negativo ou ausente; type inválido; recurring.interval ausente para recurring; recurring.interval_count não-inteiro ou < 1; recurring em one_time; tax_behavior inválido

Webhook

A criação dispara product.created com o product completo em data.object. Cada preço inline também dispara price.created.