Endpoint index & limits

Every endpoint on the partner API in one place, with its rate limit, plus the limits and defaults the products run on.

On this page

Conventions#

Base URLhttps://api.mm2empire.com
AuthenticationX-Partner-Key: <secret> on every request. See Authentication.
Content typeapplication/json for every request body and response.
MoneyInteger US cents. Fields end in Cents; responses carry "currency": "USD".
TimestampsISO 8601 with offset, for example 2026-09-05T13:21:04+00:00.
WritesEvery POST marked below takes an Idempotency-Key header (≤ 128 characters). See Core concepts.
Errors{ "error": { "code", "message", "retryable" } }. See Errors.
Rate limitsPer company per route family per minute, shared across your keys. 429 with Retry-After.
Paginglimit and offset query parameters; responses carry items, total, limit, offset.

General#

EndpointPurposeLimit / min
GET /partner/v1/pingProve a key works; returns your slug, the key id and our server time.—

MM2 Payments — /partner/v1/payments#

EndpointPurposeLimit / min
POST /customers ⁱLink a customer (Roblox username or id, optional externalRef).60
GET /customersList linked customers. search, limit ≤ 200.120
GET /customers/{ref}One customer by any identifier.120
GET /customers/{ref}/inventoryWhat they hold, stacked, with your quote per stack. game, limit ≤ 100.60
POST /sessions ⁱOpen a pop-up session; returns token and URL.60
GET /sessions/{id}Session status, payments, orderCompletedAt.120
POST /sessions/{id}/closeEnd a session and fire its order rollup now.60
POST /quotePrice stacks without selling.60
POST /sell ⁱSell stacks to you. Per-item outcomes.20
GET /paymentsPayments taken. orderId, sessionId, customerRef, limit ≤ 200.120
GET /payments/{id}One payment.120
GET /orders/{orderId}Everything under one of your order ids.120
GET /itemsYour rate card. search, itemType, rarity, limit ≤ 100.60
POST /deposits ⁱWhere a customer sends items: live bots, join links, pop-up URL.60
POST /withdrawals ⁱReturn a customer's own items to their Roblox account. ≤ 4 item types.20
GET /withdrawals/{id}One withdrawal's status.120

ⁱ takes an Idempotency-Key.

MM2 Payouts — /partner/v1/payouts#

EndpointPurposeLimit / min
GET /listingsThe catalogue at your prices. Filters, sort, limit ≤ 100, offset ≤ 5000.120
POST /orders ⁱBuy up to 4 stacks / 100 items for a customer and start delivery.30
GET /orders/{id}One order, by our id or yours.120
POST /sessions ⁱOpen a shop pop-up with a retail multiplier.60
GET /claims?customerRef=What one customer still has to collect, and which bot holds it.120
GET /poolFloat balance, mode and your markup.60

Limits and defaults#

SettingValueNotes
Session token lifetime5 minutesOne-time. Exchanged when the pop-up opens.
Pop-up access window30 minutes default, 60 maximumttlSeconds on session creation.
orderId length120 charactersTrimmed. Not required to be unique.
metadata20 keys, scalar valuesStrings, integers, booleans or null. No nesting.
Idempotency key length128 characters
Stacks per sell request200MM2 Payments /sell.
Item types per withdrawal or payout order4One in-game delivery carries at most four stacks.
Items per payout order100
Payout order ceiling$1,000 defaultmaxOrderCents, set in the console. Optional daily cap.
Retail multiplier1.0× to 5.0×retailMultiplierBps 10000–50000. Rounds up.
MM2Empire margin on payoutsSet by staff, at most 100%markupBps, read-only for partners.
Default buy rate (own pool, custom rates)50% of catalogue valuedefaultBuyRateBps 5000. Seeded from ours on switch.
Default stock limit per item10 copiesmaxInventory.
Default relist markup10% over valuerelistMarkupBps 1000; may be negative down to −50%.
Minimum payout$0.01 defaultminPayoutCents.
Setting cooldowns15 minutesFunding source, pricing mode, pool mode, claiming earnings.
Webhook signature tolerance300 seconds
Webhook retries20 attempts, exponential backoff to hourly
Webhook delivery log retention30 days
Webhook URL length2048 charactershttps, port 443, public host.

Changes to the API#

The machine rail is a published contract. Fields are added, never removed or renamed, and a new field is always optional to read. Event types are added under new names; existing payloads keep their shape. If you parse responses strictly, allow unknown fields.