Brand Partner API¶
Väike ja ennustatav REST API mintboti tellimuste loomiseks, nende oleku pärimiseks ja elutsükli sündmuste vastuvõtmiseks. JSON sisse, JSON välja. Bearer-tokeniga autentimine. Idempotentsed kirjutused. Allkirjastatud webhookid.
API juurdepääsu töölaud Hüppa webhookide juurde
Kiirülevaade¶
| Base URL | https://mint.mintbot.ai/api/v1 |
| Auth | Authorization: Bearer *** |
| Idempotency | Idempotency-Key: <uuid> igal POST päringul |
| Content type | application/json |
| Rate limit | 120 päringut / 60 s partneri kohta |
| Webhookid | Allkirjastatud HMAC-SHA256-ga, kuni 7 korduskatset |
Autentimine¶
Iga päring saadab partneri API võtme Authorization päises. Võtme saab luua või
roteerida töölaualt.
Authorization: Bearer mo_liv...xxxx
Content-Type: application/json
Roteerimisel armuaega ei ole
Võtme roteerimine tühistab eelmise võtme atomaarselt. Planeeri uue väärtuse vahetus oma konfiguratsioonis enne Rotate vajutamist.
Idempotentsus¶
Iga POST vajab Idempotency-Key päist. Sobib suvaline UUID iga eraldi
päringu kohta.
- Hoiame vastust puhvris 24 tundi. Sama võtmega korduskatse esitab
algse vastuse uuesti, päisega
Idempotent-Replay: true. - Sama võtme kasutamine teistsuguse päringu kerega tagastab
409 idempotency_key_mismatch.
Tellimused¶
Tellimuse loomine¶
POST /orders
Loob tellimuse ja tagastab Stripe Checkouti URL-i. Kui makse kinnitatakse, paigaldab mintbot agendi ja partneri tulusündmus salvestatakse automaatselt.
Päring
{
"tier": "s1",
"duration_months": 1,
"credit_usd": 10,
"language": "en",
"external_id": "your-side-id",
"success_url": "https://your.app/thanks?id={ORDER_ID}",
"cancel_url": "https://your.app/cart",
"webhook_url": "https://your.app/mintbot-webhook"
}
tier- Üks väärtustest
trial,s1,s2,s4. duration_months- Kalendrikuud serveri elueaks. Üks väärtustest
1,3või12. credit_usd- Valikuline. Tellimusega kaasa pandud ette makstud vestluskrediit.
language- Valikuline. Mõjutab Stripe Checkouti keelevalikut ja tervituskirja keelt.
external_id- Valikuline. Kajastub igas webhookis ja tellimuse vastuses — kasuta seda mintboti tellimuste sidumiseks oma süsteemi ridadega.
success_url·cancel_url- Stripe Checkouti tagasisuuna URL-id.
{ORDER_ID}asendatakse serveri poolel. webhook_url- Valikuline. Tellimusepõhine ülekirjutus partneri taseme webhooki URL-ile.
Vastus — 201 Created
{
"id": 42,
"tier": "s1",
"duration_months": 1,
"credit_usd": 10,
"amount_cents": 1200,
"currency": "usd",
"status": "awaiting_payment",
"checkout_url": "https://checkout.stripe.com/c/pay/cs_test_…",
"panel_url": null,
"expires_at": null,
"language": "en",
"external_id": "your-side-id",
"created_at": "2026-05-16 09:58:00",
"paid_at": null
}
Näide
curl -X POST https://mint.mintbot.ai/api/v1/orders \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"tier": "s1",
"duration_months": 1,
"credit_usd": 10,
"success_url": "https://your.app/thanks?id={ORDER_ID}",
"cancel_url": "https://your.app/cart"
}'
import os, uuid, requests
r = requests.post(
"https://mint.mintbot.ai/api/v1/orders",
headers={
"Authorization": f"Bearer {os.environ['MINTBOT_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"tier": "s1",
"duration_months": 1,
"credit_usd": 10,
"success_url": "https://your.app/thanks?id={ORDER_ID}",
"cancel_url": "https://your.app/cart",
},
timeout=10,
)
r.raise_for_status()
order = r.json()
redirect_to = order["checkout_url"]
Tellimuse pärimine¶
GET /orders/{id}
Toob ühe tellimuse mintboti ID järgi. Vastuse kuju on sama mis POST /orders
puhul.
curl https://mint.mintbot.ai/api/v1/orders/42 \
-H "Authorization: Bearer ***"
Tellimuste nimekiri¶
GET /orders
Kursoripõhise lehitsemisega nimekiri, uusimad ees.
Päringu parameetrid
status- Valikuline. Filtreeri väärtuste
awaiting_payment,completed,deployed,deploy_failedvõiexpiredjärgi. cursor- Valikuline. Jätkamiseks anna eelmise lehe
next_cursor.
Vastus
{
"items": [ /* OrderResponse … */ ],
"next_cursor": "37"
}
next_cursor on null, kui rohkem lehekülgi pole.
Tellimuse pikendamine¶
POST /orders/{id}/renew
Pikendab olemasolevat agenti veel duration_months võrra. Ainult taristu —
uut vestluskrediiti kaasa ei panda. Tagastab uue tellimuse ID ja värske Stripe
Checkouti URL-i.
Päring
{
"duration_months": 1,
"external_id": "your-side-id",
"success_url": "https://your.app/thanks?id={ORDER_ID}",
"cancel_url": "https://your.app/account"
}
Tulu¶
Tulu pärimine¶
GET /revenue
Kogusummad ja kuni 200 viimast pearaamatu sündmust.
Päringu parameetrid
include_paid- Valikuline, vaikimisi
true. Seafalse, et näha ainult veel välja maksmata sündmusi.
Vastus
{
"currency": "usd",
"gross_cents": 12000,
"partner_cut_cents": 2000,
"mintbot_cut_cents": 10000,
"unpaid_cents": 800,
"events": [
{
"id": 7,
"order_id": 42,
"kind": "order_paid",
"gross_cents": 1200,
"partner_cut_cents": 200,
"mintbot_cut_cents": 1000,
"currency": "usd",
"created_at": "2026-05-16 09:58:00",
"payout_id": null,
"payout_at": null
}
]
}
Partneri profiil¶
Profiili pärimine¶
GET /partner
Kajastab sinu partneriprofiili ja välja maksmata saldo — mugav viis kuvada oma tulu omaenda haldusliideses ilma seda ise salvestamata.
Vastus
{
"id": 12,
"email": "you@kliendifirma.com",
"pricing_currency": "usd",
"balance_unpaid_cents": 800,
"webhook_url": "https://your.app/mintbot-webhook",
"api_key_prefix": "mo_live_a12b"
}
Webhooks¶
Kui tellimusega midagi juhtub, saadame sinu seadistatud webhooki URL-ile
allkirjastatud JSON-sündmuse POST päringuga.
Sündmuse tüübid¶
| Sündmus | Millal käivitub |
|---|---|
order.created |
Stripe Checkouti sessioon loodi, makse ootab. |
order.paid |
Stripe kinnitas makse. Tulusündmus salvestati. |
order.cancelled |
Tellimus aegus või tühistati selgesõnaliselt. |
agent.provisioning_started |
Selle tellimuse paigaldusprotsess käivitus. |
agent.ready |
Paigaldus õnnestus. Päringukere sisaldab panel_url ja expires_at. |
agent.failed |
Paigaldusprotsess andis vea. Katkise sammu leiad error väljalt. |
agent.expired |
Agendi TTL sai täis. Partner saab pikendada POST /orders/{id}/renew kaudu. |
Saatmine ja korduskatsed¶
- Kuni 7 katset eksponentsiaalse vahega:
0s, 30s, 2m, 10m, 1h, 6h, 24h. - Pärast viimast katset märgitakse saatmine olekusse
exhaustedja korduskatsed lõpevad. - Kinnitamiseks vasta 10 sekundi jooksul
2xxstaatusekoodiga.
Päringu päised¶
Content-Type: application/json
User-Agent: mintbot-webhook/1.0
X-Mintbot-Signature: t=<unix_ts>,v1=<hex_hmac_sha256>
X-Mintbot-Event-Id: evt_42_order.paid_1747371234567
X-Mintbot-Event-Type: order.paid
Näidispäringukere — order.paid¶
{
"id": 42,
"tier": "s1",
"duration_months": 1,
"credit_usd": 10,
"amount_cents": 1200,
"currency": "usd",
"status": "completed",
"external_id": "your-side-id",
"paid_at": "2026-05-16 10:02:14"
}
Allkirja kontrollimine¶
Allkiri on HMAC-SHA256(secret, "{timestamp}.{raw_body}"). Kontrolli alati
töötlemata päringukeret — parsitud JSON-i uuesti serialiseerimine rikub
võrdluse.
import hmac, hashlib, time
def verify(secret: str, body: bytes, header: str, tolerance: int = 300) -> bool:
try:
ts_part, v1_part = header.split(",", 1)
ts = int(ts_part.split("=", 1)[1])
sig = v1_part.split("=", 1)[1]
except Exception:
return False
if abs(int(time.time()) - ts) > tolerance:
return False
expected = hmac.new(
secret.encode(),
f"{ts}.".encode() + body,
hashlib.sha256,
).hexdigest()
return hmac.compare_digest(expected, sig)
const crypto = require("crypto");
function verify(secret, rawBody, header, toleranceSec = 300) {
const [tsPart, v1Part] = header.split(",");
const ts = Number(tsPart.split("=")[1]);
const sig = v1Part.split("=")[1];
if (Math.abs(Date.now() / 1000 - ts) > toleranceSec) return false;
const expected = crypto
.createHmac("sha256", secret)
.update(`${ts}.`)
.update(rawBody)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(sig, "hex"),
);
}
Idempotentsed vastuvõtjad
Kasuta X-Mintbot-Event-Id väärtust dubleerimise vältimise võtmena —
korduskatsed kasutavad sama ID-d, nii et INSERT … ON CONFLICT DO NOTHING
selle veeru peal hoiab töötleja turvalisena.
Vead¶
Iga veavastus sisaldab stabiilset code väärtust, mille järgi saab
koodis hargneda. message on inimesele mõeldud vihje ja võib versioonide
vahel muutuda. request_id kajastab X-Request-Id vastuse päist —
lisa see toepöördumisse.
{
"error": {
"code": "invalid_api_key",
"message": "API key is unknown or revoked.",
"request_id": "f0c2d6c4-…"
}
}
| Kood | Tähendus |
|---|---|
unauthenticated |
Authorization päis puudub või on vigane. |
invalid_api_key |
API võti on tundmatu või välja roteeritud. |
rate_limited |
Partneri- või IP-põhine päringukvoot on ületatud — vaata Retry-After. |
missing_idempotency_key |
POST päring ilma Idempotency-Key päiseta. |
idempotency_key_mismatch |
Sama võtit kasutati teistsuguse päringu kerega. |
validation_error |
Päringu keha ei läbinud skeemivalideerimist. |
not_found |
Ressurssi pole olemas või see ei kuulu sinu partnerile. |
payment_gateway_error |
Stripe lükkas Checkouti sessiooni loomise tagasi. |
Päringukvoodid¶
- 120 päringut / 60 s libisev aken, partneri kohta. Lühiajalised tipud ja püsiv koormus kasutavad sama mahutit.
- 60 päringut / 60 s eraldi IP-põhine mahuti autentimata ja ebaõnnestunud autentimisega päringutele — see takistab bearer-tokeni murdekatseid partneri kvooti ammendamast.
- Liigsed päringud tagastavad
429 rate_limitedkoosRetry-Afterpäisega (mitu sekundit oodata enne uut katset).
Vajad abi?¶
Need juhendid on kirjutatud partneritele, kes API-t päriselt kasutavad. Kui midagi on puudu, segane või aegunud, ütle seda oma mintboti agendile — ta edastab tagasiside meile ja uuendame lehte.