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 umamountcom umacurrencyISO 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_amountconduz cobranças de configuração. Quando a oferta pai temsetup_charge = true, o primeiro ciclo é cobrado comfirst_charge_amountem vez deamount. Um valor de0significa uma primeira cobrança apenas de validação de cartão. Deixe-o comonullpara cobrar oamountpadrão no primeiro ciclo. Uma oferta comfree_trial = truecobra0no primeiro ciclo independentemente deste campo, a menos que umfirst_charge_amountacima de0seja 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"
}| Field | Type | Description |
|---|---|---|
id | string | ID único do preço de oferta, prefixado com opr_. Opaco — nunca o analise. |
offer_id | string | A oferta à qual este preço pertence (ofr_). |
currency | string | Código de moeda ISO 4217, por exemplo "BRL". Único por oferta entre os preços ativos. |
amount | integer | Valor recorrente/padrão em unidades menores (centavos). |
first_charge_amount | integer | null | Valor 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_default | boolean | Indica se este é o preço padrão da oferta. No máximo um por oferta. |
created_at | string | Carimbo de data/hora de criação em UTC ISO 8601. |
updated_at | string | Carimbo 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.
| Method | Path | Purpose |
|---|---|---|
POST | /offers/:offerId/prices | Adicionar um preço a uma oferta |
GET | /offers/:offerId/prices | Listar os preços de uma oferta |
GET | /offer-prices/:id | Recuperar um único preço |
PATCH | /offer-prices/:id | Atualizar um preço |
DELETE | /offer-prices/:id | Excluir logicamente um preço |
POST | /offer-prices/:id/restore | Restaurar 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
| Field | Type | Required | Description |
|---|---|---|---|
offerId | string | Sim | A oferta a precificar (ofr_). |
Parâmetros de corpo
| Field | Type | Required | Description |
|---|---|---|---|
currency | string | Sim | Código ISO 4217 (exatamente 3 caracteres). Deve ser único entre os preços ativos da oferta. |
amount | integer | Sim | Valor padrão em unidades menores. Mínimo 0. |
first_charge_amount | integer | Não | Valor 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_default | boolean | Não | Marca 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
| Field | Type | Required | Description |
|---|---|---|---|
offerId | string | Sim | A oferta cujos preços serão listados (ofr_). |
Parâmetros de consulta
| Field | Type | Required | Description |
|---|---|---|---|
currency | string | Não | Filtra para uma única moeda ISO 4217 (exatamente 3 caracteres). |
is_default | boolean | Não | Quando true, retorna apenas o preço padrão; quando false, exclui-o. |
page | integer | Não | Número da página, com índice a partir de 1. Padrão 1, mínimo 1. |
limit | integer | Não | Itens por página. Padrão 20, máximo 100. |
curl "https://api.tokeflow.com/api/v1/offers/ofr_a1b2c3d4e5/prices?page=1&limit=20¤cy=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
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Sim | O 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
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Sim | O ID do preço de oferta (opr_). |
Parâmetros de corpo (todos opcionais)
| Field | Type | Required | Description |
|---|---|---|---|
currency | string | Não | Novo código ISO 4217 (exatamente 3 caracteres). Não deve colidir com outro preço ativo na mesma oferta. |
amount | integer | Não | Novo valor padrão em unidades menores (mínimo 0). |
first_charge_amount | integer | Não | Novo valor do primeiro ciclo em unidades menores (mínimo 0). |
is_default | boolean | Não | Promove 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
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Sim | O 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
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Sim | O 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:
| HTTP | type | When |
|---|---|---|
400 | validation_error | Corpo malformado, tamanho de moeda incorreto, valor negativo ou restauração de um preço já ativo. |
401 | authentication_error | Chave secreta ausente ou inválida. |
403 | authorization_error | A chave não tem o escopo offers:read / offers:write necessário. |
404 | not_found_error | O preço ou sua oferta pai não existe ou está fora do escopo da chave. |
409 | conflict_error | Moeda duplicada na oferta, um segundo padrão ou uma restauração que colide com um preço ativo. |
429 | rate_limit_error | Limite 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.