Brand Partner API¶
Mazs, paredzams REST API mintbot pasūtījumu izveidei, to statusa pārbaudei un dzīvescikla notikumu saņemšanai. JSON iekšā, JSON ārā. Bearer-token autentifikācija. Idempotenti rakstīšanas pieprasījumi. Parakstīti webhooks.
API piekļuves panelis Pāriet uz Webhooks
Īsumā¶
| Bāzes URL | https://mint.mintbot.ai/api/v1 |
| Autentifikācija | `Authorization: Bearer *** |
| Idempotence | Idempotency-Key: <uuid> katram POST |
| Satura tips | application/json |
| Ātruma limits | 120 req / 60 s katram partnerim |
| Webhooks | Parakstīti ar HMAC-SHA256, atkārtoti mēģināti līdz 7 reizēm |
Autentifikācija¶
Katrs pieprasījums nosūta partnera API key Authorization galvenē. Ģenerē vai rotē key panelī.
Authorization: Bearer mo_liv...xxxx
Content-Type: application/json
Rotācijai nav pārejas loga
Key rotēšana atomāri atsauc iepriekšējo key. Ieplāno vērtības nomaiņu savā konfigurācijā pirms klikšķini Rotate.
Idempotence¶
Katram POST ir nepieciešama Idempotency-Key galvene. Der jebkurš UUID katram atsevišķam pieprasījumam.
- Mēs saglabājam atbildi kešā 24 stundas. Atkārtots mēģinājums ar to pašu key atskaņo sākotnējo atbildi ar
Idempotent-Replay: true. - Tā paša key atkārtota izmantošana ar citu body atgriež
409 idempotency_key_mismatch.
Pasūtījumi¶
Izveidot pasūtījumu¶
POST /orders
Izveido pasūtījumu un atgriež Stripe Checkout URL. Kad maksājums ir apstiprināts, mintbot sagatavo aģentu un partnera daļas ieņēmumu notikums tiek ierakstīts automātiski.
Pieprasījums
{
"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- Viens no
trial,s1,s2,s4. duration_months- Servera darbības laiks kalendārajos mēnešos. Jābūt vienam no
1,3vai12. credit_usd- Neobligāts. Iepriekš apmaksāts chat credit, kas iekļauts pasūtījumā.
language- Neobligāts. Ietekmē Stripe Checkout lokāli un sveiciena e-pasta valodu.
external_id- Neobligāts. Tiek atdots atpakaļ katrā webhook un pasūtījuma atbildē — izmanto to, lai sasaistītu mintbot pasūtījumus ar ierakstiem savā sistēmā.
success_url·cancel_url- Stripe Checkout atgriešanās URL.
{ORDER_ID}tiek aizvietots servera pusē. webhook_url- Neobligāts. Katram pasūtījumam paredzēta partnera līmeņa webhook URL pārrakstīšana.
Atbilde — 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
}
Piemērs
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"]
Iegūt pasūtījumu¶
GET /orders/{id}
Ielasa vienu pasūtījumu pēc tā mintbot id. Atgriež tādu pašu struktūru kā POST /orders.
curl https://mint.mintbot.ai/api/v1/orders/42 \
-H "Authorization: Bearer ***
Pasūtījumu saraksts¶
GET /orders
Ar kursoru lapots saraksts, jaunākie vispirms.
Vaicājuma parametri
status- Neobligāts. Filtrē pēc
awaiting_payment,completed,deployed,deploy_failedvaiexpired. cursor- Neobligāts. Padod
next_cursorno iepriekšējās lapas, lai turpinātu.
Atbilde
{
"items": [ /* OrderResponse … */ ],
"next_cursor": "37"
}
next_cursor ir null, kad vairs nav nākamo lapu.
Atjaunot pasūtījumu¶
POST /orders/{id}/renew
Pagarina esošu aģentu par vēl vienu duration_months. Tikai infrastruktūra — netiek iekļauts jauns chat credit. Atgriež jaunu pasūtījuma id un jaunu Stripe Checkout URL.
Pieprasījums
{
"duration_months": 1,
"external_id": "your-side-id",
"success_url": "https://your.app/thanks?id={ORDER_ID}",
"cancel_url": "https://your.app/account"
}
Ieņēmumi¶
Lasīt ieņēmumus¶
GET /revenue
Kopsummas un jaunākie 200 ledger notikumi.
Vaicājuma parametri
include_paid- Neobligāts, noklusējums
true. Iestati uzfalse, lai redzētu tikai notikumus, kas vēl nav izmaksāti.
Atbilde
{
"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
}
]
}
Partnera profils¶
Iegūt profilu¶
GET /partner
Atgriež tavu partnera profilu kopā ar neizmaksāto atlikumu — ērti, lai rādītu ieņēmumus savā admin UI bez to glabāšanas pie sevis.
Atbilde
{
"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¶
Kad ar pasūtījumu kaut kas notiek, mēs nosūtām (POST) parakstītu JSON notikumu uz tavu konfigurēto webhook URL.
Notikumu tipi¶
| Notikums | Kad tas tiek izsaukts |
|---|---|
order.created |
Stripe Checkout sesija izveidota, gaida maksājumu. |
order.paid |
Stripe apstiprināja maksājumu. Ieņēmumu notikums ierakstīts. |
order.cancelled |
Pasūtījumam beidzās termiņš vai tas tika skaidri atcelts. |
agent.provisioning_started |
Deploy pipeline sākās šim pasūtījumam. |
agent.ready |
Deploy izdevās. Payload satur panel_url un expires_at. |
agent.failed |
Deploy pipeline beidzās ar kļūdu. Pārbaudi error lauku, lai redzētu soli, kas salūza. |
agent.expired |
Aģenta TTL beidzies. Partneris var atjaunot ar POST /orders/{id}/renew. |
Piegāde un atkārtoti mēģinājumi¶
- Līdz 7 mēģinājumiem eksponenciālā grafikā:
0s, 30s, 2m, 10m, 1h, 6h, 24h. - Pēc pēdējā mēģinājuma piegāde tiek atzīmēta kā
exhaustedun atkārtota mēģināšana apstājas. - Atbildi ar
2xxstatusu 10 sekunžu laikā, lai apstiprinātu.
Pieprasījuma galvenes¶
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
Parauga payload — 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"
}
Paraksta pārbaude¶
Paraksts ir HMAC-SHA256(secret, "{timestamp}.{raw_body}"). Vienmēr pārbaudi raw pieprasījuma body — pārserializējot parsēto JSON, salīdzinājums vairs nesakritīs.
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"),
);
}
Idempotenti saņēmēji
Izmanto X-Mintbot-Event-Id kā deduplikācijas key — atkārtotie mēģinājumi izmanto to pašu id, tāpēc row-level INSERT … ON CONFLICT DO NOTHING šajā kolonnā pasargā tavu handler.
Kļūdas¶
Katra kļūdas atbilde nes stabilu code, pēc kura vari programmatiski sazaroties. message lauks ir cilvēkam lasāms padoms un starp laidieniem var mainīties. request_id atspoguļo X-Request-Id atbildes galveni — iekļauj to atbalsta pieteikumos.
{
"error": {
"code": "invalid_api_key",
"message": "API key is unknown or revoked.",
"request_id": "f0c2d6c4-…"
}
}
| Kods | Nozīme |
|---|---|
unauthenticated |
Trūkst Authorization galvenes vai tā ir nepareizā formā. |
invalid_api_key |
API key nav zināms vai ir izrotēts. |
rate_limited |
Pārsniegts partnera vai IP rate limit — skati Retry-After. |
missing_idempotency_key |
POST pieprasījums bez Idempotency-Key. |
idempotency_key_mismatch |
Tas pats key izmantots atkārtoti ar citu pieprasījuma body. |
validation_error |
Pieprasījuma body neizturēja shēmas validāciju. |
not_found |
Resurss neeksistē vai nepieder tavam partnerim. |
payment_gateway_error |
Stripe noraidīja Checkout sesijas izveidi. |
Ātruma ierobežojumi¶
- 120 pieprasījumi / 60 s slīdošais logs, katram partnerim. Burst un steady-state izmanto vienu bucket.
- 60 pieprasījumi / 60 s atsevišķs katra IP bucket neautentificētiem un neveiksmīgas autentifikācijas pieprasījumiem — tas neļauj bearer brute-force noēst partnera kvotu.
- Pārmērīgi pieprasījumi atgriež
429 rate_limitedarRetry-Aftergalveni (sekundes, cik ilgi atkāpties).
Vajadzīga palīdzība?¶
Šī dokumentācija ir rakstīta partneriem, kuri API patiešām lieto. Ja kaut kā trūkst, kaut kas ir neskaidrs vai novecojis, piemin to savam mintbot aģentam — viņš pārsūtīs atsauksmi, un mēs atjaunināsim lapu.