# BulkMail API v2 - generated from live responses captured 2026-10-11T17:33:06Z
openapi: 3.1.0
info:
title: BulkMail API
version: '2.0'
description: 'REST API for buying email accounts and other digital goods on BulkMail.
**Base URL** `https://bulkmail.shop/api/v2`
**Authentication.** Create a key on your dashboard (API Keys page) and send it on every request as the `X-API-Key`
header. The `api_key` query parameter also works but puts the key in logs, so prefer the header. Public endpoints
work without a key; with one they show your own prices.
**Responses.** JSON in an envelope: `{"success": true, "data": …}`, or `{"success": false, "error": "…"}`. Validation
errors (422) add `errors`, a map of field to messages. Lists are paginated with `page` and `per_page` (max 100)
and return `meta`.
**Unknown paths** answer with a JSON 404: `{"success": false, "error": "No endpoint for GET /api/v2/nope"}`.
**Formats.** Dates are ISO 8601 in UTC (`2026-10-11T14:32:46.000000Z`). Money is USD as a number with up to
8 decimals. Ids are integers.
Examples are real responses captured on 2026-10-11, with the account holder''s details and delivered account
lines replaced by samples. Long lists are cut to their first 3 items.'
contact:
name: BulkMail Support
url: https://bulkmail.shop
externalDocs:
description: Web reference, Postman collection and Markdown
url: https://bulkmail.shop/v2-docs
servers:
- url: https://bulkmail.shop/api/v2
description: Production
tags:
- name: Account
description: 'Your profile, password and dashboard.
| Method | Endpoint | What it does |
|---|---|---|
| `GET` | `/user/profile` | Get your profile |
| `PUT` | `/user/profile` | Update your profile |
| `POST` | `/user/password` | Change your password |
| `GET` | `/user/dashboard` | Get your dashboard |
| `DELETE` | `/user/account` | Delete your account |
**Authentication:** API key. Send your key in the `X-API-Key` header.'
x-page-icon: user
- name: Products
description: 'The catalogue and prices. Public; send your key to see your own prices.
| Method | Endpoint | What it does |
|---|---|---|
| `GET` | `/products` | List products |
| `GET` | `/products/{id}` | Get a product |
| `POST` | `/products/{id}/calculate-price` | Calculate a price |
| `GET` | `/tabs` | List tabs (categories) |
**Authentication:** Public (API key optional). Send your key in the `X-API-Key` header.'
x-page-icon: box
- name: Stock
description: 'Live stock figures. Public.
| Method | Endpoint | What it does |
|---|---|---|
| `GET` | `/stock` | Stock of all products |
| `GET` | `/stock/{id}` | Stock of one product |
| `GET` | `/stock/check` | Stock of several products |
| `GET` | `/stock/categories` | Stock per category |
**Authentication:** Public (API key optional). Send your key in the `X-API-Key` header.'
x-page-icon: warehouse
- name: Orders
description: 'Buy products and read your orders.
| Method | Endpoint | What it does |
|---|---|---|
| `GET` | `/orders` | List your orders |
| `GET` | `/orders/{id}` | Get an order |
| `POST` | `/orders` | Place an order |
| `POST` | `/orders/{id}/cancel` | Cancel an order |
| `GET` | `/orders/{id}/export` | Export delivered lines |
**Authentication:** API key. Send your key in the `X-API-Key` header.'
x-page-icon: cart-shopping
- name: Wallet
description: 'Balance, transactions and deposits.
| Method | Endpoint | What it does |
|---|---|---|
| `GET` | `/wallet/balance` | Get your balance |
| `GET` | `/wallet/transactions` | List transactions |
| `POST` | `/wallet/deposit` | Start a deposit |
| `GET` | `/wallet/deposits` | List deposits |
| `GET` | `/wallet/deposits/{id}` | Get a deposit |
**Authentication:** API key. Send your key in the `X-API-Key` header.'
x-page-icon: wallet
- name: Purchases
description: 'Every account line delivered to you.
| Method | Endpoint | What it does |
|---|---|---|
| `GET` | `/purchases` | List purchased lines |
| `GET` | `/purchases/{id}` | Get a purchased line |
**Authentication:** API key. Send your key in the `X-API-Key` header.'
x-page-icon: receipt
- name: API Keys
description: 'Manage the keys that authenticate you.
| Method | Endpoint | What it does |
|---|---|---|
| `GET` | `/api-keys` | List your API keys |
| `POST` | `/api-keys` | Create an API key |
| `DELETE` | `/api-keys/{id}` | Revoke an API key |
**Authentication:** API key. Send your key in the `X-API-Key` header.'
x-page-icon: key
components:
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: X-API-Key
description: Your API key (sk_live_…).
ApiKeyQuery:
type: apiKey
in: query
name: api_key
description: Same key as a query parameter. Prefer the header.
schemas:
Error:
type: object
required:
- success
- error
properties:
success:
type: boolean
const: false
error:
type: string
description: What went wrong.
errors:
type: object
description: 'Details: field name to messages for validation errors; code and allowed_quantities for pack-size
errors.'
responses:
Unauthorized:
description: Missing or invalid API key
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
success: false
error: Invalid or missing authentication
paths:
/user/profile:
get:
tags:
- Account
summary: Get your profile
operationId: getUserProfile
description: Your account details and current balance (USD).
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
id:
type: integer
name:
type: string
email:
type: string
balance:
type: number
description: Balance in USD.
status:
type: string
description: Current status.
email_verified_at:
type: string
format: date-time
description: ISO 8601, UTC.
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
required:
- id
- name
- email
- balance
- status
- email_verified_at
- created_at
description: The account line.
required:
- success
- data
examples:
Profile:
summary: Profile
value:
success: true
data:
id: 1001
name: Demo User
email: demo@example.com
balance: 339.60453503
status: active
email_verified_at: '2026-02-21T05:56:10.000000Z'
created_at: '2026-02-21T05:56:10.000000Z'
'401':
description: 'Missing or invalid API key: No or invalid key'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
No_or_invalid_key:
summary: No or invalid key
value:
success: false
error: Invalid or missing authentication
put:
tags:
- Account
summary: Update your profile
operationId: updateUserProfile
description: Change your name and/or email. Fields you leave out keep their current value.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: New display name.
email:
type: string
format: email
description: New email; must not belong to another account.
example:
name: Demo User
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
message:
type: string
description: Human-readable note. Present only on some responses.
data:
type: object
properties:
id:
type: integer
name:
type: string
email:
type: string
balance:
type: number
description: Balance in USD.
status:
type: string
description: Current status.
email_verified_at:
type: string
format: date-time
description: ISO 8601, UTC.
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
required:
- id
- name
- email
- balance
- status
- email_verified_at
- created_at
description: The account line.
required:
- success
- message
- data
examples:
Updated:
summary: Updated (illustrative)
value:
success: true
message: Profile updated successfully
data:
id: 1001
name: Demo User
email: demo@example.com
balance: 125.5
status: active
email_verified_at: '2026-02-21T05:56:10.000000Z'
created_at: '2026-02-21T05:56:10.000000Z'
'422':
description: 'Validation failed or cannot be fulfilled: Invalid email'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
errors:
type: object
properties:
email:
type: array
items:
type: string
required:
- email
description: 'Details: field name to messages for validation errors; code and allowed_quantities
for pack-size errors.'
required:
- success
- error
- errors
examples:
Invalid_email:
summary: Invalid email
value:
success: false
error: Validation failed
errors:
email:
- Valid email is required.
'401':
$ref: '#/components/responses/Unauthorized'
/user/password:
post:
tags:
- Account
summary: Change your password
operationId: postUserPassword
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
current_password:
type: string
new_password:
type: string
description: At least 8 characters.
confirm_password:
type: string
description: Must equal new_password.
required:
- current_password
- new_password
- confirm_password
example:
current_password: old-password
new_password: new-password-123
confirm_password: new-password-123
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
message:
type: string
description: Human-readable note. Present only on some responses.
required:
- success
- message
examples:
Changed:
summary: Changed (illustrative)
value:
success: true
message: Password changed successfully
'422':
description: 'Validation failed or cannot be fulfilled: Wrong current password'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
errors:
type: object
properties:
current_password:
type: array
items:
type: string
new_password:
type: array
items:
type: string
confirm_password:
type: array
items:
type: string
required:
- current_password
- new_password
- confirm_password
description: 'Details: field name to messages for validation errors; code and allowed_quantities
for pack-size errors.'
required:
- success
- error
- errors
examples:
Wrong_current_password:
summary: Wrong current password
value:
success: false
error: Validation failed
errors:
current_password:
- Current password is incorrect.
new_password:
- New password must be at least 8 characters.
confirm_password:
- Passwords do not match.
'401':
$ref: '#/components/responses/Unauthorized'
/user/dashboard:
get:
tags:
- Account
summary: Get your dashboard
operationId: getUserDashboard
description: Account, totals, and your 5 most recent orders and transactions.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
user:
type: object
properties:
id:
type: integer
name:
type: string
email:
type: string
balance:
type: number
description: Balance in USD.
status:
type: string
description: Current status.
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
required:
- id
- name
- email
- balance
- status
- created_at
stats:
type: object
properties:
total_orders:
type: integer
total_spent:
type: number
purchased_items:
type: integer
required:
- total_orders
- total_spent
- purchased_items
recent_orders:
type: array
items:
type: object
properties:
id:
type: integer
product_id:
type: integer
description: Product id (see GET /products).
quantity:
type: integer
description: Units to buy.
total_amount:
type: number
description: Amount charged, USD.
status:
type: string
description: Current status.
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
required:
- id
- product_id
- quantity
- total_amount
- status
- created_at
recent_transactions:
type: array
items:
type: object
properties:
id:
type: integer
type:
type: string
description: Transaction type. credit = admin top-up or referral reward.
amount:
type: number
description: USD, always positive.
direction:
type: string
description: in (money added) or out (money spent).
signed_amount:
type: number
description: 'amount with a sign: positive for in, negative for out.'
balance_after:
type: number
description: Your balance after this transaction, USD.
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
required:
- id
- type
- amount
- direction
- signed_amount
- balance_after
- created_at
required:
- user
- stats
- recent_orders
- recent_transactions
description: The account line.
required:
- success
- data
examples:
Dashboard:
summary: Dashboard
value:
success: true
data:
user:
id: 1001
name: Demo User
email: demo@example.com
balance: 339.60453503
status: active
created_at: '2026-02-21T05:56:10.000000Z'
stats:
total_orders: 3656
total_spent: 560.39546497
purchased_items: 14574
recent_orders:
- id: 1232875
product_id: 13
quantity: 2
total_amount: 0.02394032
status: completed
created_at: '2026-10-11T16:58:00.000000Z'
- id: 1232770
product_id: 13
quantity: 1
total_amount: 0.01197016
status: completed
created_at: '2026-10-11T16:30:01.000000Z'
- id: 1232374
product_id: 970
quantity: 1
total_amount: 0.00455153
status: completed
created_at: '2026-10-11T14:32:46.000000Z'
recent_transactions:
- id: 1247991
type: purchase
amount: 0.02394032
direction: out
signed_amount: -0.02394032
balance_after: 339.60453503
created_at: '2026-10-11T16:58:00.000000Z'
- id: 1247879
type: purchase
amount: 0.01197016
direction: out
signed_amount: -0.01197016
balance_after: 339.62847535
created_at: '2026-10-11T16:30:01.000000Z'
- id: 1247463
type: purchase
amount: 0.00455153
direction: out
signed_amount: -0.00455153
balance_after: 339.64044551
created_at: '2026-10-11T14:32:46.000000Z'
'401':
$ref: '#/components/responses/Unauthorized'
/user/account:
delete:
tags:
- Account
summary: Delete your account
operationId: deleteUserAccount
description: Closes the account. Requires your password. This cannot be undone through the API.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
password:
type: string
required:
- password
example:
password: your-password
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
message:
type: string
description: Human-readable note. Present only on some responses.
required:
- success
- message
examples:
Deleted:
summary: Deleted (illustrative)
value:
success: true
message: Account deleted successfully
'422':
description: 'Validation failed or cannot be fulfilled: Wrong password'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
errors:
type: object
properties:
password:
type: array
items:
type: string
required:
- password
description: 'Details: field name to messages for validation errors; code and allowed_quantities
for pack-size errors.'
required:
- success
- error
- errors
examples:
Wrong_password:
summary: Wrong password
value:
success: false
error: Validation failed
errors:
password:
- Incorrect password.
'401':
$ref: '#/components/responses/Unauthorized'
/products:
get:
tags:
- Products
summary: List products
operationId: listProducts
description: 'The catalogue, paginated. Send your API key to get your own prices: pricing flags appear only
when they apply.'
security:
- {}
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: page
in: query
required: false
schema:
type: integer
minimum: 1
default: 1
description: Page number, from 1.
example: 1
- name: per_page
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 20
description: Items per page, 1-100 (default 20).
example: 20
- name: search
in: query
required: false
schema:
type: string
description: 'Text to find in name, SKU or description. Alias: q.'
example: gmail
- name: tab_id
in: query
required: false
schema:
type: integer
description: Only products in this tab (see /tabs).
- name: in_stock
in: query
required: false
schema:
type: boolean
description: true = in stock only, false = out of stock only.
- name: sort
in: query
required: false
schema:
type: string
enum:
- name
- price
- stock_quantity
- created_at
description: Sort field (default name).
- name: order
in: query
required: false
schema:
type: string
enum:
- asc
- desc
description: Sort direction (default asc).
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
sku:
type: string
tab_id:
type: integer
description: Storefront tab (category) id; see GET /tabs.
price:
type: number
description: Your unit price in USD after custom, reseller, bulk and discount pricing.
base_price:
type: number
description: List price in USD before any pricing rules.
user_discount_applied:
type: boolean
description: Present (true) only when your account discount applies.
user_discount_percent:
type: integer
description: Your account discount in percent. Present only with user_discount_applied.
stock_quantity:
type: integer
description: Units available.
in_stock:
type: boolean
description: true when at least one unit is available.
bulk_pricing_enabled:
type: boolean
description: true when the product offers bulk tiers to you.
image_url:
type: 'null'
image_type:
type: 'null'
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
is_pack:
type: boolean
description: true for products sold only in fixed pack sizes.
allowed_quantities:
type: 'null'
description: Pack sizes you may order. null for normal products.
pack_options:
type: 'null'
description: Each pack size with your price and whether it is in stock. null for normal
products.
description:
type: string
description: 'Description as stored: plain text or HTML.'
description_format:
type: string
description: html or text.
description_text:
type: string
description: Description with all markup removed.
description_html:
type: 'null'
description: Cleaned HTML, safe to render (no attributes, scripts or links). null for
plain-text descriptions.
required:
- id
- name
- sku
- tab_id
- price
- base_price
- stock_quantity
- in_stock
- bulk_pricing_enabled
- image_url
- image_type
- created_at
- is_pack
- allowed_quantities
- pack_options
- description
- description_format
- description_text
- description_html
description: The account line.
meta:
type: object
properties:
current_page:
type: integer
description: Page returned.
per_page:
type: integer
description: Items per page.
total:
type: integer
description: Items across all pages.
total_pages:
type: integer
description: Number of pages.
required:
- current_page
- per_page
- total
- total_pages
description: Pagination.
required:
- success
- data
- meta
examples:
With_your_key:
summary: With your key
value:
success: true
data:
- id: 911
name: ✔️ live 2 minute xxx@RanDom
sku: LIVE2MINUTEX
tab_id: 26
price: 0.00253132
base_price: 0.00260961
user_discount_applied: true
user_discount_percent: 3
stock_quantity: 0
in_stock: false
bulk_pricing_enabled: false
image_url: null
image_type: null
created_at: '2026-09-19T15:06:13.000000Z'
is_pack: false
allowed_quantities: null
pack_options: null
description: ✔️ live 2 minute xxx@RanDom
description_format: text
description_text: ✔️ live 2 minute xxx@RanDom
description_html: null
- id: 906
name: 10 Minutes – 99 per [ID 180] ----No
sku: 10PHT99PERID
tab_id: 26
price: 0.00353677
base_price: 0.00364615
user_discount_applied: true
user_discount_percent: 3
stock_quantity: 0
in_stock: false
bulk_pricing_enabled: false
image_url: null
image_type: null
created_at: '2026-09-13T18:07:05.000000Z'
is_pack: false
allowed_quantities: null
pack_options: null
description: 10 Minutes – 99 /Time [ID 180] ----No
description_format: text
description_text: 10 Minutes – 99 /Time [ID 180] ----No
description_html: null
meta:
current_page: 1
per_page: 2
total: 427
total_pages: 214
Search:
summary: Search
value:
success: true
data:
- id: 814
name: Airbnb Gmail
sku: AIRBNBGMA-3013
tab_id: 8
price: 0.035696
base_price: 0.0368
user_discount_applied: true
user_discount_percent: 3
stock_quantity: 5041
in_stock: true
bulk_pricing_enabled: false
image_url: null
image_type: null
created_at: '2026-08-15T06:58:01.000000Z'
is_pack: false
allowed_quantities: null
pack_options: null
description: Gmail API - Receive any Airbnb email message
description_format: text
description_text: Gmail API - Receive any Airbnb email message
description_html: null
- id: 810
name: Alibaba Gmail
sku: ALIBABAGM-39
tab_id: 8
price: 0.0591215
base_price: 0.06095
user_discount_applied: true
user_discount_percent: 3
stock_quantity: 5002
in_stock: true
bulk_pricing_enabled: false
image_url: null
image_type: null
created_at: '2026-08-15T06:58:01.000000Z'
is_pack: false
allowed_quantities: null
pack_options: null
description: Gmail API - Receive any Alibaba email message
description_format: text
description_text: Gmail API - Receive any Alibaba email message
description_html: null
meta:
current_page: 1
per_page: 2
total: 211
total_pages: 106
Without_a_key:
summary: Without a key
value:
success: true
data:
- id: 911
name: ✔️ live 2 minute xxx@RanDom
sku: LIVE2MINUTEX
tab_id: 26
price: 0.00260961
base_price: 0.00260961
stock_quantity: 0
in_stock: false
bulk_pricing_enabled: false
image_url: null
image_type: null
created_at: '2026-09-19T15:06:13.000000Z'
is_pack: false
allowed_quantities: null
pack_options: null
description: ✔️ live 2 minute xxx@RanDom
description_format: text
description_text: ✔️ live 2 minute xxx@RanDom
description_html: null
- id: 906
name: 10 Minutes – 99 per [ID 180] ----No
sku: 10PHT99PERID
tab_id: 26
price: 0.00364615
base_price: 0.00364615
stock_quantity: 0
in_stock: false
bulk_pricing_enabled: false
image_url: null
image_type: null
created_at: '2026-09-13T18:07:05.000000Z'
is_pack: false
allowed_quantities: null
pack_options: null
description: 10 Minutes – 99 /Time [ID 180] ----No
description_format: text
description_text: 10 Minutes – 99 /Time [ID 180] ----No
description_html: null
meta:
current_page: 1
per_page: 2
total: 427
total_pages: 214
/products/{id}:
get:
tags:
- Products
summary: Get a product
operationId: getProductsById
description: One product with its features, and bulk_pricing_tiers when bulk pricing applies to you.
security:
- {}
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
description: Product id.
example: 986
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
id:
type: integer
name:
type: string
sku:
type: string
tab_id:
type: integer
description: Storefront tab (category) id; see GET /tabs.
price:
type: number
description: Your unit price in USD after custom, reseller, bulk and discount pricing.
base_price:
type: number
description: List price in USD before any pricing rules.
user_discount_applied:
type: boolean
description: Present (true) only when your account discount applies.
user_discount_percent:
type: integer
description: Your account discount in percent. Present only with user_discount_applied.
stock_quantity:
type: integer
description: Units available.
in_stock:
type: boolean
description: true when at least one unit is available.
bulk_pricing_enabled:
type: boolean
description: true when the product offers bulk tiers to you.
image_url:
type: 'null'
image_type:
type: 'null'
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
is_pack:
type: boolean
description: true for products sold only in fixed pack sizes.
allowed_quantities:
type:
- array
- 'null'
items:
type: integer
description: Pack sizes you may order. null for normal products.
pack_options:
type:
- array
- 'null'
items:
type: object
properties:
quantity:
type: integer
description: Units to buy.
unit_price:
type: number
description: Price paid per unit, USD.
total_price:
type: number
available:
type: boolean
required:
- quantity
- unit_price
- total_price
- available
description: Each pack size with your price and whether it is in stock. null for normal
products.
description:
type: string
description: 'Description as stored: plain text or HTML.'
description_format:
type: string
description: html or text.
description_text:
type: string
description: Description with all markup removed.
description_html:
type:
- string
- 'null'
description: Cleaned HTML, safe to render (no attributes, scripts or links). null for plain-text
descriptions.
features:
type: array
items: {}
required:
- id
- name
- sku
- tab_id
- price
- base_price
- user_discount_applied
- user_discount_percent
- stock_quantity
- in_stock
- bulk_pricing_enabled
- image_url
- image_type
- created_at
- is_pack
- allowed_quantities
- pack_options
- description
- description_format
- description_text
- description_html
- features
description: The account line.
required:
- success
- data
examples:
Product:
summary: Product
value:
success: true
data:
id: 986
name: 1h - 12h edu.pl
sku: 1H12HEDUPL
tab_id: 42
price: 0.02571542
base_price: 0.02651074
user_discount_applied: true
user_discount_percent: 3
stock_quantity: 1022
in_stock: true
bulk_pricing_enabled: false
image_url: null
image_type: null
created_at: '2026-10-04T18:20:15.000000Z'
is_pack: false
allowed_quantities: null
pack_options: null
description: 1h - 12h edu.pl
description_format: text
description_text: 1h - 12h edu.pl
description_html: null
features: []
Pack_product_with_HTML_description:
summary: Pack product with HTML description
value:
success: true
data:
id: 1003
name: Custom Domain Gmail | 24H | Pesviv.com
sku: CUSTOMDOMAIN
tab_id: 26
price: 0.01455
base_price: 0.015
user_discount_applied: true
user_discount_percent: 3
stock_quantity: 3594
in_stock: true
bulk_pricing_enabled: false
image_url: null
image_type: null
created_at: '2026-10-11T10:31:09.000000Z'
is_pack: true
allowed_quantities:
- 12
- 25
- 35
- 45
- 65
- 85
- 95
- 135
- 405
- 540
- 675
- 1350
pack_options:
- quantity: 12
unit_price: 0.01455
total_price: 0.1746
available: true
- quantity: 25
unit_price: 0.01455
total_price: 0.36375
available: true
- quantity: 35
unit_price: 0.01455
total_price: 0.50925
available: true
description:
Premium custom-domain Gmail accounts with full Gmail / Google Workspace
inbox access, suitable for verification, platform sign-ups, testing, and other
operational use.
- Type: Custom Gmail Domain Account
- Domain:
Random Custom Domain
- Access: Full Gmail Inbox Access Not Guaranteed.
- Delivery:
Instant Automated Delivery
- Duration: As mentioned in the product
title
Important Notice
- Domain
names are randomly assigned and may vary between orders. We strongly recommend purchasing
a small quantity first and testing compatibility with your software, proxy, or intended
platform before placing a bulk order.
- These are temporary
accounts. Do not store critical or sensitive information. Use responsibly and in accordance
with the target platform's policies.
description_format: html
description_text: 'Premium custom-domain Gmail accounts with full Gmail / Google Workspace
inbox access, suitable for verification, platform sign-ups, testing, and other operational
use. Type: Custom Gmail Domain Account Domain: Random Custom Domain Access: Full Gmail Inbox
Access Not Guaranteed. Delivery: Instant Automated Delivery Duration: As mentioned in the
product title Important Notice Domain names are randomly assigned and may vary between orders.
We strongly recommend purchasing a small quantity first and testing compatibility with your
software, proxy, or intended platform before placing a bulk order. These are temporary accounts.
Do not store critical or sensitive information. Use responsibly and in accordance with the
target platform''s policies.'
description_html: Premium custom-domain Gmail accounts with full Gmail / Google
Workspace inbox access, suitable for verification, platform sign-ups, testing,
and other operational use.
- Type: Custom Gmail Domain Account
- Domain:
Random Custom Domain
- Access: Full Gmail Inbox Access Not Guaranteed.
- Delivery:
Instant Automated Delivery
- Duration: As mentioned in the product
title
Important Notice
- Domain
names are randomly assigned and may vary between orders. We strongly recommend purchasing
a small quantity first and testing compatibility with your software, proxy, or intended
platform before placing a bulk order.
- These are temporary
accounts. Do not store critical or sensitive information. Use responsibly and in accordance
with the target platform's policies.
features: []
'404':
description: 'Not found: Not found'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
Not_found:
summary: Not found
value:
success: false
error: Product not found
/products/{id}/calculate-price:
post:
tags:
- Products
summary: Calculate a price
operationId: postProductsByIdCalculatePrice
description: What a quantity would cost you. Pack products accept only their allowed_quantities.
security:
- {}
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
description: Product id.
example: 986
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
quantity:
type: integer
description: 1 or more; for pack products one of allowed_quantities.
required:
- quantity
example:
quantity: 10
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
product_id:
type: integer
description: Product id (see GET /products).
quantity:
type: integer
description: Units to buy.
base_price:
type: number
description: List price in USD before any pricing rules.
applied_price:
type: number
description: Unit price you would pay, USD.
total_amount:
type: number
description: Amount charged, USD.
discount_percentage:
type: integer
description: Saving against base_price in percent. Left out when 0.
user_discount_applied:
type: boolean
description: Present (true) only when your account discount applies.
user_discount_percent:
type: integer
description: Your account discount in percent. Present only with user_discount_applied.
price_before_user_discount:
type: number
description: Unit price before your account discount. Present only with user_discount_applied.
required:
- product_id
- quantity
- base_price
- applied_price
- total_amount
description: The account line.
required:
- success
- data
examples:
With_your_key:
summary: With your key
value:
success: true
data:
product_id: 986
quantity: 10
base_price: 0.02651074
applied_price: 0.02571542
total_amount: 0.25715
discount_percentage: 3
user_discount_applied: true
user_discount_percent: 3
price_before_user_discount: 0.02651
Without_a_key:
summary: Without a key
value:
success: true
data:
product_id: 986
quantity: 10
base_price: 0.02651074
applied_price: 0.02651074
total_amount: 0.26511
'400':
description: 'Bad request: Invalid pack size, Quantity 0'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
errors:
type: object
properties:
code:
type: string
allowed_quantities:
type: array
items:
type: integer
description: Pack sizes you may order. null for normal products.
required:
- code
- allowed_quantities
description: 'Details: field name to messages for validation errors; code and allowed_quantities
for pack-size errors.'
required:
- success
- error
examples:
Invalid_pack_size:
summary: Invalid pack size
value:
success: false
error: 'This product is sold in packs only. Please choose one of these quantities: 12, 25, 35,
45, 65, 85, 95, 135, 405, 540, 675, 1350.'
errors:
code: INVALID_PACK_SIZE
allowed_quantities:
- 12
- 25
- 35
- 45
- 65
- 85
- 95
- 135
- 405
- 540
- 675
- 1350
Quantity_0:
summary: Quantity 0
value:
success: false
error: Quantity must be at least 1
/tabs:
get:
tags:
- Products
summary: List tabs (categories)
operationId: listTabs
description: Storefront tabs in display order. A product's tab_id points here.
security:
- {}
- ApiKeyAuth: []
- ApiKeyQuery: []
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
slug:
type: string
title:
type: string
description:
type: string
description: 'Description as stored: plain text or HTML.'
logo_url:
type:
- string
- 'null'
sort_order:
type: integer
product_count:
type: integer
required:
- id
- name
- slug
- title
- description
- logo_url
- sort_order
- product_count
description: The account line.
required:
- success
- data
examples:
Tabs:
summary: Tabs
value:
success: true
data:
- id: 7
name: All
slug: all
title: Popular Shop
description: ''
logo_url: null
sort_order: -2
product_count: 0
- id: 6
name: 'Hotmail Outlook '
slug: hotmail-outlook
title: 'Hotmail Outlook '
description: ''
logo_url: https://bulkmail.shop/uploads/icons/icon_187.webp
sort_order: -1
product_count: 34
- id: 4
name: 'Outlook Domain Country '
slug: outlook-domain-country
title: 'Outlook Domain Country '
description: ''
logo_url: https://bulkmail.shop/uploads/icons/icon_136.webp
sort_order: 0
product_count: 30
/stock:
get:
tags:
- Stock
summary: Stock of all products
operationId: listStock
description: Every product on sale with its stock (not paginated). last_updated is when that figure was refreshed.
security:
- {}
- ApiKeyAuth: []
- ApiKeyQuery: []
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
products:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
sku:
type: string
stock:
type: integer
description: Units available.
in_stock:
type: boolean
description: true when at least one unit is available.
is_pack:
type: boolean
description: true for products sold only in fixed pack sizes.
allowed_quantities:
type: 'null'
description: Pack sizes you may order. null for normal products.
last_updated:
type: string
format: date-time
description: When this stock figure was refreshed. ISO 8601, UTC; null if unknown.
required:
- id
- name
- sku
- stock
- in_stock
- is_pack
- allowed_quantities
- last_updated
total_products:
type: integer
timestamp:
type: string
format: date-time
description: Time of this response. ISO 8601, UTC.
required:
- products
- total_products
- timestamp
description: The account line.
required:
- success
- data
examples:
All_products:
summary: All products
value:
success: true
data:
products:
- id: 911
name: ✔️ live 2 minute xxx@RanDom
sku: LIVE2MINUTEX
stock: 0
in_stock: false
is_pack: false
allowed_quantities: null
last_updated: '2026-10-11T17:33:03.000000Z'
- id: 906
name: 10 Minutes – 99 per [ID 180] ----No
sku: 10PHT99PERID
stock: 0
in_stock: false
is_pack: false
allowed_quantities: null
last_updated: '2026-10-11T17:33:03.000000Z'
- id: 986
name: 1h - 12h edu.pl
sku: 1H12HEDUPL
stock: 1022
in_stock: true
is_pack: false
allowed_quantities: null
last_updated: '2026-10-11T17:31:29.000000Z'
total_products: 427
timestamp: '2026-10-11T17:33:03.000000Z'
/stock/{id}:
get:
tags:
- Stock
summary: Stock of one product
operationId: getStockById
security:
- {}
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
description: Product id.
example: 986
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
id:
type: integer
name:
type: string
sku:
type: string
stock:
type: integer
description: Units available.
in_stock:
type: boolean
description: true when at least one unit is available.
is_pack:
type: boolean
description: true for products sold only in fixed pack sizes.
allowed_quantities:
type: 'null'
description: Pack sizes you may order. null for normal products.
last_updated:
type: string
format: date-time
description: When this stock figure was refreshed. ISO 8601, UTC; null if unknown.
required:
- id
- name
- sku
- stock
- in_stock
- is_pack
- allowed_quantities
- last_updated
description: The account line.
required:
- success
- data
examples:
Product:
summary: Product
value:
success: true
data:
id: 986
name: 1h - 12h edu.pl
sku: 1H12HEDUPL
stock: 1022
in_stock: true
is_pack: false
allowed_quantities: null
last_updated: '2026-10-11T17:31:29.000000Z'
'404':
description: 'Not found: Not found'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
Not_found:
summary: Not found
value:
success: false
error: Product not found
/stock/check:
get:
tags:
- Stock
summary: Stock of several products
operationId: listStockCheck
security:
- {}
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: ids
in: query
required: true
schema:
type: string
description: Comma-separated product ids, up to 50.
example: 986,1003
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
products:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
stock:
type: integer
description: Units available.
in_stock:
type: boolean
description: true when at least one unit is available.
is_pack:
type: boolean
description: true for products sold only in fixed pack sizes.
allowed_quantities:
type:
- array
- 'null'
items:
type: integer
description: Pack sizes you may order. null for normal products.
error:
type: string
description: What went wrong.
required:
- id
- stock
- in_stock
timestamp:
type: string
format: date-time
description: Time of this response. ISO 8601, UTC.
required:
- products
- timestamp
description: The account line.
required:
- success
- data
examples:
Three_ids_one_unknown:
summary: Three ids, one unknown
value:
success: true
data:
products:
- id: 986
name: 1h - 12h edu.pl
stock: 1022
in_stock: true
is_pack: false
allowed_quantities: null
- id: 1003
name: Custom Domain Gmail | 24H | Pesviv.com
stock: 3594
in_stock: true
is_pack: true
allowed_quantities:
- 12
- 25
- 35
- 45
- 65
- 85
- 95
- 135
- 405
- 540
- 675
- 1350
- id: 99999999
error: Product not found
stock: 0
in_stock: false
timestamp: '2026-10-11T17:33:03.000000Z'
'400':
description: 'Bad request: Missing ids'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
Missing_ids:
summary: Missing ids
value:
success: false
error: Product IDs required
/stock/categories:
get:
tags:
- Stock
summary: Stock per category
operationId: listStockCategories
description: Stock totals per storefront tab, in /tabs order. Tabs with nothing on sale are left out.
security:
- {}
- ApiKeyAuth: []
- ApiKeyQuery: []
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
categories:
type: array
items:
type: object
properties:
tab_id:
type: integer
description: Storefront tab (category) id; see GET /tabs.
category:
type: string
slug:
type: string
products:
type: integer
total_stock:
type: integer
in_stock_products:
type: integer
required:
- tab_id
- category
- slug
- products
- total_stock
- in_stock_products
timestamp:
type: string
format: date-time
description: Time of this response. ISO 8601, UTC.
required:
- categories
- timestamp
description: The account line.
required:
- success
- data
examples:
Categories:
summary: Categories
value:
success: true
data:
categories:
- tab_id: 6
category: 'Hotmail Outlook '
slug: hotmail-outlook
products: 34
total_stock: 926861
in_stock_products: 18
- tab_id: 4
category: 'Outlook Domain Country '
slug: outlook-domain-country
products: 30
total_stock: 412677
in_stock_products: 26
- tab_id: 9
category: Short Live Mail
slug: short-live-mail
products: 3
total_stock: 0
in_stock_products: 0
timestamp: '2026-10-11T17:33:04.000000Z'
/orders:
get:
tags:
- Orders
summary: List your orders
operationId: listOrders
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: page
in: query
required: false
schema:
type: integer
minimum: 1
default: 1
description: Page number, from 1.
example: 1
- name: per_page
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 20
description: Items per page, 1-100 (default 20).
example: 20
- name: status
in: query
required: false
schema:
type: string
enum:
- pending
- completed
- cancelled
- refunded
- name: date_from
in: query
required: false
schema:
type: string
format: date
description: YYYY-MM-DD
- name: date_to
in: query
required: false
schema:
type: string
format: date
description: YYYY-MM-DD (inclusive)
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: array
items:
type: object
properties:
id:
type: integer
product_id:
type: integer
description: Product id (see GET /products).
product_name:
type: string
quantity:
type: integer
description: Units to buy.
unit_price:
type: number
description: Price paid per unit, USD.
total_amount:
type: number
description: Amount charged, USD.
status:
type: string
description: Current status.
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
required:
- id
- product_id
- product_name
- quantity
- unit_price
- total_amount
- status
- created_at
description: The account line.
meta:
type: object
properties:
current_page:
type: integer
description: Page returned.
per_page:
type: integer
description: Items per page.
total:
type: integer
description: Items across all pages.
total_pages:
type: integer
description: Number of pages.
required:
- current_page
- per_page
- total
- total_pages
description: Pagination.
required:
- success
- data
- meta
examples:
Latest_orders:
summary: Latest orders
value:
success: true
data:
- id: 1232875
product_id: 13
product_name: Gmail Edu domain rental for 24 hours (.us domain) with Gmail
quantity: 2
unit_price: 0.01197016
total_amount: 0.02394032
status: completed
created_at: '2026-10-11T16:58:00.000000Z'
- id: 1232770
product_id: 13
product_name: Gmail Edu domain rental for 24 hours (.us domain) with Gmail
quantity: 1
unit_price: 0.01197016
total_amount: 0.01197016
status: completed
created_at: '2026-10-11T16:30:01.000000Z'
meta:
current_page: 1
per_page: 2
total: 3656
total_pages: 1828
'401':
$ref: '#/components/responses/Unauthorized'
post:
tags:
- Orders
summary: Place an order
operationId: postOrders
description: 'Buys a product: your balance is charged and the account lines come back in items. Manual products
answer with status pending (or completed when ready stock covered it) and are delivered later.'
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
product_id:
type: integer
description: Product id (see GET /products).
quantity:
type: integer
description: 1 or more; for pack products one of allowed_quantities.
reward_code:
type: string
description: Optional discount code.
required:
- product_id
- quantity
example:
product_id: 986
quantity: 2
responses:
'201':
description: Created
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
order_id:
type: integer
product_name:
type: string
quantity:
type: integer
description: Units to buy.
unit_price:
type: number
description: Price paid per unit, USD.
total_amount:
type: number
description: Amount charged, USD.
balance_remaining:
type: number
description: Your balance after this order, USD.
items:
type: array
items:
type: string
description: Delivered account lines.
required:
- order_id
- product_name
- quantity
- unit_price
- total_amount
- balance_remaining
- items
description: The account line.
required:
- success
- data
examples:
Order_placed:
summary: Order placed (illustrative)
value:
success: true
data:
order_id: 1232999
product_name: 1h - 12h edu.pl
quantity: 2
unit_price: 0.02571542
total_amount: 0.05143084
balance_remaining: 125.44856916
items:
- account1@example.com:Sample2
- account1@example.com:Sample2
'400':
description: 'Bad request: Missing product_id, Invalid pack size, Invalid reward code'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
errors:
type: object
properties:
code:
type: string
allowed_quantities:
type: array
items:
type: integer
description: Pack sizes you may order. null for normal products.
required:
- code
- allowed_quantities
description: 'Details: field name to messages for validation errors; code and allowed_quantities
for pack-size errors.'
required:
- success
- error
examples:
Missing_product_id:
summary: Missing product_id
value:
success: false
error: product_id is required
Invalid_pack_size:
summary: Invalid pack size
value:
success: false
error: 'This product is sold in packs only. Please choose one of these quantities: 12, 25, 35,
45, 65, 85, 95, 135, 405, 540, 675, 1350.'
errors:
code: INVALID_PACK_SIZE
allowed_quantities:
- 12
- 25
- 35
- 45
- 65
- 85
- 95
- 135
- 405
- 540
- 675
- 1350
Invalid_reward_code:
summary: Invalid reward code
value:
success: false
error: Invalid reward code
'422':
description: 'Validation failed or cannot be fulfilled: More than all stock'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
More_than_all_stock:
summary: More than all stock
value:
success: false
error: Insufficient stock available
'401':
$ref: '#/components/responses/Unauthorized'
/orders/{id}:
get:
tags:
- Orders
summary: Get an order
operationId: getOrdersById
description: The price you paid (unit_price, subtotal, discount_amount, total_amount) and the delivered lines.
product.price is today's price.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
description: Order id.
example: 1232875
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
id:
type: integer
product_id:
type: integer
description: Product id (see GET /products).
product_name:
type: string
quantity:
type: integer
description: Units to buy.
unit_price:
type: number
description: Price paid per unit, USD.
subtotal:
type: number
description: unit_price x quantity, before discount.
discount_amount:
type: integer
description: Reward-code discount, USD.
reward_code:
type: 'null'
description: Reward code used, or null.
total_amount:
type: number
description: Amount charged, USD.
status:
type: string
description: Current status.
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
updated_at:
type: string
format: date-time
description: ISO 8601, UTC.
product:
type: object
properties:
id:
type: integer
name:
type: string
sku:
type: string
price:
type: number
description: Your unit price in USD after custom, reseller, bulk and discount pricing.
required:
- id
- name
- sku
- price
items:
type: array
items:
type: object
properties:
id:
type: integer
data:
type: string
description: The account line.
sold_at:
type: string
format: date-time
description: When the line was delivered. ISO 8601, UTC.
required:
- id
- data
- sold_at
description: Delivered account lines.
required:
- id
- product_id
- product_name
- quantity
- unit_price
- subtotal
- discount_amount
- reward_code
- total_amount
- status
- created_at
- updated_at
- product
- items
description: The account line.
required:
- success
- data
examples:
Order:
summary: Order
value:
success: true
data:
id: 1232875
product_id: 13
product_name: Gmail Edu domain rental for 24 hours (.us domain) with Gmail
quantity: 2
unit_price: 0.01197016
subtotal: 0.02394032
discount_amount: 0
reward_code: null
total_amount: 0.02394032
status: completed
created_at: '2026-10-11T16:58:00.000000Z'
updated_at: '2026-10-11T16:58:00.000000Z'
product:
id: 13
name: Gmail Edu domain rental for 24 hours (.us domain) with Gmail
sku: EDUMAIL-0029
price: 0.01234037
items:
- id: 9753601
data: account1@example.com|Sample2
sold_at: '2026-10-11T16:58:00.000000Z'
- id: 9753602
data: account1@example.com|Sample2
sold_at: '2026-10-11T16:58:00.000000Z'
'404':
description: 'Not found: Not found'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
Not_found:
summary: Not found
value:
success: false
error: Order not found
'401':
$ref: '#/components/responses/Unauthorized'
/orders/{id}/cancel:
post:
tags:
- Orders
summary: Cancel an order
operationId: postOrdersByIdCancel
description: Only pending orders can be cancelled.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
description: Order id.
example: 1232875
responses:
'404':
description: 'Not found: Not found'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
Not_found:
summary: Not found
value:
success: false
error: Order not found
'401':
$ref: '#/components/responses/Unauthorized'
/orders/{id}/export:
get:
tags:
- Orders
summary: Export delivered lines
operationId: listOrdersByIdExport
description: The order's delivered lines. format=csv or format=txt returns plain lines instead of JSON.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
description: Order id.
example: 1232875
- name: format
in: query
required: false
schema:
type: string
enum:
- json
- csv
- txt
description: Default json.
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: array
items:
type: object
properties:
id:
type: integer
data:
type: string
description: The account line.
sold_at:
type: string
format: date-time
description: When the line was delivered. ISO 8601, UTC.
required:
- id
- data
- sold_at
description: The account line.
required:
- success
- data
examples:
JSON:
summary: JSON
value:
success: true
data:
- id: 9753601
data: account1@example.com|Sample2
sold_at: '2026-10-11T16:58:00.000000Z'
- id: 9753602
data: account1@example.com|Sample2
sold_at: '2026-10-11T16:58:00.000000Z'
'401':
$ref: '#/components/responses/Unauthorized'
/wallet/balance:
get:
tags:
- Wallet
summary: Get your balance
operationId: getWalletBalance
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
balance:
type: number
description: Balance in USD.
currency:
type: string
required:
- balance
- currency
description: The account line.
required:
- success
- data
examples:
Balance:
summary: Balance
value:
success: true
data:
balance: 339.60453503
currency: USD
'401':
$ref: '#/components/responses/Unauthorized'
/wallet/transactions:
get:
tags:
- Wallet
summary: List transactions
operationId: listWalletTransactions
description: Your ledger, newest first. amount is unsigned; direction and signed_amount say whether money
came in or went out.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: page
in: query
required: false
schema:
type: integer
minimum: 1
default: 1
description: Page number, from 1.
example: 1
- name: per_page
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 20
description: Items per page, 1-100 (default 20).
example: 20
- name: type
in: query
required: false
schema:
type: string
enum:
- deposit
- withdrawal
- purchase
- refund
- custom_mail
- credit
- debit
description: credit = admin top-up or referral reward. An unknown type returns no rows.
- name: date_from
in: query
required: false
schema:
type: string
format: date
- name: date_to
in: query
required: false
schema:
type: string
format: date
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: array
items:
type: object
properties:
id:
type: integer
type:
type: string
description: Transaction type. credit = admin top-up or referral reward.
amount:
type: number
description: USD, always positive.
direction:
type: string
description: in (money added) or out (money spent).
signed_amount:
type: number
description: 'amount with a sign: positive for in, negative for out.'
balance_after:
type: number
description: Your balance after this transaction, USD.
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
required:
- id
- type
- amount
- direction
- signed_amount
- balance_after
- created_at
description: The account line.
meta:
type: object
properties:
current_page:
type: integer
description: Page returned.
per_page:
type: integer
description: Items per page.
total:
type: integer
description: Items across all pages.
total_pages:
type: integer
description: Number of pages.
required:
- current_page
- per_page
- total
- total_pages
description: Pagination.
required:
- success
- data
- meta
examples:
Latest:
summary: Latest
value:
success: true
data:
- id: 1247991
type: purchase
amount: 0.02394032
direction: out
signed_amount: -0.02394032
balance_after: 339.60453503
created_at: '2026-10-11T16:58:00.000000Z'
- id: 1247879
type: purchase
amount: 0.01197016
direction: out
signed_amount: -0.01197016
balance_after: 339.62847535
created_at: '2026-10-11T16:30:01.000000Z'
meta:
current_page: 1
per_page: 2
total: 3663
total_pages: 1832
Credits_only:
summary: Credits only
value:
success: true
data:
- id: 1148202
type: credit
amount: 500
direction: in
signed_amount: 500
balance_after: 639.9275997
created_at: '2026-09-22T15:15:30.000000Z'
- id: 1141019
type: credit
amount: 200
direction: in
signed_amount: 200
balance_after: 200.02273566
created_at: '2026-09-21T14:59:17.000000Z'
meta:
current_page: 1
per_page: 2
total: 4
total_pages: 2
'401':
$ref: '#/components/responses/Unauthorized'
/wallet/deposit:
post:
tags:
- Wallet
summary: Start a deposit
operationId: postWalletDeposit
description: Creates a payment with a gateway and returns its payment_url. Gateways switched off by the shop
are refused.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
amount:
type: number
description: USD. Minimums apply per gateway.
payment_method:
type: string
enum:
- heleket
- crypto
- cryptomus
- piprapay
description: 'Alias: gateway.'
crypto_currency:
type: string
description: Default USDT.
crypto_network:
type: string
description: Default TRON.
required:
- amount
- payment_method
example:
amount: 10
payment_method: heleket
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
deposit_id:
type: integer
amount:
type: integer
description: USD, always positive.
payment_method:
type: string
status:
type: string
description: Current status.
payment_url:
type: string
description: Send the customer here to pay.
expires_at:
type: string
format: date-time
description: When the payment link expires. ISO 8601, UTC.
required:
- deposit_id
- amount
- payment_method
- status
- payment_url
- expires_at
description: The account line.
required:
- success
- data
examples:
Deposit_created:
summary: Deposit created (illustrative)
value:
success: true
data:
deposit_id: 52011
amount: 10
payment_method: crypto
status: pending
payment_url: https://pay.heleket.com/pay/00000000-0000-0000-0000-000000000000
expires_at: '2026-10-11T18:30:00.000000Z'
'422':
description: 'Validation failed or cannot be fulfilled: Invalid'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
errors:
type: object
properties:
amount:
type: array
items:
type: string
description: USD, always positive.
payment_method:
type: array
items:
type: string
required:
- amount
- payment_method
description: 'Details: field name to messages for validation errors; code and allowed_quantities
for pack-size errors.'
required:
- success
- error
- errors
examples:
Invalid:
summary: Invalid
value:
success: false
error: Validation failed
errors:
amount:
- Minimum deposit amount is $0.25
payment_method:
- Valid payment method is required (heleket, crypto, cryptomus, piprapay)
'401':
$ref: '#/components/responses/Unauthorized'
/wallet/deposits:
get:
tags:
- Wallet
summary: List deposits
operationId: listWalletDeposits
description: Payment-gateway deposits only. Admin top-ups appear as credit transactions instead.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: page
in: query
required: false
schema:
type: integer
minimum: 1
default: 1
description: Page number, from 1.
example: 1
- name: per_page
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 20
description: Items per page, 1-100 (default 20).
example: 20
- name: status
in: query
required: false
schema:
type: string
enum:
- pending
- completed
- approved
- rejected
- cancelled
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: array
items:
type: object
properties:
id:
type: integer
amount:
type: integer
description: USD, always positive.
status:
type: string
description: Current status.
payment_method:
type: string
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
updated_at:
type: string
format: date-time
description: ISO 8601, UTC.
required:
- id
- amount
- status
- payment_method
- created_at
- updated_at
description: The account line.
meta:
type: object
properties:
current_page:
type: integer
description: Page returned.
per_page:
type: integer
description: Items per page.
total:
type: integer
description: Items across all pages.
total_pages:
type: integer
description: Number of pages.
required:
- current_page
- per_page
- total
- total_pages
description: Pagination.
required:
- success
- data
- meta
examples:
Deposits:
summary: Deposits
value:
success: true
data: []
meta:
current_page: 1
per_page: 20
total: 0
total_pages: 0
With_a_deposit:
summary: With a deposit (illustrative)
value:
success: true
data:
- id: 52011
amount: 10
status: completed
payment_method: crypto
created_at: '2026-10-11T16:30:00.000000Z'
updated_at: '2026-10-11T16:41:12.000000Z'
meta:
current_page: 1
per_page: 20
total: 1
total_pages: 1
'401':
$ref: '#/components/responses/Unauthorized'
/wallet/deposits/{id}:
get:
tags:
- Wallet
summary: Get a deposit
operationId: getWalletDepositsById
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
description: Deposit id.
example: 52011
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
id:
type: integer
status:
type: string
description: Current status.
amount:
type: integer
description: USD, always positive.
payment_method:
type: string
required:
- id
- status
- amount
- payment_method
description: The account line.
required:
- success
- data
examples:
Deposit:
summary: Deposit (illustrative)
value:
success: true
data:
id: 52011
status: completed
amount: 10
payment_method: crypto
'404':
description: 'Not found: Not found'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
Not_found:
summary: Not found
value:
success: false
error: Deposit not found
'401':
$ref: '#/components/responses/Unauthorized'
/purchases:
get:
tags:
- Purchases
summary: List purchased lines
operationId: listPurchases
description: Every account line delivered to you, newest first.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: page
in: query
required: false
schema:
type: integer
minimum: 1
default: 1
description: Page number, from 1.
example: 1
- name: per_page
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 20
description: Items per page, 1-100 (default 20).
example: 20
- name: product_id
in: query
required: false
schema:
type: integer
- name: order_id
in: query
required: false
schema:
type: integer
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: array
items:
type: object
properties:
id:
type: integer
product_id:
type: integer
description: Product id (see GET /products).
product_name:
type: string
order_id:
type: integer
data:
type: string
description: The account line.
sold_at:
type: string
format: date-time
description: When the line was delivered. ISO 8601, UTC.
required:
- id
- product_id
- product_name
- order_id
- data
- sold_at
description: The account line.
meta:
type: object
properties:
current_page:
type: integer
description: Page returned.
per_page:
type: integer
description: Items per page.
total:
type: integer
description: Items across all pages.
total_pages:
type: integer
description: Number of pages.
required:
- current_page
- per_page
- total
- total_pages
description: Pagination.
required:
- success
- data
- meta
examples:
Latest:
summary: Latest
value:
success: true
data:
- id: 9753601
product_id: 13
product_name: Gmail Edu domain rental for 24 hours (.us domain) with Gmail
order_id: 1232875
data: account1@example.com|Sample2
sold_at: '2026-10-11T16:58:00.000000Z'
- id: 9753602
product_id: 13
product_name: Gmail Edu domain rental for 24 hours (.us domain) with Gmail
order_id: 1232875
data: account1@example.com|Sample2
sold_at: '2026-10-11T16:58:00.000000Z'
meta:
current_page: 1
per_page: 2
total: 14574
total_pages: 7287
'401':
$ref: '#/components/responses/Unauthorized'
/purchases/{id}:
get:
tags:
- Purchases
summary: Get a purchased line
operationId: getPurchasesById
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
description: Purchase (line) id.
example: 9753601
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: object
properties:
id:
type: integer
product_id:
type: integer
description: Product id (see GET /products).
product_name:
type: string
order_id:
type: integer
data:
type: string
description: The account line.
sold_at:
type: string
format: date-time
description: When the line was delivered. ISO 8601, UTC.
required:
- id
- product_id
- product_name
- order_id
- data
- sold_at
description: The account line.
required:
- success
- data
examples:
Line:
summary: Line
value:
success: true
data:
id: 9753601
product_id: 13
product_name: Gmail Edu domain rental for 24 hours (.us domain) with Gmail
order_id: 1232875
data: account1@example.com|Sample2
sold_at: '2026-10-11T16:58:00.000000Z'
'404':
description: 'Not found: Not found'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
Not_found:
summary: Not found
value:
success: false
error: Purchase not found
'401':
$ref: '#/components/responses/Unauthorized'
/api-keys:
get:
tags:
- API Keys
summary: List your API keys
operationId: listApiKeys
description: Active keys, prefix only. last_used_at updates at most every 5 minutes.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
data:
type: array
items:
type: object
properties:
id:
type: integer
key_prefix:
type: string
description: First characters of the key.
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
last_used_at:
type: string
format: date-time
description: Last request made with this key (updated at most every 5 minutes). ISO 8601,
UTC.
required:
- id
- key_prefix
- created_at
- last_used_at
description: The account line.
required:
- success
- data
examples:
Keys:
summary: Keys
value:
success: true
data:
- id: 436
key_prefix: sk_live_a1b2...
created_at: '2026-07-20T09:25:29.000000Z'
last_used_at: '2026-10-11T17:20:46.000000Z'
- id: 737
key_prefix: sk_live_a1b2...
created_at: '2026-10-11T14:42:24.000000Z'
last_used_at: '2026-10-11T17:33:00.000000Z'
'401':
$ref: '#/components/responses/Unauthorized'
post:
tags:
- API Keys
summary: Create an API key
operationId: postApiKeys
description: Up to 5 active keys. The full key is shown only in this response.
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
responses:
'201':
description: Created
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
message:
type: string
description: Human-readable note. Present only on some responses.
data:
type: object
properties:
id:
type: integer
key:
type: string
created_at:
type: string
format: date-time
description: ISO 8601, UTC.
required:
- id
- key
- created_at
description: The account line.
required:
- success
- message
- data
examples:
Created:
summary: Created (illustrative)
value:
success: true
message: API key created. Store it securely - it won't be shown again.
data:
id: 812
key: sk_live_0000000000000000000000000000000000000000000000000000000000000000
created_at: '2026-10-11T17:00:00.000000Z'
'400':
description: 'Bad request: Limit reached'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
Limit_reached:
summary: Limit reached (illustrative)
value:
success: false
error: Maximum of 5 active API keys allowed
'401':
$ref: '#/components/responses/Unauthorized'
/api-keys/{id}:
delete:
tags:
- API Keys
summary: Revoke an API key
operationId: deleteApiKeysById
security:
- ApiKeyAuth: []
- ApiKeyQuery: []
parameters:
- name: id
in: path
required: true
schema:
type: integer
description: API key id.
example: 812
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
message:
type: string
description: Human-readable note. Present only on some responses.
required:
- success
- message
examples:
Revoked:
summary: Revoked (illustrative)
value:
success: true
message: API key revoked successfully
'404':
description: 'Not found: Not found'
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
description: true when the request worked, false on any error.
error:
type: string
description: What went wrong.
required:
- success
- error
examples:
Not_found:
summary: Not found
value:
success: false
error: API key not found
'401':
$ref: '#/components/responses/Unauthorized'