openapi: 3.1.0 info: title: Howler API v3 Artists Email OTP API version: 3.6.1 description: '*Last updated: 2026-01-20 21:15:49 +0200* ' servers: - url: https://{defaultHost}/api/v3/consumer_portal variables: defaultHost: default: www.howler.co.za description: Server for consumer portal endpoints security: - bearer_header: [] bearer_param: [] api_key: [] bearer_auth: [] tags: - name: Email OTP paths: /email_otp/generate: post: summary: generate email otp tags: - Email OTP security: [] description: Generates a one-time password (OTP) for email-based authentication operationId: generateEmailOtp parameters: - name: email in: query format: email required: true description: Email address to send the OTP to schema: type: string responses: '201': description: OTP generated successfully content: application/json: schema: type: object properties: status: type: string example: success message: type: string example: If your email exists in our system, you will receive an email with a one-time password. '422': description: Invalid email format content: application/json: schema: type: object properties: status: type: string example: error message: type: string example: Invalid email format /email_otp/login: post: summary: login with email otp tags: - Email OTP security: [] description: Authenticates user with email and OTP operationId: loginWithEmailOtp parameters: [] responses: '200': description: Login successful content: application/json: schema: type: object properties: status: type: string example: success token: type: string example: jwt_token_here user: $ref: '#/components/schemas/User' '401': description: Invalid credentials content: application/json: schema: type: object properties: status: type: string example: error message: type: string example: Invalid email or OTP '422': description: Validation error content: application/json: schema: type: object properties: status: type: string example: error message: type: string example: Email and OTP are required requestBody: content: application/json: schema: type: object properties: email: type: string format: email description: Email address example: user@example.com otp: type: string description: One-time password received via email example: '123456' required: - email - otp components: schemas: User: type: object properties: id: type: integer readOnly: true description: Primary Key first_name: type: string description: First Name last_name: type: string description: Last Name primary_email: type: string readOnly: true description: Email address of user or dummy user dummy?: type: boolean readOnly: true description: True if the user has not yet signed up for an account. required: - id - first_name - last_name - primary_email - dummy? securitySchemes: oauth2: type: oauth2 description: OAuth2 authentication for third-party applications flows: authorizationCode: authorizationUrl: /oauth/authorize tokenUrl: /oauth/token scopes: public: Public scope login: Login scope ott: One-time token scope bearer_header: type: http scheme: bearer bearerFormat: oauth2 in: header bearer_param: type: apiKey scheme: bearer bearerFormat: oauth2 name: bearer_token in: query jwt_header: type: http scheme: bearer bearerFormat: JWT description: JWT token obtained from basic authentication login jwt_param: type: apiKey name: bearer_token in: query description: JWT token as query parameter (alternative to Authorization header) basic_auth: type: http scheme: basic description: Basic authentication with email and password api_key: type: apiKey name: x-auth-token in: header description: API key authentication bearer_auth: type: http scheme: bearer bearerFormat: JWT description: JWT token authentication