Skip to main content

📌 Endpoint

POST /stores/:storeId/coupons Cria um novo cupom para produtos e/ou categorias.

🔐 Autenticação

  • Rota privada.
  • Requer header Authorization com sua API key e plano ativo.
{
	"Authorization": "SUA_API_KEY_AQUI"
}

🧾 Parâmetros de rota

ParâmetroTipoObrigatórioDescrição
storeIdstringSimID da loja

🧍 Body (JSON)

CampoTipoObrigatórioRegras
codestringSim3-32 caracteres
discountnumberSim1 a 100
useLimitnumberNãointeiro -1 a 999 (-1 ilimitado)
expiredAtdateNãodata futura ou null
productIdsstring[]Condicionalobrigatório se categoryIds não for enviado
categoryIdsstring[]Condicionalobrigatório se productIds não for enviado
É necessário enviar ao menos um entre productIds e categoryIds.

✅ Exemplo de requisição

curl -X POST "https://api.cabrapi.com.br/stores/STORE_ID/coupons" \
	-H "Authorization: SUA_API_KEY_AQUI" \
	-H "Content-Type: application/json" \
	-d '{
		"code": "BEMVINDO10",
		"discount": 10,
		"useLimit": -1,
		"productIds": ["PRODUCT_ID"]
	}'

🧩 Snippet (JavaScript - fetch, só trocar Authorization)

const API_BASE = "https://api.cabrapi.com.br";
const AUTHORIZATION = "SUA_API_KEY_AQUI";

const authHeaders = {
	Authorization: AUTHORIZATION,
	"Content-Type": "application/json"
};

const storesResponse = await fetch(`${API_BASE}/stores`, {
	headers: { Authorization: AUTHORIZATION }
});
const storesData = await storesResponse.json();

if (!storesResponse.ok || !storesData?.stores?.length) {
	throw new Error("Nenhuma loja encontrada para essa API key.");
}

const storeId = storesData.stores[0].id;

let productId;
const productsResponse = await fetch(`${API_BASE}/stores/${storeId}/products`);
const productsData = await productsResponse.json();

if (productsResponse.ok && productsData?.products?.length) {
	productId = productsData.products[0].id;
} else {
	const newProductResponse = await fetch(`${API_BASE}/stores/${storeId}/products`, {
		method: "POST",
		headers: authHeaders,
		body: JSON.stringify({
			name: `ProdutoCupom ${Date.now()}`,
			description: "Produto base para cupom via script da documentação.",
			delivery: "DIGITAL",
			price: 39.9,
			stock: 50
		})
	});

	const newProductData = await newProductResponse.json();
	if (!newProductResponse.ok || !newProductData?.product?.id) {
		throw new Error("Não foi possível criar produto base para o cupom.");
	}

	productId = newProductData.product.id;
}

const couponCode = `CUPOM${Date.now()}`;

const response = await fetch(`${API_BASE}/stores/${storeId}/coupons`, {
	method: "POST",
	headers: authHeaders,
	body: JSON.stringify({
		code: couponCode,
		discount: 10,
		useLimit: -1,
		productIds: [productId]
	})
});

const data = await response.json();
console.log({ status: response.status, data });

📦 Resposta de sucesso (201)

{
	"status": true,
	"code": "COUPON_CREATED",
	"coupon": {
		"id": "COUPON_ID",
		"code": "bemvindo10",
		"position": 1,
		"discount": 10,
		"useLimit": -1,
		"storeId": "STORE_ID"
	}
}

⚠️ Possíveis erros

  • 400 INVALID_DATA → body inválido
  • 400 RELATION_NOT_FOUND → produto/categoria inválido
  • 404 STORE_NOT_FOUND → loja não encontrada
  • 409 COUPON_ALREADY_EXISTS → código já existente
  • 500 INTERNAL_SERVER_ERROR → erro interno