Skip to content

Bullmark for developers

A customer arrives holding a voucher for your product. Here is how your system finds out what it is worth, and how you tell us you gave them that price.

Redemption is two steps, and you own the second one

Section titled “Redemption is two steps, and you own the second one”

The holder reserves a voucher. It burns when you confirm you gave them the value — in the same transaction, on our side.

That order matters. If a voucher could be spent before you had given anything, then “the customer paid and the voucher did not move” would be a state that really happens, and no amount of sealing repairs it afterwards. So nothing is spent until you say so, and a failed payment costs your customer nothing.

what it costs youwhen to use it
A linknothingYou have written no integration. We send the holder to your pricing page with a ticket in the query string.
The partner APIone HTTP callYour checkout knows about vouchers. This is the real integration.
A screen we hostnothingSomeone at a counter types the code in. Works today, for any brand.

All three land in the same place on our side, so there is exactly one answer to “was this voucher used”.

Every redemption is an event on an append-only, sealed chain. The SDK’s verify() fetches that chain and recomputes the hashes on your machine — it does not ask us whether we are telling the truth.

const result = await bm.integrity.verify(code);
// → { verdict: 'verified', chainIntact: true, events: [...] }

We publish the hash algorithm, and the conformance vectors that keep our two implementations honest, for the same reason.