A merchant can offer, in its checkout, a QR code for each item or the buyer's System ID as text. The buyer confirms it on qevik.com.
Declare
You declare your domain, your return address and your public keys. No account is needed.
Prove the domain
You publish a verification file, and Qevik gives you a production client and a test client.
Integrate
Your server calls the API, the buyer confirms, and you receive the QR code or System ID of each item.
Fill in the declaration form and accept the merchant API terms.
Publish the file https://your-domain/.well-known/qevik-verification.txt: the value you received alone on a line, then one qevik-key= line per key.
Run the verification within 72 hours. The value is shown only once.
Keep your two identifiers: mrc_… for production and mrc_test_… for test. They do not work on the platform API.
A declaration carries the whole set of keys: adding or removing a key needs a new declaration. Codes to activate are requested in the same form and open after the domain is verified, sometimes with a short delay when many merchants sign up on the same day. Keep the verification file published: Qevik reads it regularly, and activation codes are withdrawn if it can no longer be read.
Server-to-server authentication with private_key_jwt (ES256): you declare your public keys, Qevik stores no secret.
Each server-to-server call is signed with a JWT assertion: ES256 only, kid equal to the thumbprint of an active key of that environment, iss and sub equal to your client, aud equal to the exact URL called, exp at most 300 seconds ahead, jti unique.
// Header
{ "alg": "ES256", "kid": "<RFC 7638 thumbprint of an active key>" }
// Claims
{
"iss": "mrc_YOUR_CLIENT_ID",
"sub": "mrc_YOUR_CLIENT_ID",
"aud": "https://qevik.com/api/v1/public/merchant/oauth/par",
"exp": 1893456000,
"jti": "a-unique-value"
}Pick the path that fits your checkout. They all share the same authentication. A request carries 10 items at most.
Your server pushes the request, the buyer is redirected to qevik.com, signs in and confirms, then returns to your return address with a code to exchange.
| POST | /api/v1/public/merchant/oauth/par | Push the request (PKCE S256 required) |
| GET | /api/v1/public/merchant/oauth/authorize | Redirect the buyer's browser |
| POST | /api/v1/public/merchant/oauth/token | Exchange the code for the items |
curl -X POST "https://qevik.com/api/v1/public/merchant/oauth/par" \
-d response_type=code \
-d client_id=mrc_YOUR_CLIENT_ID \
-d client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer \
-d client_assertion=$SIGNED_JWT \
-d redirect_uri=https://shop.qevik.com/return \
-d state=$STATE \
-d code_challenge=$PKCE_CHALLENGE \
-d code_challenge_method=S256 \
--data-urlencode 'authorization_details=[{
"type": "qevik_item",
"lineRef": "o-123/1",
"label": "Backpack",
"sellerName": "Qevik Shop",
"allowedForms": ["QR", "TEXT"],
"chosenForms": ["QR"]
}]'Exchange response, one entry per requested item. qrPayload is present only when the QR form was chosen, systemId only when text was chosen and accepted by the buyer.
{
"token_type": "qevik-merchant-items",
"items": [
{
"lineRef": "o-123/1",
"qrPayload": "HTTPS://QEVIK.COM/F/7K2M9X4P0Q.ABCDEFGHJKMNPQRSTVWXYZ0123",
"systemId": "4821-BK7M"
}
]
}The buyer types their System ID at your checkout. Qevik e-mails them a six-digit code, they type it at your checkout, and your server receives the items by confirming it. The answer to the request is the same for every System ID.
| POST | /api/v1/public/merchant/codes | Ask for the code to be sent |
| POST | /api/v1/public/merchant/codes/confirm | Confirm the code and receive the items |
You order batches of codes bound to nobody, print them on your supports, and the buyer activates theirs from their account after scanning it. This path never carries a System ID. Starting ceilings: 1,000 unactivated codes, 10,000 codes issued in total. Beyond them, the order answers outstanding_limit.
| POST | /api/v1/public/merchant/blank-codes/batches | Order a batch |
| POST | /api/v1/public/merchant/blank-codes/batches/read | Read a batch again (5 times at most, for 7 days) |
| POST | /api/v1/public/merchant/blank-codes/sold | Mark codes as sold |
| POST | /api/v1/public/merchant/blank-codes/revoke | Withdraw a batch |
| POST | /api/v1/public/merchant/blank-codes/stats | Read the figures of a batch or month |
The mrc_test_… client uses its own keys and reaches only accounts Qevik marked as test accounts. Its items are never counted and cannot be found publicly. The System ID it receives is a fictitious alias starting with UTST, never a real identifier.