openapi: 3.0.3 info: title: Transistor Account Subscribers API description: The Transistor API is a public REST API for the Transistor podcast hosting and analytics platform. It follows the JSON:API specification, accepts JSON or form-encoded request bodies, and returns JSON:API resource objects. It supports sparse fieldsets and included related resources. Authentication is via an x-api-key header carrying an API key generated in the Transistor dashboard Account area. The API covers shows, episodes, download analytics, private podcast subscribers, and event webhooks. Requests are rate-limited to 10 requests per 10 seconds; exceeding the limit returns HTTP 429 and blocks access for 10 seconds. version: '1.0' contact: name: Transistor url: https://transistor.fm termsOfService: https://transistor.fm/legal/ servers: - url: https://api.transistor.fm/v1 description: Transistor API v1 security: - apiKeyAuth: [] tags: - name: Subscribers description: Private (subscriber-only) podcast subscribers. paths: /subscribers: get: operationId: listSubscribers tags: - Subscribers summary: List subscribers description: Returns a paginated list of private podcast subscribers. parameters: - $ref: '#/components/parameters/PageNumber' - $ref: '#/components/parameters/PageSize' responses: '200': description: A paginated list of subscribers. content: application/json: schema: $ref: '#/components/schemas/JsonApiResourceList' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' post: operationId: createSubscriber tags: - Subscribers summary: Add a subscriber description: Adds a private podcast subscriber, optionally sending an email invitation. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WriteBody' responses: '201': description: The created subscriber. content: application/json: schema: $ref: '#/components/schemas/JsonApiResource' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/UnprocessableEntity' '429': $ref: '#/components/responses/RateLimited' delete: operationId: deleteSubscriberByEmail tags: - Subscribers summary: Remove a subscriber description: Removes a private podcast subscriber, identified by email. parameters: - name: email in: query description: The email address of the subscriber to remove. schema: type: string responses: '200': description: The subscriber was removed. '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' /subscribers/batch: post: operationId: batchCreateSubscribers tags: - Subscribers summary: Add subscribers in bulk description: Adds multiple private podcast subscribers in a single request. requestBody: required: true content: application/json: schema: type: object properties: subscribers: type: array items: type: object responses: '201': description: The created subscribers. content: application/json: schema: $ref: '#/components/schemas/JsonApiResourceList' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' /subscribers/{id}: parameters: - $ref: '#/components/parameters/ResourceId' get: operationId: getSubscriber tags: - Subscribers summary: Retrieve a subscriber description: Returns a single private podcast subscriber by ID. responses: '200': description: The requested subscriber. content: application/json: schema: $ref: '#/components/schemas/JsonApiResource' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' patch: operationId: updateSubscriber tags: - Subscribers summary: Update a subscriber description: Updates a private podcast subscriber's email address. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WriteBody' responses: '200': description: The updated subscriber. content: application/json: schema: $ref: '#/components/schemas/JsonApiResource' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' delete: operationId: deleteSubscriber tags: - Subscribers summary: Remove a subscriber by ID description: Removes a single private podcast subscriber by ID. responses: '200': description: The subscriber was removed. '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' components: responses: RateLimited: description: Too many requests. The API allows 10 requests per 10 seconds; exceeding this blocks access for 10 seconds. content: application/json: schema: $ref: '#/components/schemas/Errors' Unauthorized: description: Missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/Errors' NotFound: description: The requested resource was not found. content: application/json: schema: $ref: '#/components/schemas/Errors' UnprocessableEntity: description: The request was well-formed but the parameters were invalid. content: application/json: schema: $ref: '#/components/schemas/Errors' schemas: JsonApiResource: type: object description: A JSON:API single-resource document. properties: data: $ref: '#/components/schemas/ResourceObject' included: type: array items: $ref: '#/components/schemas/ResourceObject' Errors: type: object properties: errors: type: array items: type: object properties: status: type: string title: type: string detail: type: string ResourceObject: type: object description: A JSON:API resource object. properties: id: type: string type: type: string attributes: type: object additionalProperties: true relationships: type: object additionalProperties: true JsonApiResourceList: type: object description: A JSON:API list document with pagination metadata. properties: data: type: array items: $ref: '#/components/schemas/ResourceObject' meta: type: object properties: currentPage: type: integer totalPages: type: integer totalCount: type: integer WriteBody: type: object description: A write payload. Transistor accepts attributes nested under a resource-named key (for example show, episode, or subscriber). additionalProperties: true parameters: ResourceId: name: id in: path required: true description: The resource identifier. schema: type: string PageNumber: name: pagination[page] in: query description: The page number to return. schema: type: integer PageSize: name: pagination[per] in: query description: The number of records to return per page. schema: type: integer securitySchemes: apiKeyAuth: type: apiKey in: header name: x-api-key description: API key generated in the Transistor dashboard Account area.