# 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.

Important Notice

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.

Important Notice

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'