Preços de Oferta

Anexe valores e moedas a uma oferta com preços de oferta — um padrão por moeda, com exclusão lógica e restauração para um gerenciamento de ciclo de vida seguro.

Um preço de oferta anexa um valor concreto, em uma moeda específica, a uma oferta. Uma oferta pode carregar vários preços — um por moeda — para que o mesmo plano possa ser vendido em BRL, USD, EUR e mais. Exatamente um preço por oferta pode ser marcado como o padrão dessa oferta.

Os preços são a folha do catálogo. A oferta define como um plano é cobrado (ciclo, teste, configuração); o preço define quanto ele custa em cada moeda.

Tokeflow é uma plataforma de orquestração de pagamentos, não um processador de pagamentos. Os preços de oferta modelam quanto um plano custa; a autorização, captura e liquidação efetivas de qualquer cobrança acontecem no provedor de pagamento conectado. Objetos do catálogo nunca movimentam dinheiro.

Como funciona a precificação

  • Os valores são unidades menores inteiras. Armazene centavos, não decimais. R$99.00 é 9900; US$150.00 é 15000. Sempre combine um amount com uma currency ISO 4217.
  • Um preço por moeda, por oferta. Uma oferta não pode ter dois preços ativos na mesma moeda. Criar ou atualizar um preço para uma moeda que já está ocupada retorna 409 Conflict.
  • Um padrão por oferta. No máximo um preço em uma oferta pode ter is_default: true. O padrão é o preço que o Tokeflow exibe primeiro (e lista primeiro) para essa oferta.
  • first_charge_amount conduz cobranças de configuração. Quando a oferta pai tem setup_charge = true, o primeiro ciclo é cobrado com first_charge_amount em vez de amount. Um valor de 0 significa uma primeira cobrança apenas de validação de cartão. Deixe-o como null para cobrar o amount padrão no primeiro ciclo. Uma oferta com free_trial = true cobra 0 no primeiro ciclo independentemente deste campo, a menos que um first_charge_amount acima de 0 seja configurado como taxa de adesão inicial.

Os endpoints de listagem ordenam os preços com o padrão primeiro (is_default DESC), depois por moeda em ordem crescente — assim, o preço de que você mais precisa fica no topo da resposta.

O objeto de preço de oferta

{
  "id": "opr_b1c2d3e4f5",
  "offer_id": "ofr_a1b2c3d4e5",
  "currency": "BRL",
  "amount": 9900,
  "first_charge_amount": 0,
  "is_default": true,
  "created_at": "2026-05-19T12:00:00.000Z",
  "updated_at": "2026-05-19T12:00:00.000Z"
}
FieldTypeDescription
idstringID único do preço de oferta, prefixado com opr_. Opaco — nunca o analise.
offer_idstringA oferta à qual este preço pertence (ofr_).
currencystringCódigo de moeda ISO 4217, por exemplo "BRL". Único por oferta entre os preços ativos.
amountintegerValor recorrente/padrão em unidades menores (centavos).
first_charge_amountinteger | nullValor do primeiro ciclo em unidades menores, usado quando a oferta tem setup_charge = true. 0 = apenas validação de cartão. null = cobrar o amount padrão, ou 0 quando a oferta tem free_trial = true.
is_defaultbooleanIndica se este é o preço padrão da oferta. No máximo um por oferta.
created_atstringCarimbo de data/hora de criação em UTC ISO 8601.
updated_atstringCarimbo de data/hora da última atualização em UTC ISO 8601.

Endpoints

Todos os endpoints de preço de oferta ficam sob https://api.tokeflow.com/api/v1. A autenticação usa uma chave secreta — veja Autenticação.

MethodPathPurpose
POST/offers/:offerId/pricesAdicionar um preço a uma oferta
GET/offers/:offerId/pricesListar os preços de uma oferta
GET/offer-prices/:idRecuperar um único preço
PATCH/offer-prices/:idAtualizar um preço
DELETE/offer-prices/:idExcluir logicamente um preço
POST/offer-prices/:id/restoreRestaurar um preço excluído logicamente

Os preços de oferta exigem o escopo offers:read para leituras e offers:write para mutações. Com uma chave de Organization, restrinja a requisição a um merchant por meio do parâmetro de consulta merchant_id; uma chave de Merchant infere o merchant automaticamente. Veja Autenticação.


POST/api/v1/offers/:offerId/prices

Auth: chave de Organization (com merchant_id) ou chave de Merchant.

Adiciona um preço a uma oferta existente. A oferta pai deve pertencer ao merchant autenticado.

Parâmetros de caminho

FieldTypeRequiredDescription
offerIdstringSimA oferta a precificar (ofr_).

Parâmetros de corpo

FieldTypeRequiredDescription
currencystringSimCódigo ISO 4217 (exatamente 3 caracteres). Deve ser único entre os preços ativos da oferta.
amountintegerSimValor padrão em unidades menores. Mínimo 0.
first_charge_amountintegerNãoValor do primeiro ciclo em unidades menores (mínimo 0). Usado quando a oferta tem setup_charge = true. Omita para cobrar o amount padrão — ou 0, quando a oferta tem free_trial = true.
is_defaultbooleanNãoMarca este preço como o padrão da oferta. O padrão é false. A oferta pode ter no máximo um padrão.
curl -X POST https://api.tokeflow.com/api/v1/offers/ofr_a1b2c3d4e5/prices \
  -H "Authorization: Bearer sk_live_mer_REPLACE_ME" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 7c3b9f1e-2a4d-4c8e-9f1a-6b2d8e0c4a11" \
  -d '{
    "currency": "BRL",
    "amount": 9900,
    "first_charge_amount": 0,
    "is_default": true
  }'

Resposta 201 Created

{
  "success": true,
  "data": {
    "id": "opr_b1c2d3e4f5",
    "offer_id": "ofr_a1b2c3d4e5",
    "currency": "BRL",
    "amount": 9900,
    "first_charge_amount": 0,
    "is_default": true,
    "created_at": "2026-05-19T12:00:00.000Z",
    "updated_at": "2026-05-19T12:00:00.000Z"
  },
  "request_id": "req_8f3c2a1b9d",
  "timestamp": "2026-05-19T12:00:00.000Z"
}

Envie um cabeçalho Idempotency-Key (ou idempotency_key no corpo) nas requisições de criação. Repetir a mesma chave retorna o resultado original com HTTP 200 em vez de criar uma duplicata. Veja Idempotência.

Você não pode adicionar um segundo preço em uma moeda que a oferta já precifica, e não pode adicionar um segundo padrão. Ambos os casos retornam 409 Conflict com um conflict_error. Atualize ou exclua logicamente o preço existente primeiro.


GET/api/v1/offers/:offerId/prices

Auth: chave de Organization (com merchant_id) ou chave de Merchant.

Lista os preços de uma oferta, o padrão primeiro e depois por moeda. Suporta filtragem e paginação.

Parâmetros de caminho

FieldTypeRequiredDescription
offerIdstringSimA oferta cujos preços serão listados (ofr_).

Parâmetros de consulta

FieldTypeRequiredDescription
currencystringNãoFiltra para uma única moeda ISO 4217 (exatamente 3 caracteres).
is_defaultbooleanNãoQuando true, retorna apenas o preço padrão; quando false, exclui-o.
pageintegerNãoNúmero da página, com índice a partir de 1. Padrão 1, mínimo 1.
limitintegerNãoItens por página. Padrão 20, máximo 100.
curl "https://api.tokeflow.com/api/v1/offers/ofr_a1b2c3d4e5/prices?page=1&limit=20&currency=BRL&is_default=true" \
  -H "Authorization: Bearer sk_live_mer_REPLACE_ME"

Resposta 200 OK

{
  "success": true,
  "data": [
    {
      "id": "opr_b1c2d3e4f5",
      "offer_id": "ofr_a1b2c3d4e5",
      "currency": "BRL",
      "amount": 9900,
      "first_charge_amount": 0,
      "is_default": true,
      "created_at": "2026-05-19T12:00:00.000Z",
      "updated_at": "2026-05-19T12:00:00.000Z"
    }
  ],
  "meta": {
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 1,
      "total_pages": 1,
      "has_next": false,
      "has_prev": false
    }
  },
  "request_id": "req_3a1d7f9c2b",
  "timestamp": "2026-05-19T12:00:00.000Z"
}

GET/api/v1/offer-prices/:id

Auth: chave de Organization (com merchant_id) ou chave de Merchant.

Recupera um único preço pelo seu ID opr_. O preço deve pertencer a uma oferta de propriedade do merchant autenticado.

Parâmetros de caminho

FieldTypeRequiredDescription
idstringSimO ID do preço de oferta (opr_).
curl https://api.tokeflow.com/api/v1/offer-prices/opr_b1c2d3e4f5 \
  -H "Authorization: Bearer sk_live_mer_REPLACE_ME"

Resposta 200 OK

{
  "success": true,
  "data": {
    "id": "opr_b1c2d3e4f5",
    "offer_id": "ofr_a1b2c3d4e5",
    "currency": "BRL",
    "amount": 9900,
    "first_charge_amount": 0,
    "is_default": true,
    "created_at": "2026-05-19T12:00:00.000Z",
    "updated_at": "2026-05-19T12:00:00.000Z"
  },
  "request_id": "req_5b2e8c0a1f",
  "timestamp": "2026-05-19T12:00:00.000Z"
}

Um preço inexistente ou fora do escopo retorna 404 Not Found com um not_found_error.


PATCH/api/v1/offer-prices/:id

Auth: chave de Organization (com merchant_id) ou chave de Merchant.

Atualiza parcialmente um preço. Envie apenas os campos que você deseja alterar.

Parâmetros de caminho

FieldTypeRequiredDescription
idstringSimO ID do preço de oferta (opr_).

Parâmetros de corpo (todos opcionais)

FieldTypeRequiredDescription
currencystringNãoNovo código ISO 4217 (exatamente 3 caracteres). Não deve colidir com outro preço ativo na mesma oferta.
amountintegerNãoNovo valor padrão em unidades menores (mínimo 0).
first_charge_amountintegerNãoNovo valor do primeiro ciclo em unidades menores (mínimo 0).
is_defaultbooleanNãoPromove este preço ao padrão da oferta. Falha se outro padrão já existir.
curl -X PATCH https://api.tokeflow.com/api/v1/offer-prices/opr_b1c2d3e4f5 \
  -H "Authorization: Bearer sk_live_mer_REPLACE_ME" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 12900 }'

Resposta 200 OK

{
  "success": true,
  "data": {
    "id": "opr_b1c2d3e4f5",
    "offer_id": "ofr_a1b2c3d4e5",
    "currency": "BRL",
    "amount": 12900,
    "first_charge_amount": 0,
    "is_default": true,
    "created_at": "2026-05-19T12:00:00.000Z",
    "updated_at": "2026-05-19T13:45:00.000Z"
  },
  "request_id": "req_9d4f1a7e3c",
  "timestamp": "2026-05-19T13:45:00.000Z"
}

Alterar currency para uma que outro preço ativo já usa, ou definir is_default: true quando a oferta já tem um padrão, retorna 409 Conflict. Para mover o padrão, rebaixe o padrão atual primeiro (ou exclua-o logicamente), depois promova o novo.

Editar um preço altera apenas as cobranças futuras. Não altera retroativamente as cobranças que já ocorreram no provedor de pagamento conectado.


DELETE/api/v1/offer-prices/:id

Auth: chave de Organization (com merchant_id) ou chave de Merchant.

Exclui logicamente um preço. O registro é mantido para auditabilidade e pode ser recuperado com restauração. A exclusão lógica libera o espaço de moeda do preço — e, se ele era o padrão, o espaço de padrão — para que um novo preço possa ocupá-los.

Parâmetros de caminho

FieldTypeRequiredDescription
idstringSimO ID do preço de oferta (opr_).
curl -X DELETE https://api.tokeflow.com/api/v1/offer-prices/opr_b1c2d3e4f5 \
  -H "Authorization: Bearer sk_live_mer_REPLACE_ME"

Resposta 204 No Content

O corpo da resposta fica vazio em caso de sucesso.


POST/api/v1/offer-prices/:id/restore

Auth: chave de Organization (com merchant_id) ou chave de Merchant.

Restaura um preço excluído logicamente, retornando-o ao uso ativo. A restauração é rejeitada se um preço ativo tiver ocupado o mesmo espaço de moeda desde então, ou — para um preço padrão — se a oferta já tiver um padrão novamente.

Parâmetros de caminho

FieldTypeRequiredDescription
idstringSimO ID do preço de oferta excluído logicamente (opr_).
curl -X POST https://api.tokeflow.com/api/v1/offer-prices/opr_b1c2d3e4f5/restore \
  -H "Authorization: Bearer sk_live_mer_REPLACE_ME"

Resposta 201 Created

{
  "success": true,
  "data": {
    "id": "opr_b1c2d3e4f5",
    "offer_id": "ofr_a1b2c3d4e5",
    "currency": "BRL",
    "amount": 12900,
    "first_charge_amount": 0,
    "is_default": true,
    "created_at": "2026-05-19T12:00:00.000Z",
    "updated_at": "2026-05-19T14:10:00.000Z"
  },
  "request_id": "req_1c7a3e9f2d",
  "timestamp": "2026-05-19T14:10:00.000Z"
}

Restaurar um preço já ativo retorna 400 Bad Request (validation_error). Uma colisão de moeda ou de padrão com um preço ativo retorna 409 Conflict — limpe ou renomeie o preço conflitante primeiro.

Erros

Os endpoints de preço de oferta usam o envelope de erro padrão do Tokeflow. Casos comuns:

HTTPtypeWhen
400validation_errorCorpo malformado, tamanho de moeda incorreto, valor negativo ou restauração de um preço já ativo.
401authentication_errorChave secreta ausente ou inválida.
403authorization_errorA chave não tem o escopo offers:read / offers:write necessário.
404not_found_errorO preço ou sua oferta pai não existe ou está fora do escopo da chave.
409conflict_errorMoeda duplicada na oferta, um segundo padrão ou uma restauração que colide com um preço ativo.
429rate_limit_errorLimite de taxa excedido — reduza exponencialmente. Veja Limites de taxa.
{
  "error": {
    "type": "conflict_error",
    "code": "OFFER_PRICE_CURRENCY_EXISTS",
    "message": "Offer ofr_a1b2c3d4e5 already has a price in currency BRL",
    "details": {},
    "request_id": "req_2f8b1d4c7a",
    "timestamp": "2026-05-19T12:05:00.000Z"
  }
}

Relacionados

  • Ofertas — a configuração de cobrança à qual os preços se anexam.
  • Produtos — os itens vendáveis aos quais as ofertas pertencem.
  • Famílias de Produtos — agrupamento para produtos.
  • Autenticação — chaves, escopos e contexto de merchant.

Nesta página