Skip to content
SoundSyncAudio software platform

API reference

Customer and Serial Management API

Current developer customer tables, serial inventory, imports, purchase history and manual access grants.

Use the current developer-scoped serial routes

For new integrations, use /api/developer/serials rather than the deprecated /api/serials table handlers. Account identity, workspace permissions and assigned products determine access. Supplying another developer ID or broadening a filter does not grant their records.

Lists use page, limit, search, dateRange and supported product filters. Serial inventory distinguishes available and redeemed. Purchases additionally accept channel, productIds, resellerId, provider, refundStatus, recordType, dateFrom and dateTo. IDs in historical or external purchase rows are not automatically refundable managed-checkout order IDs.

Generate and import deliberately

Serial generation requires an owned product and current billing eligibility. Prefix and expiry are inventory settings, not proof of a customer purchase. Reseller serial pools belong in Partners > Licenses; ordinary developer generation rejects reseller assignment.

Download the current CSV template before importing. Upload file as multipart data or send the named customers, serials or purchases JSON array. Product mappings must resolve to allowed products. A 207 result contains row errors and successful rows; correct the failures rather than replaying every row. Purchase imports do not collect payment, transfer billing authority or send purchase marketing messages.

SoundSync

Illustrative owned-product serial generation

Generate inventory, not customer ownership
curl --fail-with-body -sS -X POST "$SOUNDSYNC_API_BASE/api/developer/serials/generate" \
  -H "Authorization: Bearer $DEVELOPER_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"productId":123,"quantity":5,"prefix":"DEMO"}'

Access, history and payment are separate

Activate, reactivate, deactivate, suspend, unsuspend and revoke are administrative serial actions. Hiding an order only changes its supported history presentation. Neither action refunds a payment.

Manual grants give the selected customer access to explicit products. Existing-serial assignment and subscription access grants have single-product restrictions. An access grant does not authorize billing; use the separate supported customer-confirmed payment setup when needed. Keep the reason and grant request reference for reconciliation.

Customer removal is not global account deletion

Removal requires customers.manage and confirm:true or confirmation:"yes". It removes the developer customer relationship and supported associated marketing records. Required purchases, financial history and global account identity are separate. Use the verified privacy-request procedure for broader deletion requests.

SoundSync

Related customer operations

Refund API

Whole-product/full-order refunds and operation state.

Customer tools

Profile correction, verification and device recovery.

Deprecated serial API

Compatibility-only handlers and their limits.

SoundSync

Requests and responses

GET /api/developer/customers

Search developer-scoped customers

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • query page: integer
  • query limit: integer
  • query search: string
  • query dateRange: string
  • query productId: integer
Returns
HTTP 200: rows, total, page, pageSize.
Notes
Account permissions and assigned products determine scope; query filters cannot expand it. Purchase identifiers can include external/manual references; they are not all eligible managed-payment refund IDs.
Request, response and error reference

Query and header parameters

[
  {
    "name": "page",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "limit",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "search",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "dateRange",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "productId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "rows": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "integer",
              "string"
            ],
            "minLength": 1
          },
          "customer_id": {
            "type": "integer",
            "minimum": 1
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "first_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "email_verification_status": {
            "type": "string"
          }
        },
        "additionalProperties": true
      }
    },
    "total": {
      "type": "integer"
    },
    "page": {
      "type": "integer"
    },
    "pageSize": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/customers/export

Export authorized customers as CSV

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • query page: integer
  • query limit: integer
  • query search: string
  • query dateRange: string
  • query productId: integer
Returns
HTTP 200: text/csv.
Request, response and error reference

Query and header parameters

[
  {
    "name": "page",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "limit",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "search",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "dateRange",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "productId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (text/csv)

{
  "type": "string",
  "format": "binary"
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/customers/demo-csv

Download the customers import template

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Returns
HTTP 200: text/csv.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (text/csv)

{
  "type": "string",
  "format": "binary"
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/customers/import

Import reviewed customers rows

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • file: string
  • customers: array
  • productMappings: object. Operation-specific extension data; do not put credentials or unnecessary personal information here.
Returns
HTTP 201: success, importedCount, insertedCount, errors.
Notes
Send a CSV file under file or the named JSON row array. Inspect row errors on 207; do not blindly replay already imported rows. Product mappings do not bypass ownership. Purchase import does not collect payment or transfer provider billing authority and disables purchase marketing/email activity.
Request, response and error reference

Request (application/json or multipart/form-data)

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "format": "binary"
    },
    "customers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "productId": {
            "type": "integer",
            "minimum": 1
          },
          "productName": {
            "type": "string"
          },
          "serialCode": {
            "type": "string"
          },
          "price": {
            "type": "number"
          },
          "salePrice": {
            "type": "number"
          },
          "date": {
            "type": "string"
          }
        },
        "additionalProperties": true
      }
    },
    "productMappings": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "importedCount": {
      "type": "integer"
    },
    "insertedCount": {
      "type": "integer"
    },
    "errors": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/serials

Search serial inventory and device counts

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • query page: integer
  • query limit: integer
  • query search: string
  • query dateRange: string
  • query productId: integer
  • query status: string
Returns
HTTP 200: rows, total, page, pageSize.
Notes
Account permissions and assigned products determine scope; query filters cannot expand it. Purchase identifiers can include external/manual references; they are not all eligible managed-payment refund IDs.
Request, response and error reference

Query and header parameters

[
  {
    "name": "page",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "limit",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "search",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "dateRange",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "productId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "status",
    "in": "query",
    "schema": {
      "type": "string",
      "enum": [
        "available",
        "redeemed"
      ]
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "rows": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "integer",
              "string"
            ],
            "minLength": 1
          },
          "serial": {
            "type": "string"
          },
          "product_id": {
            "type": "integer",
            "minimum": 1
          },
          "product": {
            "type": "string"
          },
          "customer_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "redeemed": {
            "type": "boolean"
          },
          "revoked": {
            "type": "boolean"
          },
          "active_activation_count": {
            "type": "integer"
          },
          "max_activations": {
            "type": "integer"
          },
          "remaining_activations": {
            "type": "integer"
          }
        },
        "additionalProperties": true
      }
    },
    "total": {
      "type": "integer"
    },
    "page": {
      "type": "integer"
    },
    "pageSize": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/serials/export

Export authorized serials as CSV

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • query page: integer
  • query limit: integer
  • query search: string
  • query dateRange: string
  • query productId: integer
Returns
HTTP 200: text/csv.
Request, response and error reference

Query and header parameters

[
  {
    "name": "page",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "limit",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "search",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "dateRange",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "productId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (text/csv)

{
  "type": "string",
  "format": "binary"
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/serials/demo-csv

Download the serials import template

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Returns
HTTP 200: text/csv.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (text/csv)

{
  "type": "string",
  "format": "binary"
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/serials/import

Import reviewed serials rows

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • file: string
  • serials: array
  • productMappings: object. Operation-specific extension data; do not put credentials or unnecessary personal information here.
Returns
HTTP 201: success, importedCount, insertedCount, errors.
Notes
Send a CSV file under file or the named JSON row array. Inspect row errors on 207; do not blindly replay already imported rows. Product mappings do not bypass ownership. Purchase import does not collect payment or transfer provider billing authority and disables purchase marketing/email activity.
Request, response and error reference

Request (application/json or multipart/form-data)

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "format": "binary"
    },
    "serials": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "productId": {
            "type": "integer",
            "minimum": 1
          },
          "productName": {
            "type": "string"
          },
          "serialCode": {
            "type": "string"
          },
          "price": {
            "type": "number"
          },
          "salePrice": {
            "type": "number"
          },
          "date": {
            "type": "string"
          }
        },
        "additionalProperties": true
      }
    },
    "productMappings": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "importedCount": {
      "type": "integer"
    },
    "insertedCount": {
      "type": "integer"
    },
    "errors": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/purchases

Search purchases with order grouping and refund availability

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • query page: integer
  • query limit: integer
  • query search: string
  • query dateRange: string
  • query productId: integer
  • query channel: string
  • query productIds: string
  • query resellerId: string
  • query provider: string
  • query refundStatus: string
  • query recordType: string
  • query dateFrom: string
  • query dateTo: string
Returns
HTTP 200: rows, total, page, pageSize, canRefund.
Notes
Account permissions and assigned products determine scope; query filters cannot expand it. Purchase identifiers can include external/manual references; they are not all eligible managed-payment refund IDs.
Request, response and error reference

Query and header parameters

[
  {
    "name": "page",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "limit",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "search",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "dateRange",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "productId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "channel",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "productIds",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "resellerId",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "provider",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "refundStatus",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "recordType",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "dateFrom",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "dateTo",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "rows": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "order_id": {
            "type": [
              "integer",
              "string"
            ],
            "minLength": 1
          },
          "order_item_id": {
            "type": [
              "integer",
              "string"
            ],
            "minLength": 1
          },
          "product_id": {
            "type": "integer",
            "minimum": 1
          },
          "product": {
            "type": "string"
          },
          "customer_id": {
            "type": "integer",
            "minimum": 1
          },
          "status": {
            "type": "string"
          },
          "invoice_available": {
            "type": "boolean"
          }
        },
        "additionalProperties": true
      }
    },
    "total": {
      "type": "integer"
    },
    "page": {
      "type": "integer"
    },
    "pageSize": {
      "type": "integer"
    },
    "canRefund": {
      "type": "boolean"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/purchases/export

Export authorized purchases as CSV

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • query page: integer
  • query limit: integer
  • query search: string
  • query dateRange: string
  • query productId: integer
Returns
HTTP 200: text/csv.
Request, response and error reference

Query and header parameters

[
  {
    "name": "page",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "limit",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "search",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "dateRange",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "productId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (text/csv)

{
  "type": "string",
  "format": "binary"
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/purchases/demo-csv

Download the purchases import template

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Returns
HTTP 200: text/csv.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (text/csv)

{
  "type": "string",
  "format": "binary"
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/purchases/import

Import reviewed purchases rows

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • file: string
  • purchases: array
  • productMappings: object. Operation-specific extension data; do not put credentials or unnecessary personal information here.
Returns
HTTP 201: success, importedCount, insertedCount, errors.
Notes
Send a CSV file under file or the named JSON row array. Inspect row errors on 207; do not blindly replay already imported rows. Product mappings do not bypass ownership. Purchase import does not collect payment or transfer provider billing authority and disables purchase marketing/email activity.
Request, response and error reference

Request (application/json or multipart/form-data)

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "format": "binary"
    },
    "purchases": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "productId": {
            "type": "integer",
            "minimum": 1
          },
          "productName": {
            "type": "string"
          },
          "serialCode": {
            "type": "string"
          },
          "price": {
            "type": "number"
          },
          "salePrice": {
            "type": "number"
          },
          "date": {
            "type": "string"
          }
        },
        "additionalProperties": true
      }
    },
    "productMappings": {
      "type": "object",
      "additionalProperties": true,
      "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
    }
  },
  "additionalProperties": true
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "importedCount": {
      "type": "integer"
    },
    "insertedCount": {
      "type": "integer"
    },
    "errors": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

DELETE /api/developer/customers/{customerId}

Remove supported developer customer information

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • confirm: boolean
  • confirmation: string
  • reason: string
Returns
HTTP 200: ok, alreadyRemoved, already_removed, customer_id, developer_customer_id, message.
Notes
Requires customers.manage and confirm:true or confirmation:"yes". This removes the developer contact relationship and supported marketing records, not the global account, purchases or required financial records. Review the account-closure and privacy-request guides.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "confirm": {
      "type": "boolean"
    },
    "confirmation": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    }
  },
  "additionalProperties": true,
  "anyOf": [
    {
      "properties": {
        "confirm": {
          "const": true
        }
      },
      "required": [
        "confirm"
      ]
    },
    {
      "properties": {
        "confirmation": {
          "type": "string",
          "pattern": "^\\s*[Yy][Ee][Ss]\\s*$"
        }
      },
      "required": [
        "confirmation"
      ]
    }
  ]
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    },
    "alreadyRemoved": {
      "type": "boolean"
    },
    "already_removed": {
      "type": "boolean"
    },
    "customer_id": {
      "type": "integer",
      "minimum": 1
    },
    "developer_customer_id": {
      "type": [
        "integer",
        "string",
        "null"
      ]
    },
    "message": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/serials/available-by-product

Group available serials by product and promotion

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • query page: integer
  • query limit: integer
  • query search: string
  • query dateRange: string
  • query productId: integer
Returns
HTTP 200: products, promos, rows, total, page, pageSize.
Request, response and error reference

Query and header parameters

[
  {
    "name": "page",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "limit",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  },
  {
    "name": "search",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "dateRange",
    "in": "query",
    "schema": {
      "type": "string"
    },
    "required": false,
    "description": ""
  },
  {
    "name": "productId",
    "in": "query",
    "schema": {
      "type": "integer",
      "minimum": 1
    },
    "required": false,
    "description": ""
  }
]

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "products": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "promos": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "rows": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "integer",
              "string"
            ],
            "minLength": 1
          },
          "serial": {
            "type": "string"
          },
          "product_id": {
            "type": "integer",
            "minimum": 1
          },
          "product": {
            "type": "string"
          },
          "customer_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "redeemed": {
            "type": "boolean"
          },
          "revoked": {
            "type": "boolean"
          },
          "active_activation_count": {
            "type": "integer"
          },
          "max_activations": {
            "type": "integer"
          },
          "remaining_activations": {
            "type": "integer"
          }
        },
        "additionalProperties": true
      }
    },
    "total": {
      "type": "integer"
    },
    "page": {
      "type": "integer"
    },
    "pageSize": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/serials/resellers

List eligible relationship and legacy reseller references

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Returns
HTTP 200: resellers.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "resellers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "integer",
              "string"
            ],
            "minLength": 1
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "relationship_id": {
            "type": "integer",
            "minimum": 1
          },
          "developer_share_bps": {
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/serials/generate

Generate unique serials for an owned product

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • productId: integer (required)
  • quantity: integer
  • prefix: string
  • expiresAt: string,null
  • promoPrice: number
  • promoStart: string,null
  • promoExpires: string,null
  • activeFrom: string,null
  • activeTo: string,null
  • batchTag: string
  • notes: string
Returns
HTTP 201: message, count, product, serials.
Notes
product_id and corresponding snake_case date/price aliases remain accepted. Use Partners > Licenses for reseller serial pools; reseller assignment on this route returns PARTNER_POOL_REQUIRED. Existing billing and product-scope checks apply.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "productId": {
      "type": "integer",
      "minimum": 1
    },
    "quantity": {
      "type": "integer",
      "minimum": 1
    },
    "prefix": {
      "type": "string"
    },
    "expiresAt": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "promoPrice": {
      "type": "number"
    },
    "promoStart": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "promoExpires": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "activeFrom": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "activeTo": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "batchTag": {
      "type": "string"
    },
    "notes": {
      "type": "string"
    }
  },
  "required": [
    "productId"
  ],
  "additionalProperties": true
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "message": {
      "type": "string"
    },
    "count": {
      "type": "integer"
    },
    "product": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "minimum": 1
        },
        "name": {
          "type": "string"
        }
      },
      "additionalProperties": true
    },
    "serials": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "integer",
              "string"
            ],
            "minLength": 1
          },
          "serial": {
            "type": "string"
          },
          "product_id": {
            "type": "integer",
            "minimum": 1
          },
          "product": {
            "type": "string"
          },
          "customer_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "redeemed": {
            "type": "boolean"
          },
          "revoked": {
            "type": "boolean"
          },
          "active_activation_count": {
            "type": "integer"
          },
          "max_activations": {
            "type": "integer"
          },
          "remaining_activations": {
            "type": "integer"
          }
        },
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/serials/{serialId}/activate

Apply the activate serial-access action

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • reason: string
  • note: string
Returns
HTTP 200: serial, deactivatedActivations.
Notes
Changes developer-controlled serial access. It is not a provider refund, customer identity transfer or checkout payment. Revocation/suspension/deactivation can affect existing devices.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "serial": {
      "type": "object",
      "properties": {
        "id": {
          "type": [
            "integer",
            "string"
          ],
          "minLength": 1
        },
        "serial": {
          "type": "string"
        },
        "product_id": {
          "type": "integer",
          "minimum": 1
        },
        "product": {
          "type": "string"
        },
        "customer_id": {
          "type": [
            "integer",
            "null"
          ]
        },
        "status": {
          "type": "string"
        },
        "redeemed": {
          "type": "boolean"
        },
        "revoked": {
          "type": "boolean"
        },
        "active_activation_count": {
          "type": "integer"
        },
        "max_activations": {
          "type": "integer"
        },
        "remaining_activations": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    },
    "deactivatedActivations": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/serials/{serialId}/reactivate

Apply the reactivate serial-access action

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • reason: string
  • note: string
Returns
HTTP 200: serial, deactivatedActivations.
Notes
Changes developer-controlled serial access. It is not a provider refund, customer identity transfer or checkout payment. Revocation/suspension/deactivation can affect existing devices.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "serial": {
      "type": "object",
      "properties": {
        "id": {
          "type": [
            "integer",
            "string"
          ],
          "minLength": 1
        },
        "serial": {
          "type": "string"
        },
        "product_id": {
          "type": "integer",
          "minimum": 1
        },
        "product": {
          "type": "string"
        },
        "customer_id": {
          "type": [
            "integer",
            "null"
          ]
        },
        "status": {
          "type": "string"
        },
        "redeemed": {
          "type": "boolean"
        },
        "revoked": {
          "type": "boolean"
        },
        "active_activation_count": {
          "type": "integer"
        },
        "max_activations": {
          "type": "integer"
        },
        "remaining_activations": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    },
    "deactivatedActivations": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/serials/{serialId}/deactivate

Apply the deactivate serial-access action

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • reason: string
  • note: string
Returns
HTTP 200: serial, deactivatedActivations.
Notes
Changes developer-controlled serial access. It is not a provider refund, customer identity transfer or checkout payment. Revocation/suspension/deactivation can affect existing devices.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "serial": {
      "type": "object",
      "properties": {
        "id": {
          "type": [
            "integer",
            "string"
          ],
          "minLength": 1
        },
        "serial": {
          "type": "string"
        },
        "product_id": {
          "type": "integer",
          "minimum": 1
        },
        "product": {
          "type": "string"
        },
        "customer_id": {
          "type": [
            "integer",
            "null"
          ]
        },
        "status": {
          "type": "string"
        },
        "redeemed": {
          "type": "boolean"
        },
        "revoked": {
          "type": "boolean"
        },
        "active_activation_count": {
          "type": "integer"
        },
        "max_activations": {
          "type": "integer"
        },
        "remaining_activations": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    },
    "deactivatedActivations": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/serials/{serialId}/suspend

Apply the suspend serial-access action

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • reason: string
  • note: string
Returns
HTTP 200: serial, deactivatedActivations.
Notes
Changes developer-controlled serial access. It is not a provider refund, customer identity transfer or checkout payment. Revocation/suspension/deactivation can affect existing devices.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "serial": {
      "type": "object",
      "properties": {
        "id": {
          "type": [
            "integer",
            "string"
          ],
          "minLength": 1
        },
        "serial": {
          "type": "string"
        },
        "product_id": {
          "type": "integer",
          "minimum": 1
        },
        "product": {
          "type": "string"
        },
        "customer_id": {
          "type": [
            "integer",
            "null"
          ]
        },
        "status": {
          "type": "string"
        },
        "redeemed": {
          "type": "boolean"
        },
        "revoked": {
          "type": "boolean"
        },
        "active_activation_count": {
          "type": "integer"
        },
        "max_activations": {
          "type": "integer"
        },
        "remaining_activations": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    },
    "deactivatedActivations": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/serials/{serialId}/unsuspend

Apply the unsuspend serial-access action

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • reason: string
  • note: string
Returns
HTTP 200: serial, deactivatedActivations.
Notes
Changes developer-controlled serial access. It is not a provider refund, customer identity transfer or checkout payment. Revocation/suspension/deactivation can affect existing devices.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "serial": {
      "type": "object",
      "properties": {
        "id": {
          "type": [
            "integer",
            "string"
          ],
          "minLength": 1
        },
        "serial": {
          "type": "string"
        },
        "product_id": {
          "type": "integer",
          "minimum": 1
        },
        "product": {
          "type": "string"
        },
        "customer_id": {
          "type": [
            "integer",
            "null"
          ]
        },
        "status": {
          "type": "string"
        },
        "redeemed": {
          "type": "boolean"
        },
        "revoked": {
          "type": "boolean"
        },
        "active_activation_count": {
          "type": "integer"
        },
        "max_activations": {
          "type": "integer"
        },
        "remaining_activations": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    },
    "deactivatedActivations": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/serials/{serialId}/revoke

Apply the revoke serial-access action

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • reason: string
  • note: string
Returns
HTTP 200: serial, deactivatedActivations.
Notes
Changes developer-controlled serial access. It is not a provider refund, customer identity transfer or checkout payment. Revocation/suspension/deactivation can affect existing devices.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "serial": {
      "type": "object",
      "properties": {
        "id": {
          "type": [
            "integer",
            "string"
          ],
          "minLength": 1
        },
        "serial": {
          "type": "string"
        },
        "product_id": {
          "type": "integer",
          "minimum": 1
        },
        "product": {
          "type": "string"
        },
        "customer_id": {
          "type": [
            "integer",
            "null"
          ]
        },
        "status": {
          "type": "string"
        },
        "redeemed": {
          "type": "boolean"
        },
        "revoked": {
          "type": "boolean"
        },
        "active_activation_count": {
          "type": "integer"
        },
        "max_activations": {
          "type": "integer"
        },
        "remaining_activations": {
          "type": "integer"
        }
      },
      "additionalProperties": true
    },
    "deactivatedActivations": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/serials/{serialId}/customer-portal-order/hide

Hide the supported order from customer history

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • reason: string
  • note: string
Returns
HTTP 200: serialId, serial, orderId, customerPortalHidden.
Notes
Changes history presentation, not product ownership or payment/refund state.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "serialId": {
      "type": [
        "integer",
        "string"
      ],
      "minLength": 1
    },
    "serial": {
      "type": "string"
    },
    "orderId": {
      "type": [
        "integer",
        "string"
      ],
      "minLength": 1
    },
    "customerPortalHidden": {
      "type": "boolean"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/serials/{serialId}/customer-portal-order/show

Show the supported order in customer history

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • reason: string
  • note: string
Returns
HTTP 200: serialId, serial, orderId, customerPortalHidden.
Notes
Changes history presentation, not product ownership or payment/refund state.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string"
    },
    "note": {
      "type": "string"
    }
  },
  "additionalProperties": true
}

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "serialId": {
      "type": [
        "integer",
        "string"
      ],
      "minLength": 1
    },
    "serial": {
      "type": "string"
    },
    "orderId": {
      "type": [
        "integer",
        "string"
      ],
      "minLength": 1
    },
    "customerPortalHidden": {
      "type": "boolean"
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

GET /api/developer/purchases/filter-options

Read permitted purchase product and reseller filters

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Returns
HTTP 200: products, resellers.
Request, response and error reference

No request body fields are read by this operation.

HTTP 200 response (application/json)

{
  "type": "object",
  "properties": {
    "products": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string"
          }
        },
        "additionalProperties": true
      }
    },
    "resellers": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.

POST /api/developer/purchases/manual-grant

Grant authorized product access without collecting payment

Auth
Account Bearer JWT
Scope
Authenticated account, effective developer workspace, applicable permissions and product ownership. Read the operation notes for legacy or owner-only restrictions.
Request fields
  • productId: integer
  • productIds: array
  • email: string
  • firstName: string
  • lastName: string
  • customerId: integer
  • grantType: string
  • grantRequestId: string
  • reason: string
  • note: string
  • serialId: integer
  • sendProductPurchaseEmails: boolean
Returns
HTTP 201: success, grantType, count, createdCount, skippedCount, created, grants, products, purchases, items, entitlements, serials.
Notes
Choose explicit products and customer identity. Existing-serial assignment and subscription grants are single-product operations. Reuse grantRequestId only for the same intended grant. A subscription access grant does not authorize recurring charges; manual billing setup and confirmation are separate.
Request, response and error reference

Request (application/json)

{
  "type": "object",
  "properties": {
    "productId": {
      "type": "integer",
      "minimum": 1
    },
    "productIds": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 1
      }
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "customerId": {
      "type": "integer",
      "minimum": 1
    },
    "grantType": {
      "type": "string"
    },
    "grantRequestId": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    },
    "note": {
      "type": "string"
    },
    "serialId": {
      "type": "integer",
      "minimum": 1
    },
    "sendProductPurchaseEmails": {
      "type": "boolean"
    }
  },
  "additionalProperties": true
}

HTTP 201 response (application/json)

{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "grantType": {
      "type": "string"
    },
    "count": {
      "type": "integer"
    },
    "createdCount": {
      "type": "integer"
    },
    "skippedCount": {
      "type": "integer"
    },
    "created": {
      "type": "boolean"
    },
    "grants": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "products": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "slug": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "shortDescription": {
            "type": [
              "string",
              "null"
            ]
          },
          "price": {
            "type": "number"
          },
          "salePrice": {
            "type": [
              "number",
              "null"
            ]
          },
          "regularPrice": {
            "type": "number"
          },
          "displayPrice": {
            "type": "number"
          },
          "priceDisplay": {
            "type": "string"
          },
          "regularPriceDisplay": {
            "type": "string"
          },
          "salePriceDisplay": {
            "type": [
              "string",
              "null"
            ]
          },
          "isOnSale": {
            "type": "boolean"
          },
          "currency": {
            "type": "string"
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "coverImage": {
            "type": [
              "string",
              "null"
            ]
          },
          "developerId": {
            "type": "integer",
            "minimum": 1
          },
          "developerName": {
            "type": "string"
          },
          "developer": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1
              },
              "name": {
                "type": "string"
              },
              "slug": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "profileUrl": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "verified": {
                "type": "boolean"
              }
            },
            "additionalProperties": true
          },
          "productType": {
            "type": "string"
          },
          "productTypes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "url": {
            "type": "string"
          },
          "subscriptionEnabled": {
            "type": "boolean"
          },
          "billingInterval": {
            "type": [
              "string",
              "null"
            ]
          },
          "checkoutEligible": {
            "type": "boolean"
          },
          "capabilities": {
            "type": "object",
            "additionalProperties": true,
            "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
          },
          "requiresActivation": {
            "type": "boolean"
          },
          "supportsSerials": {
            "type": "boolean"
          },
          "supportsDownloads": {
            "type": "boolean"
          },
          "marketplaceAsset": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": true,
            "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
          }
        },
        "additionalProperties": true
      }
    },
    "purchases": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "entitlements": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true,
        "description": "Operation-specific extension data; do not put credentials or unnecessary personal information here."
      }
    },
    "serials": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": [
              "integer",
              "string"
            ],
            "minLength": 1
          },
          "serial": {
            "type": "string"
          },
          "product_id": {
            "type": "integer",
            "minimum": 1
          },
          "product": {
            "type": "string"
          },
          "customer_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "status": {
            "type": "string"
          },
          "redeemed": {
            "type": "boolean"
          },
          "revoked": {
            "type": "boolean"
          },
          "active_activation_count": {
            "type": "integer"
          },
          "max_activations": {
            "type": "integer"
          },
          "remaining_activations": {
            "type": "integer"
          }
        },
        "additionalProperties": true
      }
    }
  },
  "additionalProperties": true
}

Documented failures: 400, 401, 403, 404, 409, 500.