> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hyperprop.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Bulk-create unlinked accounts with import keys

> Create up to **100 unlinked accounts** in one call — for giveaways, competitions, or pre-provisioning inventory.

Every account is created with:
- no trader attached (`userId: null`)
- its own one-time **`importKey`** (serial-key style, e.g. `HP-7K3QF-9XT2M-4WHRD`)
- `not_started` status
- **no billing and no CME entitlement** — both start only when a key is redeemed

Hand each `importKey` to a customer; they redeem it inside the Hyperprop app under **Trading Accounts → Import**. Each redemption fires an `account.imported` webhook with the redeemer's email, the key, and a timestamp — your verification trail.

`customerIdPrefix` is **required**: each account gets a sequential customerId (`promo-summer-001`, `promo-summer-002`, ...) you can query later via `GET /trading-accounts?customerId=...`.

**Soulbound note:** identity bindings are keyed on `customerId`, and sequential prefix ids give every account a *different* placeholder customer — right for giveaways where each key goes to a different winner (each redemption creates its own binding). If several accounts in a batch are for the SAME customer, `PATCH` their `customerId` to that customer's real ID after creation so all their imports enforce one shared Hyperprop login.

List remaining unredeemed accounts (keys included) anytime with `GET /trading-accounts?unlinked=true`.

An `account.created` webhook fires for each account with `data.importKey`, `data.metadata.unlinked: true`, and a shared `batch_id`.

**Permissions:** organization **admins** only.

**Error codes:** `VALIDATION_ERROR`, `PLAN_NOT_FOUND`, `PLAN_NOT_ACTIVE`, `NO_TRADING_RULE`, `RULE_NOT_FOUND`, `BULK_CREATE_ERROR`.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/organization/trading-accounts/bulk
openapi: 3.0.0
info:
  title: Hyperprop Platform API
  version: 1.0.0
  description: >-
    REST API for the Hyperprop Trading Platform — provision evaluation and
    funded trading accounts, manage traders and plans, react to account
    lifecycle events via signed webhooks, and reconcile billing. Built for prop
    firms integrating from their own backend.


    Authentication, quick start, error handling, idempotency, pagination, custom
    metadata, webhooks, and the MCP connector are documented at
    https://docs.hyperprop.com.
  x-logo:
    url: https://app.hyperprop.com/logo-icon.svg
    altText: Hyperprop
    href: https://hyperprop.com
servers:
  - url: https://api.hyperprop.com/platform
    description: Production
security: []
tags:
  - name: Trading accounts
    description: Create, update, and inspect trading accounts.
  - name: Traders
    description: Look up and update the traders in your organization.
  - name: Trading plans
    description: Define the plans you sell.
  - name: Trading rules
    description: Define how accounts are evaluated.
  - name: Lockouts
    description: Pause and resume trading on an account.
  - name: Payouts
    description: Check payout eligibility and record payouts.
  - name: Purchases
    description: Purchases recorded for your organization.
  - name: Time Machine
    description: Restore accounts to an earlier trading day or instant.
  - name: Webhooks
    description: Register webhook endpoints and inspect deliveries.
  - name: Events
    description: Your organization's event history and real-time event stream.
  - name: Reconciliation
    description: Balances, end-of-day snapshots, and fills for reconciliation.
  - name: Analytics
    description: Organization performance and plan economics.
  - name: Billing
    description: 'Your Hyperprop bill: activity, billing cycles, and forecasts.'
  - name: Team and roles
    description: Manage dashboard access for your staff.
  - name: API keys
    description: Manage your organization's API key.
  - name: Logs and health
    description: API request logs, the audit log, and integration health.
  - name: Organization profile
    description: Your organization's profile and logo.
  - name: Support
    description: Open and follow up on support tickets.
  - name: Partner access
    description: >-
      Read a trader's journal as an approved partner app, with the trader's own
      key.
paths:
  /v1/organization/trading-accounts/bulk:
    post:
      tags:
        - Trading accounts
      summary: Bulk-create unlinked accounts with import keys
      description: >-
        Create up to **100 unlinked accounts** in one call — for giveaways,
        competitions, or pre-provisioning inventory.


        Every account is created with:

        - no trader attached (`userId: null`)

        - its own one-time **`importKey`** (serial-key style, e.g.
        `HP-7K3QF-9XT2M-4WHRD`)

        - `not_started` status

        - **no billing and no CME entitlement** — both start only when a key is
        redeemed


        Hand each `importKey` to a customer; they redeem it inside the Hyperprop
        app under **Trading Accounts → Import**. Each redemption fires an
        `account.imported` webhook with the redeemer's email, the key, and a
        timestamp — your verification trail.


        `customerIdPrefix` is **required**: each account gets a sequential
        customerId (`promo-summer-001`, `promo-summer-002`, ...) you can query
        later via `GET /trading-accounts?customerId=...`.


        **Soulbound note:** identity bindings are keyed on `customerId`, and
        sequential prefix ids give every account a *different* placeholder
        customer — right for giveaways where each key goes to a different winner
        (each redemption creates its own binding). If several accounts in a
        batch are for the SAME customer, `PATCH` their `customerId` to that
        customer's real ID after creation so all their imports enforce one
        shared Hyperprop login.


        List remaining unredeemed accounts (keys included) anytime with `GET
        /trading-accounts?unlinked=true`.


        An `account.created` webhook fires for each account with
        `data.importKey`, `data.metadata.unlinked: true`, and a shared
        `batch_id`.


        **Permissions:** organization **admins** only.


        **Error codes:** `VALIDATION_ERROR`, `PLAN_NOT_FOUND`,
        `PLAN_NOT_ACTIVE`, `NO_TRADING_RULE`, `RULE_NOT_FOUND`,
        `BULK_CREATE_ERROR`.
      operationId: postV1OrganizationTradingaccountsBulk
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Model668'
      responses:
        '201':
          description: Success - batch created
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model674'
        '400':
          description: Validation failed
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model19'
        '401':
          description: Authentication required
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model9'
        '403':
          description: Only organization admins can perform this action
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model570'
        '404':
          description: Trading plan not found
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model675'
        '500':
          description: An unexpected error occurred
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model5'
      security:
        - X-API-Key: []
components:
  schemas:
    Model668:
      type: object
      properties:
        count:
          type: integer
          description: How many unlinked accounts to create (1-100 per call)
          example: 25
          minimum: 1
          maximum: 100
        type:
          $ref: '#/components/schemas/Model666'
        tradingPlanId:
          type: string
          description: Trading plan for every account in the batch
          example: 550e8400-e29b-41d4-a716-446655440000
          x-format:
            guid: true
        tradingRuleId:
          type: string
          description: Override the plan's default rule (optional)
          x-format:
            guid: true
        initialBalance:
          type: number
          description: Starting balance (defaults to the plan's account size)
          example: 50000
        customerIdPrefix:
          type: string
          description: >-
            REQUIRED. Each account gets customerId `{prefix}-001`,
            `{prefix}-002`, ... — one placeholder customer per account (right
            for giveaways where every key goes to a different winner). PATCH the
            real customerId onto an account once you know who it belongs to.
          example: promo-summer
          maxLength: 200
        externalRefPrefix:
          type: string
          description: >-
            DEPRECATED alias for customerIdPrefix — accepted for backward
            compatibility only.
          example: promo-summer
          maxLength: 200
        metadata:
          $ref: '#/components/schemas/Model667'
      required:
        - count
        - type
        - tradingPlanId
    Model674:
      type: object
      properties:
        success:
          type: boolean
          example: true
        message:
          type: string
          example: 25 unlinked account(s) created — hand each importKey to its trader
        data:
          $ref: '#/components/schemas/Model673'
    Model19:
      type: object
      properties:
        success:
          type: boolean
          description: Always false on errors
          example: false
        statusCode:
          type: number
          example: 400
        error:
          type: string
          example: Bad Request
        message:
          type: string
          example: Validation failed
        code:
          type: string
          description: Machine-readable error code — switch on this, not on message text
          example: VALIDATION_ERROR
    Model9:
      type: object
      properties:
        success:
          type: boolean
          description: Always false on errors
          example: false
        statusCode:
          type: number
          example: 401
        error:
          type: string
          example: Unauthorized
        message:
          type: string
          example: Authentication required
        code:
          type: string
          description: Machine-readable error code — switch on this, not on message text
          example: UNAUTHORIZED
    Model570:
      type: object
      properties:
        success:
          type: boolean
          description: Always false on errors
          example: false
        statusCode:
          type: number
          example: 403
        error:
          type: string
          example: Forbidden
        message:
          type: string
          example: Only organization admins can perform this action
        code:
          type: string
          description: Machine-readable error code — switch on this, not on message text
          example: NOT_ADMIN
    Model675:
      type: object
      properties:
        success:
          type: boolean
          description: Always false on errors
          example: false
        statusCode:
          type: number
          example: 404
        error:
          type: string
          example: Not Found
        message:
          type: string
          example: Trading plan not found
        code:
          type: string
          description: Machine-readable error code — switch on this, not on message text
          example: PLAN_NOT_FOUND
    Model5:
      type: object
      properties:
        success:
          type: boolean
          description: Always false on errors
          example: false
        statusCode:
          type: number
          example: 500
        error:
          type: string
          example: Internal Server Error
        message:
          type: string
          example: An unexpected error occurred
        code:
          type: string
          description: Machine-readable error code — switch on this, not on message text
          example: INTERNAL_ERROR
    Model666:
      type: string
      description: Account type for every account in the batch
      example: evaluation
      enum:
        - evaluation
        - sim_funded
        - competition
    Model667:
      type: object
      description: Custom metadata applied to every account in the batch
      example:
        campaign: summer-giveaway
    Model673:
      type: object
      properties:
        batchId:
          type: string
          description: Shared ID stamped on every account.created webhook in this batch
        created:
          type: number
          example: 25
        tradingPlan:
          $ref: '#/components/schemas/Model669'
        tradingRule:
          $ref: '#/components/schemas/Model670'
        accounts:
          $ref: '#/components/schemas/Model672'
    Model669:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
    Model670:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
    Model672:
      type: array
      items:
        $ref: '#/components/schemas/Model671'
    Model671:
      type: object
      properties:
        id:
          type: string
        accountNumber:
          type: string
        customerId:
          type: string
          example: promo-summer-001
        externalRef:
          type: string
          description: DEPRECATED alias for customerId (same value)
        importKey:
          type: string
          description: One-time redemption key for this account
          example: HP-7K3QF-9XT2M-4WHRD
  securitySchemes:
    X-API-Key:
      type: apiKey
      name: X-API-Key
      in: header
      description: >-
        Organization API key. Format: "hp_live_{key}". Organization admins
        manage the key in the dashboard.

````

## Related topics

- [Unlink a trader (issues a fresh import key)](/platform-api/trading-accounts/unlink-a-trader-issues-a-fresh-import-key.md)
- [Create a trading account](/platform-api/trading-accounts/create-a-trading-account.md)
- [Rebind a customer to a new Hyperprop login (support flow)](/platform-api/traders/rebind-a-customer-to-a-new-hyperprop-login-support-flow.md)
- [Webhooks](/guides/webhooks.md)
- [Register a webhook endpoint](/platform-api/webhooks/register-a-webhook-endpoint.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.