openapi: 3.0.3
info:
  title: 'SellAuth API'
  description: 'SellAuth API Specification'
  version: 1.0.0
servers:
  -
    url: 'https://api.sellauth.com'
paths:
  /v1/user:
    get:
      summary: 'Get User'
      operationId: getUser
      description: 'The account that owns the API key, with account-level extras (pending shop invites, unread changelog). Not tied to any shop; useful to verify a key and see who it belongs to.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  username: demo
                  email: demo@sellauth.test
                  email_verified_at: null
                  priority_support: false
                  changelog_last_viewed_at: null
                  otp_expires_at: null
                  otp_sent_at: null
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  bought_theme_ids: null
                  referral_code: null
                  referral_source: null
                  tfa_enabled: false
                  deleted_at: null
                  mfa_trusted: false
                  token:
                    type: api
                    full_access: true
                    permissions: '*'
                    shop_ids: null
                  sellauth_shop_customer_id: null
                  sellauth_shop_balance: 0
                  pending_shop_invites_count: 0
                  priority_support_joined: false
                  has_unread_changelog: false
                  survey_key: ''
                  survey_token: null
                  ignore_otp: true
                properties:
                  id:
                    type: integer
                    example: 1
                  username:
                    type: string
                    example: demo
                  email:
                    type: string
                    example: demo@sellauth.test
                  email_verified_at:
                    type: string
                    example: null
                  priority_support:
                    type: boolean
                    example: false
                  changelog_last_viewed_at:
                    type: string
                    example: null
                  otp_expires_at:
                    type: string
                    example: null
                  otp_sent_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  bought_theme_ids:
                    type: string
                    example: null
                  referral_code:
                    type: string
                    example: null
                  referral_source:
                    type: string
                    example: null
                  tfa_enabled:
                    type: boolean
                    example: false
                  deleted_at:
                    type: string
                    example: null
                  mfa_trusted:
                    type: boolean
                    example: false
                  token:
                    type: object
                    properties:
                      type:
                        type: string
                        example: api
                      full_access:
                        type: boolean
                        example: true
                      permissions:
                        type: string
                        example: '*'
                      shop_ids:
                        type: string
                        example: null
                  sellauth_shop_customer_id:
                    type: string
                    example: null
                  sellauth_shop_balance:
                    type: integer
                    example: 0
                  pending_shop_invites_count:
                    type: integer
                    example: 0
                  priority_support_joined:
                    type: boolean
                    example: false
                  has_unread_changelog:
                    type: boolean
                    example: false
                  survey_key:
                    type: string
                    example: ''
                  survey_token:
                    type: string
                    example: null
                  ignore_otp:
                    type: boolean
                    example: true
      tags:
        - User
  /v1/shops:
    get:
      summary: 'Get Shops'
      operationId: getShops
      description: 'Retrieves all your shops.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    id: 1
                    created_at: '2026-08-28T18:23:02.000000Z'
                    updated_at: '2026-08-28T18:23:02.000000Z'
                    name: 'Demo Shop'
                    subdomain: demo-shop
                    logo_image_id: null
                    favicon_image_id: null
                    background_image_id: null
                    owner_id: 1
                    description: null
                    currency: USD
                    default_language: null
                    enabled_languages: null
                    meta_title: null
                    meta_description: null
                    meta_image_id: null
                    meta_twitter_card: summary
                    terms: null
                    privacy_policy: null
                    refund_policy: null
                    discord_url: null
                    youtube_url: null
                    telegram_url: null
                    tiktok_url: null
                    instagram_url: null
                    theme_id: null
                    deleted_at: null
                    crisp_website_id: null
                    tawkto_id: null
                    gtag_id: null
                    gtm_id: null
                    meta_pixel_id: null
                    discord_client_id: null
                    discord_client_secret: null
                    discord_bot_token: null
                    termination_reason: null
                    termination_internal_reason: null
                    terminated_at: null
                    termination_appeal: null
                    products_sold: 0
                    products_sold_offset: 0
                    total_customers: 0
                    total_completed_invoices: null
                    total_customers_offset: 0
                    total_feedbacks: 0
                    average_rating: '0.00'
                    webhook_secret: bda0dde14f8a0ce924459ecafcbdf92da6276276d2c0fc87082c3019d787de37
                    invoice_header: null
                    invoice_notes: null
                    invoice_footer: null
                    invoice_attach_email: false
                    tax_enabled: false
                    tax_rate: null
                    tax_countries: null
                    tickets_enabled: true
                    maintenance_enabled: 0
                    refund_out_of_stock_to_customer_balance: false
                    trustpilot_afs_email: null
                    force_custom_domain: true
                    hide_out_of_stock_products: false
                    require_shipping_zone: 1
                    noindex: false
                    powered_by_enabled: false
                    has_supplier_connections: false
                    reseller_marketplace_available: true
                    user_permissions: '*'
                    url: 'http://demo-shop.mysellauth.test:80'
                    is_subscribed: true
                    subscription_ends_at: '2036-08-28T18:23:02.000000Z'
                    subscription_plan:
                      id: scale
                      name: Scale
                      product_id: 801686
                      price: 29.99
                      rank: 2
                      referral_bonus: 0.1
                      has_custom_domain: true
                      has_custom_pages: true
                      has_custom_notes: true
                      has_manual_payment_method: true
                      has_feedback_dispute: true
                      has_priority_dispute_resolution: true
                      has_feedback_image: true
                      has_feedback_disable: true
                      has_blacklist_advanced_types: true
                      has_whitelist_advanced_types: true
                      has_email_templates: true
                      has_smtp: true
                      has_discord_remove_role: true
                      has_checkout_api: true
                      has_checkout_custom_css: true
                      has_beta_features: true
                      has_abandoned_checkouts: true
                      has_subscriptions: true
                      has_ai_theme_editor: true
                      has_reseller_panel: true
                      has_email_marketing: true
                      has_email_automations: true
                      has_email_tracking: true
                      product_limit: 5000
                      variant_per_product_limit: 1000
                      image_per_product_limit: 50
                      gif_frame_limit: 5000
                      team_member_limit: 50
                      blacklist_limit: 5000
                      whitelist_limit: 5000
                      cart_item_limit: 100
                      downloadable_file_limit: 500
                      downloadable_file_max_size_mb: 100
                      affiliate_tier_limit: 500
                      affiliate_limit: 10000
                      reseller_tier_limit: 500
                      reseller_limit: 10000
                      blog_post_limit: 500
                      coupon_limit: 50000
                      email_monthly_send_limit: 50000
                      email_campaign_limit: 500
                      email_list_limit: 100
                      email_contact_limit: 100000
                      email_marketing_template_limit: 100
                      email_automation_limit: 20
                      email_send_rate_per_minute: 200
                      min_feedback_price_usd: 0
                      webp_quality: 98
                      image_max_size_mb: 50
                      theme_asset_file_max_size_mb: 10
                    subscription_source: paid
                    logo_image_url: null
                    activity_log_enabled: true
                    pivot:
                      user_id: 1
                      shop_id: 1
                      role: owner
                    subscription:
                      id: 1
                      shop_id: 1
                      plan: scale
                      renewal_method: manual
                      product_subscription_id: null
                      cancel_at_period_end: false
                      ends_at: '2036-08-28T18:23:02.000000Z'
                      rate_usd_per_day: null
                      previous_plan: null
                      switched_at: null
                      expiry_reminder_stage: 0
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                    active_grant: null
                    theme: null
                    payment_methods:
                      -
                        id: 1
                        shop_id: 1
                        type: stripe
                        name: Stripe
                        checkout_name: null
                        icon_image_id: null
                        percentage_fee: 0
                        fixed_fee: 0
                        min_amount: null
                        max_amount: null
                        currency_override: null
                        hide_powered_by: false
                        is_active: true
                        order: 0
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                        icon_image_url: null
                        icon_image: null
                      -
                        id: 2
                        shop_id: 1
                        type: CUSTOMERBALANCE
                        name: 'Customer Balance'
                        checkout_name: null
                        icon_image_id: null
                        percentage_fee: 0
                        fixed_fee: 0
                        min_amount: null
                        max_amount: null
                        currency_override: null
                        hide_powered_by: false
                        is_active: true
                        order: 0
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                        icon_image_url: null
                        icon_image: null
                    verified_domain: null
                    logo_image: null
      tags:
        - Shops
  /v1/shops/create:
    post:
      summary: 'Create Shop'
      operationId: createShop
      description: 'Creates a new shop.'
      parameters: []
      responses:
        200:
          description: 'The created shop'
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  name: 'My Shop'
                  subdomain: my-shop
                  owner_id: 1
                properties:
                  id:
                    type: integer
                    example: 1
                  name:
                    type: string
                    example: 'My Shop'
                  subdomain:
                    type: string
                    example: my-shop
                  owner_id:
                    type: integer
                    example: 1
        400:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'You have reached the maximum number of shops.'
                properties:
                  message:
                    type: string
                    example: 'You have reached the maximum number of shops.'
      tags:
        - Shops
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: ''
                  example: culpa
                subdomain:
                  type: string
                  description: 'Must match the regex /^(?!-)[A-Za-z0-9-]+(?<!-)$/.'
                  example: '!--<!-'
                logo:
                  type: string
                  format: binary
                  description: 'Must be an image.'
              required:
                - name
                - subdomain
  '/v1/shops/{shopId}':
    get:
      summary: 'Get Shop'
      operationId: getShop
      description: 'Retrieves a specific shop.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  name: 'Demo Shop'
                  subdomain: demo-shop
                  logo_image_id: null
                  favicon_image_id: null
                  background_image_id: null
                  owner_id: 1
                  description: null
                  currency: USD
                  default_language: null
                  enabled_languages: null
                  meta_title: null
                  meta_description: null
                  meta_image_id: null
                  meta_twitter_card: summary
                  terms: null
                  privacy_policy: null
                  refund_policy: null
                  discord_url: null
                  youtube_url: null
                  telegram_url: null
                  tiktok_url: null
                  instagram_url: null
                  theme_id: null
                  deleted_at: null
                  crisp_website_id: null
                  tawkto_id: null
                  gtag_id: null
                  gtm_id: null
                  meta_pixel_id: null
                  discord_client_id: null
                  discord_client_secret: null
                  discord_bot_token: null
                  termination_reason: null
                  termination_internal_reason: null
                  terminated_at: null
                  termination_appeal: null
                  products_sold: 0
                  products_sold_offset: 0
                  total_customers: 0
                  total_completed_invoices: null
                  total_customers_offset: 0
                  total_feedbacks: 0
                  average_rating: '0.00'
                  webhook_secret: bda0dde14f8a0ce924459ecafcbdf92da6276276d2c0fc87082c3019d787de37
                  invoice_header: null
                  invoice_notes: null
                  invoice_footer: null
                  invoice_attach_email: false
                  tax_enabled: false
                  tax_rate: null
                  tax_countries: null
                  tickets_enabled: true
                  maintenance_enabled: 0
                  refund_out_of_stock_to_customer_balance: false
                  trustpilot_afs_email: null
                  force_custom_domain: true
                  hide_out_of_stock_products: false
                  require_shipping_zone: 1
                  noindex: false
                  powered_by_enabled: false
                  url: 'http://demo-shop.mysellauth.test:80'
                  is_subscribed: true
                  subscription_ends_at: '2036-08-28T18:23:02.000000Z'
                  subscription_plan:
                    id: scale
                    name: Scale
                    product_id: 801686
                    price: 29.99
                    rank: 2
                    referral_bonus: 0.1
                    has_custom_domain: true
                    has_custom_pages: true
                    has_custom_notes: true
                    has_manual_payment_method: true
                    has_feedback_dispute: true
                    has_priority_dispute_resolution: true
                    has_feedback_image: true
                    has_feedback_disable: true
                    has_blacklist_advanced_types: true
                    has_whitelist_advanced_types: true
                    has_email_templates: true
                    has_smtp: true
                    has_discord_remove_role: true
                    has_checkout_api: true
                    has_checkout_custom_css: true
                    has_beta_features: true
                    has_abandoned_checkouts: true
                    has_subscriptions: true
                    has_ai_theme_editor: true
                    has_reseller_panel: true
                    has_email_marketing: true
                    has_email_automations: true
                    has_email_tracking: true
                    product_limit: 5000
                    variant_per_product_limit: 1000
                    image_per_product_limit: 50
                    gif_frame_limit: 5000
                    team_member_limit: 50
                    blacklist_limit: 5000
                    whitelist_limit: 5000
                    cart_item_limit: 100
                    downloadable_file_limit: 500
                    downloadable_file_max_size_mb: 100
                    affiliate_tier_limit: 500
                    affiliate_limit: 10000
                    reseller_tier_limit: 500
                    reseller_limit: 10000
                    blog_post_limit: 500
                    coupon_limit: 50000
                    email_monthly_send_limit: 50000
                    email_campaign_limit: 500
                    email_list_limit: 100
                    email_contact_limit: 100000
                    email_marketing_template_limit: 100
                    email_automation_limit: 20
                    email_send_rate_per_minute: 200
                    min_feedback_price_usd: 0
                    webp_quality: 98
                    image_max_size_mb: 50
                    theme_asset_file_max_size_mb: 10
                  subscription_source: paid
                  logo_image_url: null
                  activity_log_enabled: true
                  pivot:
                    user_id: 1
                    shop_id: 1
                    role: owner
                  subscription:
                    id: 1
                    shop_id: 1
                    plan: scale
                    renewal_method: manual
                    product_subscription_id: null
                    cancel_at_period_end: false
                    ends_at: '2036-08-28T18:23:02.000000Z'
                    rate_usd_per_day: null
                    previous_plan: null
                    switched_at: null
                    expiry_reminder_stage: 0
                    created_at: '2026-08-28T18:23:02.000000Z'
                    updated_at: '2026-08-28T18:23:02.000000Z'
                    deleted_at: null
                  active_grant: null
                  payment_methods:
                    -
                      id: 1
                      shop_id: 1
                      type: stripe
                      name: Stripe
                      checkout_name: null
                      icon_image_id: null
                      percentage_fee: 0
                      fixed_fee: 0
                      min_amount: null
                      max_amount: null
                      currency_override: null
                      hide_powered_by: false
                      is_active: true
                      order: 0
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                      icon_image_url: null
                      icon_image: null
                    -
                      id: 2
                      shop_id: 1
                      type: CUSTOMERBALANCE
                      name: 'Customer Balance'
                      checkout_name: null
                      icon_image_id: null
                      percentage_fee: 0
                      fixed_fee: 0
                      min_amount: null
                      max_amount: null
                      currency_override: null
                      hide_powered_by: false
                      is_active: true
                      order: 0
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                      icon_image_url: null
                      icon_image: null
                  verified_domain: null
                  logo_image: null
                properties:
                  id:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  name:
                    type: string
                    example: 'Demo Shop'
                  subdomain:
                    type: string
                    example: demo-shop
                  logo_image_id:
                    type: string
                    example: null
                  favicon_image_id:
                    type: string
                    example: null
                  background_image_id:
                    type: string
                    example: null
                  owner_id:
                    type: integer
                    example: 1
                  description:
                    type: string
                    example: null
                  currency:
                    type: string
                    example: USD
                  default_language:
                    type: string
                    example: null
                  enabled_languages:
                    type: string
                    example: null
                  meta_title:
                    type: string
                    example: null
                  meta_description:
                    type: string
                    example: null
                  meta_image_id:
                    type: string
                    example: null
                  meta_twitter_card:
                    type: string
                    example: summary
                  terms:
                    type: string
                    example: null
                  privacy_policy:
                    type: string
                    example: null
                  refund_policy:
                    type: string
                    example: null
                  discord_url:
                    type: string
                    example: null
                  youtube_url:
                    type: string
                    example: null
                  telegram_url:
                    type: string
                    example: null
                  tiktok_url:
                    type: string
                    example: null
                  instagram_url:
                    type: string
                    example: null
                  theme_id:
                    type: string
                    example: null
                  deleted_at:
                    type: string
                    example: null
                  crisp_website_id:
                    type: string
                    example: null
                  tawkto_id:
                    type: string
                    example: null
                  gtag_id:
                    type: string
                    example: null
                  gtm_id:
                    type: string
                    example: null
                  meta_pixel_id:
                    type: string
                    example: null
                  discord_client_id:
                    type: string
                    example: null
                  discord_client_secret:
                    type: string
                    example: null
                  discord_bot_token:
                    type: string
                    example: null
                  termination_reason:
                    type: string
                    example: null
                  termination_internal_reason:
                    type: string
                    example: null
                  terminated_at:
                    type: string
                    example: null
                  termination_appeal:
                    type: string
                    example: null
                  products_sold:
                    type: integer
                    example: 0
                  products_sold_offset:
                    type: integer
                    example: 0
                  total_customers:
                    type: integer
                    example: 0
                  total_completed_invoices:
                    type: string
                    example: null
                  total_customers_offset:
                    type: integer
                    example: 0
                  total_feedbacks:
                    type: integer
                    example: 0
                  average_rating:
                    type: string
                    example: '0.00'
                  webhook_secret:
                    type: string
                    example: bda0dde14f8a0ce924459ecafcbdf92da6276276d2c0fc87082c3019d787de37
                  invoice_header:
                    type: string
                    example: null
                  invoice_notes:
                    type: string
                    example: null
                  invoice_footer:
                    type: string
                    example: null
                  invoice_attach_email:
                    type: boolean
                    example: false
                  tax_enabled:
                    type: boolean
                    example: false
                  tax_rate:
                    type: string
                    example: null
                  tax_countries:
                    type: string
                    example: null
                  tickets_enabled:
                    type: boolean
                    example: true
                  maintenance_enabled:
                    type: integer
                    example: 0
                  refund_out_of_stock_to_customer_balance:
                    type: boolean
                    example: false
                  trustpilot_afs_email:
                    type: string
                    example: null
                  force_custom_domain:
                    type: boolean
                    example: true
                  hide_out_of_stock_products:
                    type: boolean
                    example: false
                  require_shipping_zone:
                    type: integer
                    example: 1
                  noindex:
                    type: boolean
                    example: false
                  powered_by_enabled:
                    type: boolean
                    example: false
                  url:
                    type: string
                    example: 'http://demo-shop.mysellauth.test:80'
                  is_subscribed:
                    type: boolean
                    example: true
                  subscription_ends_at:
                    type: string
                    example: '2036-08-28T18:23:02.000000Z'
                  subscription_plan:
                    type: object
                    properties:
                      id:
                        type: string
                        example: scale
                      name:
                        type: string
                        example: Scale
                      product_id:
                        type: integer
                        example: 801686
                      price:
                        type: number
                        example: 29.99
                      rank:
                        type: integer
                        example: 2
                      referral_bonus:
                        type: number
                        example: 0.1
                      has_custom_domain:
                        type: boolean
                        example: true
                      has_custom_pages:
                        type: boolean
                        example: true
                      has_custom_notes:
                        type: boolean
                        example: true
                      has_manual_payment_method:
                        type: boolean
                        example: true
                      has_feedback_dispute:
                        type: boolean
                        example: true
                      has_priority_dispute_resolution:
                        type: boolean
                        example: true
                      has_feedback_image:
                        type: boolean
                        example: true
                      has_feedback_disable:
                        type: boolean
                        example: true
                      has_blacklist_advanced_types:
                        type: boolean
                        example: true
                      has_whitelist_advanced_types:
                        type: boolean
                        example: true
                      has_email_templates:
                        type: boolean
                        example: true
                      has_smtp:
                        type: boolean
                        example: true
                      has_discord_remove_role:
                        type: boolean
                        example: true
                      has_checkout_api:
                        type: boolean
                        example: true
                      has_checkout_custom_css:
                        type: boolean
                        example: true
                      has_beta_features:
                        type: boolean
                        example: true
                      has_abandoned_checkouts:
                        type: boolean
                        example: true
                      has_subscriptions:
                        type: boolean
                        example: true
                      has_ai_theme_editor:
                        type: boolean
                        example: true
                      has_reseller_panel:
                        type: boolean
                        example: true
                      has_email_marketing:
                        type: boolean
                        example: true
                      has_email_automations:
                        type: boolean
                        example: true
                      has_email_tracking:
                        type: boolean
                        example: true
                      product_limit:
                        type: integer
                        example: 5000
                      variant_per_product_limit:
                        type: integer
                        example: 1000
                      image_per_product_limit:
                        type: integer
                        example: 50
                      gif_frame_limit:
                        type: integer
                        example: 5000
                      team_member_limit:
                        type: integer
                        example: 50
                      blacklist_limit:
                        type: integer
                        example: 5000
                      whitelist_limit:
                        type: integer
                        example: 5000
                      cart_item_limit:
                        type: integer
                        example: 100
                      downloadable_file_limit:
                        type: integer
                        example: 500
                      downloadable_file_max_size_mb:
                        type: integer
                        example: 100
                      affiliate_tier_limit:
                        type: integer
                        example: 500
                      affiliate_limit:
                        type: integer
                        example: 10000
                      reseller_tier_limit:
                        type: integer
                        example: 500
                      reseller_limit:
                        type: integer
                        example: 10000
                      blog_post_limit:
                        type: integer
                        example: 500
                      coupon_limit:
                        type: integer
                        example: 50000
                      email_monthly_send_limit:
                        type: integer
                        example: 50000
                      email_campaign_limit:
                        type: integer
                        example: 500
                      email_list_limit:
                        type: integer
                        example: 100
                      email_contact_limit:
                        type: integer
                        example: 100000
                      email_marketing_template_limit:
                        type: integer
                        example: 100
                      email_automation_limit:
                        type: integer
                        example: 20
                      email_send_rate_per_minute:
                        type: integer
                        example: 200
                      min_feedback_price_usd:
                        type: integer
                        example: 0
                      webp_quality:
                        type: integer
                        example: 98
                      image_max_size_mb:
                        type: integer
                        example: 50
                      theme_asset_file_max_size_mb:
                        type: integer
                        example: 10
                  subscription_source:
                    type: string
                    example: paid
                  logo_image_url:
                    type: string
                    example: null
                  activity_log_enabled:
                    type: boolean
                    example: true
                  pivot:
                    type: object
                    properties:
                      user_id:
                        type: integer
                        example: 1
                      shop_id:
                        type: integer
                        example: 1
                      role:
                        type: string
                        example: owner
                  subscription:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      shop_id:
                        type: integer
                        example: 1
                      plan:
                        type: string
                        example: scale
                      renewal_method:
                        type: string
                        example: manual
                      product_subscription_id:
                        type: string
                        example: null
                      cancel_at_period_end:
                        type: boolean
                        example: false
                      ends_at:
                        type: string
                        example: '2036-08-28T18:23:02.000000Z'
                      rate_usd_per_day:
                        type: string
                        example: null
                      previous_plan:
                        type: string
                        example: null
                      switched_at:
                        type: string
                        example: null
                      expiry_reminder_stage:
                        type: integer
                        example: 0
                      created_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      updated_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      deleted_at:
                        type: string
                        example: null
                  active_grant:
                    type: string
                    example: null
                  payment_methods:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        type: stripe
                        name: Stripe
                        checkout_name: null
                        icon_image_id: null
                        percentage_fee: 0
                        fixed_fee: 0
                        min_amount: null
                        max_amount: null
                        currency_override: null
                        hide_powered_by: false
                        is_active: true
                        order: 0
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                        icon_image_url: null
                        icon_image: null
                      -
                        id: 2
                        shop_id: 1
                        type: CUSTOMERBALANCE
                        name: 'Customer Balance'
                        checkout_name: null
                        icon_image_id: null
                        percentage_fee: 0
                        fixed_fee: 0
                        min_amount: null
                        max_amount: null
                        currency_override: null
                        hide_powered_by: false
                        is_active: true
                        order: 0
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                        icon_image_url: null
                        icon_image: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        type:
                          type: string
                          example: stripe
                        name:
                          type: string
                          example: Stripe
                        checkout_name:
                          type: string
                          example: null
                        icon_image_id:
                          type: string
                          example: null
                        percentage_fee:
                          type: integer
                          example: 0
                        fixed_fee:
                          type: integer
                          example: 0
                        min_amount:
                          type: string
                          example: null
                        max_amount:
                          type: string
                          example: null
                        currency_override:
                          type: string
                          example: null
                        hide_powered_by:
                          type: boolean
                          example: false
                        is_active:
                          type: boolean
                          example: true
                        order:
                          type: integer
                          example: 0
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        deleted_at:
                          type: string
                          example: null
                        icon_image_url:
                          type: string
                          example: null
                        icon_image:
                          type: string
                          example: null
                  verified_domain:
                    type: string
                    example: null
                  logo_image:
                    type: string
                    example: null
      tags:
        - Shops
    delete:
      summary: 'Delete Shop'
      operationId: deleteShop
      description: 'Deletes a specific shop.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Shops
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: ''
                  example: culpa
              required:
                - name
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/update':
    put:
      summary: 'Update Shop'
      operationId: updateShop
      description: 'Updates a specific shop.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Shops
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                subdomain:
                  type: string
                  description: 'Must match the regex /^(?!-)[A-Za-z0-9-]+(?<!-)$/. Must not be greater than 255 characters.'
                  example: ikymwkiinfowtzm
                logo_image_id:
                  type: string
                  description: ''
                  example: null
                favicon_image_id:
                  type: string
                  description: ''
                  example: null
                background_image_id:
                  type: string
                  description: ''
                  example: null
                discord_url:
                  type: string
                  description: 'Must be a valid URL. Must not be greater than 255 characters.'
                  example: 'http://www.volkman.com/dignissimos-error-et-itaque-quibusdam-tempora-velit'
                youtube_url:
                  type: string
                  description: 'Must be a valid URL. Must not be greater than 255 characters.'
                  example: 'http://wisoky.com/explicabo-eligendi-occaecati-debitis-et-saepe-eum'
                telegram_url:
                  type: string
                  description: 'Must be a valid URL. Must not be greater than 255 characters.'
                  example: 'https://cummings.org/ipsum-inventore-sed-libero-et.html'
                tiktok_url:
                  type: string
                  description: 'Must be a valid URL. Must not be greater than 255 characters.'
                  example: 'https://www.mccullough.com/deserunt-laudantium-quibusdam-enim-nostrum-soluta-qui-ipsam-non'
                instagram_url:
                  type: string
                  description: 'Must be a valid URL. Must not be greater than 255 characters.'
                  example: 'http://jenkins.org/'
                discord_client_id:
                  type: string
                  description: 'Must not be greater than 30 characters.'
                  example: agqzitsslufxbon
                discord_client_secret:
                  type: string
                  description: 'Must not be greater than 64 characters.'
                  example: cxhcsddnacixfxg
                discord_bot_token:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: smpbolpwypthgxn
                crisp_website_id:
                  type: string
                  description: 'Must not be greater than 40 characters.'
                  example: kysmpobtnyrwnub
                tawkto_id:
                  type: string
                  description: 'Must not be greater than 40 characters.'
                  example: zpcclwldceqpnvi
                gtag_id:
                  type: string
                  description: 'Must not be greater than 30 characters.'
                  example: yqjogqswwhqqtqj
                gtm_id:
                  type: string
                  description: 'Must not be greater than 30 characters.'
                  example: ghjxtodzarmjbcu
                meta_pixel_id:
                  type: string
                  description: 'Must not be greater than 30 characters.'
                  example: bbljkbkjttcfosz
                trustpilot_afs_email:
                  type: string
                  description: 'Must be a valid email address. Must match the regex /@invite\.trustpilot\.com$/i. Must not be greater than 255 characters.'
                  example: howe.mario@example.org
                description:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: 'Aut rerum exercitationem est rem dicta.'
                meta_title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: tqmzsbvhoayvndt
                meta_description:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: bvsnyfgnguxbsmd
                meta_image_id:
                  type: string
                  description: ''
                  example: null
                meta_twitter_card:
                  type: string
                  description: ''
                  example: summary_large_image
                  enum:
                    - summary
                    - summary_large_image
                terms:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: zpaxzmtcdhmglae
                privacy_policy:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: sduhcpozpojzeus
                refund_policy:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: gsepklwggloodqy
                invoice_header:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: ddbbxxffqsaojzd
                invoice_notes:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: bsajohfbtvtvubk
                invoice_footer:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: qaywgtsmfjzvcet
                invoice_attach_email:
                  type: boolean
                  description: ''
                  example: false
                tax_enabled:
                  type: boolean
                  description: ''
                  example: true
                tax_rate:
                  type: integer
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 24
                tax_countries:
                  type: object
                  description: ''
                  example: null
                  properties: {  }
                tickets_enabled:
                  type: boolean
                  description: ''
                  example: false
                force_custom_domain:
                  type: boolean
                  description: ''
                  example: false
                refund_out_of_stock_to_customer_balance:
                  type: boolean
                  description: ''
                  example: false
                hide_out_of_stock_products:
                  type: boolean
                  description: ''
                  example: false
                require_shipping_zone:
                  type: boolean
                  description: ''
                  example: false
                noindex:
                  type: boolean
                  description: ''
                  example: false
                powered_by_enabled:
                  type: boolean
                  description: ''
                  example: false
                maintenance_enabled:
                  type: boolean
                  description: ''
                  example: true
                maintenance_password:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: maxkwqmoutximtd
                currency:
                  type: string
                  description: 'Must be 3 characters.'
                  example: ytq
                default_language:
                  type: string
                  description: ''
                  example: nl
                  enum:
                    - en
                    - ar
                    - de
                    - es
                    - fa
                    - fi
                    - fr
                    - he
                    - hi
                    - hu
                    - id
                    - it
                    - ja
                    - ko
                    - nl
                    - pl
                    - pt
                    - ro
                    - ru
                    - sv
                    - tr
                    - uk
                    - vi
                    - zh
                enabled_languages:
                  type: array
                  description: ''
                  example:
                    - fi
                  items:
                    type: string
              required:
                - name
                - subdomain
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/stats':
    get:
      summary: 'Get Shop Stats'
      operationId: getShopStats
      description: 'Retrieves shop statistics.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  products_sold: 0
                  virtual_products_sold: 0
                  total_customers: 0
                  virtual_total_customers: 0
                  total_completed_invoices: 1
                  total_feedbacks: 0
                  average_rating: 0
                properties:
                  products_sold:
                    type: integer
                    example: 0
                  virtual_products_sold:
                    type: integer
                    example: 0
                  total_customers:
                    type: integer
                    example: 0
                  virtual_total_customers:
                    type: integer
                    example: 0
                  total_completed_invoices:
                    type: integer
                    example: 1
                  total_feedbacks:
                    type: integer
                    example: 0
                  average_rating:
                    type: integer
                    example: 0
      tags:
        - Shops
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/domains':
    get:
      summary: 'Get Domains'
      operationId: getDomains
      description: 'Retrieves the domains.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example: []
      tags:
        - Domains
    post:
      summary: 'Create Domain'
      operationId: createDomain
      description: 'Creates a new domain.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Domains
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/domains/{domainId}':
    get:
      summary: 'Get Domain'
      operationId: getDomain
      description: 'Retrieves a specific domain.'
      parameters: []
      responses:
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Domain not found'
                properties:
                  message:
                    type: string
                    example: 'Domain not found'
      tags:
        - Domains
    delete:
      summary: 'Delete Domain'
      operationId: deleteDomain
      description: 'Deletes a specific domain.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Domains
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: domainId
        description: ''
        example: 12
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blog-posts':
    get:
      summary: 'Get Blog Posts'
      operationId: getBlogPosts
      description: 'Retrieves the blog posts.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      ai_generated: false
                      topic_type: null
                      path: welcome
                      title: Welcome
                      summary: 'Welcome to our shop.'
                      image_id: null
                      meta_title: null
                      meta_description: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      image: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/blog-posts?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/blog-posts?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/blog-posts?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/blog-posts'
                  per_page: 1
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        ai_generated: false
                        topic_type: null
                        path: welcome
                        title: Welcome
                        summary: 'Welcome to our shop.'
                        image_id: null
                        meta_title: null
                        meta_description: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        image: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        ai_generated:
                          type: boolean
                          example: false
                        topic_type:
                          type: string
                          example: null
                        path:
                          type: string
                          example: welcome
                        title:
                          type: string
                          example: Welcome
                        summary:
                          type: string
                          example: 'Welcome to our shop.'
                        image_id:
                          type: string
                          example: null
                        meta_title:
                          type: string
                          example: null
                        meta_description:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        image:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/blog-posts?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/blog-posts?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/blog-posts?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/blog-posts'
                  per_page:
                    type: integer
                    example: 1
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - 'Blog Posts'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: ''
                  example: 12
                perPage:
                  type: integer
                  description: 'Must be at least 1. Must not be greater than 100.'
                  example: 1
                orderColumn:
                  type: string
                  description: ''
                  example: id
                  enum:
                    - id
                    - title
                    - created_at
                    - updated_at
                orderDirection:
                  type: string
                  description: ''
                  example: asc
                  enum:
                    - asc
                    - desc
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: zwszwtxpeqqikym
    post:
      summary: 'Create Blog Post'
      operationId: createBlogPost
      description: 'Creates a new blog post.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Blog Posts'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                path:
                  type: string
                  description: 'Must match the regex /^[a-z0-9-]+$/.'
                  example: '8'
                summary:
                  type: string
                  description: 'Must not be greater than 2000 characters.'
                  example: zwszwtxpeqqikym
                content:
                  type: string
                  description: 'Must not be greater than 100000 characters.'
                  example: wkiinfowtzmixko
                image_id:
                  type: string
                  description: ''
                  example: null
                meta_title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: lowyuffszfrcsnw
                meta_description:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: wxvxezhebdrxkpi
              required:
                - title
                - content
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blog-posts-generate/options':
    get:
      summary: 'Get Blog Post Generation Options'
      operationId: getBlogPostGenerationOptions
      description: "Everything the generate dialog needs: limits, category profiles, and the shop's products and categories to pick from."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  available: false
                  max_count: 3
                  tones:
                    - professional
                    - casual
                    - technical
                    - enthusiastic
                    - concise
                  category_profiles:
                    -
                      value: game_enhancement
                      label: 'Game enhancement software (cheats, mods, spoofers)'
                    -
                      value: gaming_accounts
                      label: 'Game accounts, boosting and in-game goods'
                    -
                      value: digital_accounts
                      label: 'Subscriptions, streaming and digital accounts'
                    -
                      value: software_licenses
                      label: 'Software licenses and utilities'
                    -
                      value: ebooks_courses
                      label: 'E-books, courses and guides'
                    -
                      value: creative_assets
                      label: 'Digital art, templates and creative assets'
                    -
                      value: gift_cards
                      label: 'Gift cards and game keys'
                    -
                      value: general
                      label: 'General digital goods'
                  posts_remaining: 499
                  products:
                    -
                      id: 1
                      name: 'License Keys'
                      category_id: 1
                      stock_count: 0
                  categories:
                    -
                      id: 1
                      name: 'Digital Goods'
                      parent_id: null
                properties:
                  available:
                    type: boolean
                    example: false
                  max_count:
                    type: integer
                    example: 3
                  tones:
                    type: array
                    example:
                      - professional
                      - casual
                      - technical
                      - enthusiastic
                      - concise
                    items:
                      type: string
                  category_profiles:
                    type: array
                    example:
                      -
                        value: game_enhancement
                        label: 'Game enhancement software (cheats, mods, spoofers)'
                      -
                        value: gaming_accounts
                        label: 'Game accounts, boosting and in-game goods'
                      -
                        value: digital_accounts
                        label: 'Subscriptions, streaming and digital accounts'
                      -
                        value: software_licenses
                        label: 'Software licenses and utilities'
                      -
                        value: ebooks_courses
                        label: 'E-books, courses and guides'
                      -
                        value: creative_assets
                        label: 'Digital art, templates and creative assets'
                      -
                        value: gift_cards
                        label: 'Gift cards and game keys'
                      -
                        value: general
                        label: 'General digital goods'
                    items:
                      type: object
                      properties:
                        value:
                          type: string
                          example: game_enhancement
                        label:
                          type: string
                          example: 'Game enhancement software (cheats, mods, spoofers)'
                  posts_remaining:
                    type: integer
                    example: 499
                  products:
                    type: array
                    example:
                      -
                        id: 1
                        name: 'License Keys'
                        category_id: 1
                        stock_count: 0
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'License Keys'
                        category_id:
                          type: integer
                          example: 1
                        stock_count:
                          type: integer
                          example: 0
                  categories:
                    type: array
                    example:
                      -
                        id: 1
                        name: 'Digital Goods'
                        parent_id: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'Digital Goods'
                        parent_id:
                          type: string
                          example: null
      tags:
        - 'Blog Posts'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blog-posts/{blogPostId}':
    get:
      summary: 'Get Blog Post'
      operationId: getBlogPost
      description: 'Retrieves a specific blog post.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  shop_id: 1
                  ai_generated: false
                  topic_type: null
                  path: welcome
                  title: Welcome
                  summary: 'Welcome to our shop.'
                  image_id: null
                  meta_title: null
                  meta_description: null
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  content: ''
                  image: null
                properties:
                  id:
                    type: integer
                    example: 1
                  shop_id:
                    type: integer
                    example: 1
                  ai_generated:
                    type: boolean
                    example: false
                  topic_type:
                    type: string
                    example: null
                  path:
                    type: string
                    example: welcome
                  title:
                    type: string
                    example: Welcome
                  summary:
                    type: string
                    example: 'Welcome to our shop.'
                  image_id:
                    type: string
                    example: null
                  meta_title:
                    type: string
                    example: null
                  meta_description:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  content:
                    type: string
                    example: ''
                  image:
                    type: string
                    example: null
      tags:
        - 'Blog Posts'
    put:
      summary: 'Update Blog Post'
      operationId: updateBlogPost
      description: 'Updates a specific blog post.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Blog Posts'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: integer
                  description: ''
                  example: 12
                path:
                  type: string
                  description: 'Must match the regex /^[a-z0-9-]+$/.'
                  example: '8'
                title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: zwszwtxpeqqikym
                summary:
                  type: string
                  description: 'Must not be greater than 2000 characters.'
                  example: wkiinfowtzmixko
                content:
                  type: string
                  description: 'Must not be greater than 100000 characters.'
                  example: lowyuffszfrcsnw
                image_id:
                  type: string
                  description: ''
                  example: null
                meta_title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: wxvxezhebdrxkpi
                meta_description:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: ypmuihrdifekzag
              required:
                - id
                - title
                - content
    delete:
      summary: 'Delete Blog Post'
      operationId: deleteBlogPost
      description: 'Deletes a specific blog post.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Blog Posts'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: blogPostId
        description: 'The blog post ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blog-posts-generate/titles':
    post:
      summary: 'Generate Blog Post Titles'
      operationId: generateBlogPostTitles
      description: 'Drafts titles and short descriptions for the user to review. Nothing is saved.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Blog Posts'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                description:
                  type: string
                  description: 'Must not be greater than 2000 characters.'
                  example: 'Consequatur quisquam recusandae asperiores accusamus nihil repellat.'
                count:
                  type: integer
                  description: 'Must be at least 1. Must not be greater than 3.'
                  example: 3
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                category_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                tone:
                  type: string
                  description: ''
                  example: technical
                  enum:
                    - professional
                    - casual
                    - technical
                    - enthusiastic
                    - concise
                language:
                  type: string
                  description: 'Must not be greater than 40 characters.'
                  example: syzwszwtxpeqqik
                min_words:
                  type: integer
                  description: 'Must be at least 300. Must not be greater than 4000.'
                  example: 24
                max_words:
                  type: integer
                  description: 'Must be at least 300. Must not be greater than 4000.'
                  example: 12
                audience:
                  type: string
                  description: 'Must not be greater than 200 characters.'
                  example: wkiinfowtzmixko
                category_profile:
                  type: string
                  description: ''
                  example: creative_assets
                  enum:
                    - game_enhancement
                    - gaming_accounts
                    - digital_accounts
                    - software_licenses
                    - ebooks_courses
                    - creative_assets
                    - gift_cards
                    - general
              required:
                - count
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blog-posts-generate':
    post:
      summary: 'Generate Blog Posts'
      operationId: generateBlogPosts
      description: 'Queues the AI writer to write the full posts for the approved titles.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Blog Posts'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                description:
                  type: string
                  description: 'Must not be greater than 2000 characters.'
                  example: 'Consequatur quisquam recusandae asperiores accusamus nihil repellat.'
                count:
                  type: integer
                  description: 'Must be at least 1. Must not be greater than 3.'
                  example: 3
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                category_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                tone:
                  type: string
                  description: ''
                  example: technical
                  enum:
                    - professional
                    - casual
                    - technical
                    - enthusiastic
                    - concise
                language:
                  type: string
                  description: 'Must not be greater than 40 characters.'
                  example: syzwszwtxpeqqik
                min_words:
                  type: integer
                  description: 'Must be at least 300. Must not be greater than 4000.'
                  example: 24
                max_words:
                  type: integer
                  description: 'Must be at least 300. Must not be greater than 4000.'
                  example: 12
                audience:
                  type: string
                  description: 'Must not be greater than 200 characters.'
                  example: wkiinfowtzmixko
                category_profile:
                  type: string
                  description: ''
                  example: creative_assets
                  enum:
                    - game_enhancement
                    - gaming_accounts
                    - digital_accounts
                    - software_licenses
                    - ebooks_courses
                    - creative_assets
                    - gift_cards
                    - general
                posts:
                  type: array
                  description: 'Must have at least 1 items. Must not have more than 3 items.'
                  example: ow
                  items:
                    type: string
              required:
                - posts
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products':
    get:
      summary: 'Get Products'
      operationId: getProducts
      description: 'Retreives the products.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      metadata: null
                      feedback_coupon_config: null
                      salt: 1e597cc8693cc
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      name: 'License Keys'
                      path: null
                      description: 'Instant delivery of software license keys.'
                      meta_title: null
                      meta_description: null
                      meta_image_id: null
                      meta_twitter_card: summary_large_image
                      price: '14.99'
                      price_slash: null
                      currency: USD
                      tax_inclusive: true
                      payment_methods: null
                      deliverables: null
                      deliverables_type: serials
                      requires_fulfillment: false
                      serial_selection_method: null
                      dynamic_url: null
                      stock: null
                      group_id: 1
                      category_id: 1
                      shop_id: 1
                      volume_discounts: null
                      disable_volume_discounts_if_coupon: 0
                      type: variant
                      instructions: null
                      out_of_stock_message: null
                      thank_you_message: null
                      custom_fields_after_payment: false
                      sort_priority: 0
                      group_sort_priority: 0
                      dashboard_order: null
                      visibility: public
                      cloudflare_image_id: null
                      deleted_at: null
                      terminated_at: null
                      quantity_min: null
                      quantity_max: null
                      discord_required: false
                      discord_guild_id: null
                      discord_role_id: null
                      block_vpn: 0
                      hide_stock_count: false
                      status_color: null
                      status_text: null
                      products_sold: 0
                      show_views_count: false
                      show_sales_count: false
                      show_sales_notifications: false
                      sales_count_hours: null
                      deliverables_label: null
                      affiliate_percentage: null
                      is_mandatory: false
                      reseller_enabled: 1
                      reseller_disable_volume_discount: 0
                      cashback_percentage: null
                      stock_count: 3
                      group:
                        id: 1
                        metadata: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        name: 'Keys & Serials'
                        shop_id: 1
                        category_id: 1
                        image_id: null
                        sort_priority: 0
                        visibility: public
                        deleted_at: null
                        badge_color: null
                        badge_text: null
                      category:
                        id: 1
                        metadata: null
                        shop_id: 1
                        parent_id: null
                        name: 'Digital Goods'
                        path: digital-goods
                        description: null
                        image_id: null
                        meta_title: null
                        meta_description: null
                        color: null
                        order: 0
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                      images:
                        -
                          id: 1
                          cloudflare_image_id: null
                          created_at: '2026-08-28T18:23:02.000000Z'
                          updated_at: '2026-08-28T18:23:02.000000Z'
                          deleted_at: null
                          shop_id: 1
                          url: 'http://static.mysellauth.test/storage/images/1.webp'
                          pivot:
                            product_id: 1
                            image_id: 1
                            order: 0
                      variants:
                        -
                          id: 1
                          product_id: 1
                          name: Standard
                          description: null
                          price: '14.99'
                          price_slash: null
                          cost: '4.50'
                          quantity_min: null
                          quantity_max: null
                          volume_discounts: null
                          disable_volume_discounts_if_coupon: false
                          serial_selection_method: random
                          dynamic_url: null
                          redirect_url: null
                          stock: 3
                          instructions: null
                          disabled_payment_method_ids: null
                          order: 0
                          subscription_mode: disabled
                          recurring_price: null
                          recurring_interval: null
                          recurring_interval_count: 1
                          recurring_trial_days: 0
                          renewal_delivery: redeliver
                          reseller_connection_id: null
                          supplier_variant_id: null
                          reseller_sync_stock: false
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/products?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/products?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/products?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/products'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        metadata: null
                        feedback_coupon_config: null
                        salt: 1e597cc8693cc
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        name: 'License Keys'
                        path: null
                        description: 'Instant delivery of software license keys.'
                        meta_title: null
                        meta_description: null
                        meta_image_id: null
                        meta_twitter_card: summary_large_image
                        price: '14.99'
                        price_slash: null
                        currency: USD
                        tax_inclusive: true
                        payment_methods: null
                        deliverables: null
                        deliverables_type: serials
                        requires_fulfillment: false
                        serial_selection_method: null
                        dynamic_url: null
                        stock: null
                        group_id: 1
                        category_id: 1
                        shop_id: 1
                        volume_discounts: null
                        disable_volume_discounts_if_coupon: 0
                        type: variant
                        instructions: null
                        out_of_stock_message: null
                        thank_you_message: null
                        custom_fields_after_payment: false
                        sort_priority: 0
                        group_sort_priority: 0
                        dashboard_order: null
                        visibility: public
                        cloudflare_image_id: null
                        deleted_at: null
                        terminated_at: null
                        quantity_min: null
                        quantity_max: null
                        discord_required: false
                        discord_guild_id: null
                        discord_role_id: null
                        block_vpn: 0
                        hide_stock_count: false
                        status_color: null
                        status_text: null
                        products_sold: 0
                        show_views_count: false
                        show_sales_count: false
                        show_sales_notifications: false
                        sales_count_hours: null
                        deliverables_label: null
                        affiliate_percentage: null
                        is_mandatory: false
                        reseller_enabled: 1
                        reseller_disable_volume_discount: 0
                        cashback_percentage: null
                        stock_count: 3
                        group:
                          id: 1
                          metadata: null
                          created_at: '2026-08-28T18:23:02.000000Z'
                          updated_at: '2026-08-28T18:23:02.000000Z'
                          name: 'Keys & Serials'
                          shop_id: 1
                          category_id: 1
                          image_id: null
                          sort_priority: 0
                          visibility: public
                          deleted_at: null
                          badge_color: null
                          badge_text: null
                        category:
                          id: 1
                          metadata: null
                          shop_id: 1
                          parent_id: null
                          name: 'Digital Goods'
                          path: digital-goods
                          description: null
                          image_id: null
                          meta_title: null
                          meta_description: null
                          color: null
                          order: 0
                          created_at: '2026-08-28T18:23:02.000000Z'
                          updated_at: '2026-08-28T18:23:02.000000Z'
                          deleted_at: null
                        images:
                          -
                            id: 1
                            cloudflare_image_id: null
                            created_at: '2026-08-28T18:23:02.000000Z'
                            updated_at: '2026-08-28T18:23:02.000000Z'
                            deleted_at: null
                            shop_id: 1
                            url: 'http://static.mysellauth.test/storage/images/1.webp'
                            pivot:
                              product_id: 1
                              image_id: 1
                              order: 0
                        variants:
                          -
                            id: 1
                            product_id: 1
                            name: Standard
                            description: null
                            price: '14.99'
                            price_slash: null
                            cost: '4.50'
                            quantity_min: null
                            quantity_max: null
                            volume_discounts: null
                            disable_volume_discounts_if_coupon: false
                            serial_selection_method: random
                            dynamic_url: null
                            redirect_url: null
                            stock: 3
                            instructions: null
                            disabled_payment_method_ids: null
                            order: 0
                            subscription_mode: disabled
                            recurring_price: null
                            recurring_interval: null
                            recurring_interval_count: 1
                            recurring_trial_days: 0
                            renewal_delivery: redeliver
                            reseller_connection_id: null
                            supplier_variant_id: null
                            reseller_sync_stock: false
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        metadata:
                          type: string
                          example: null
                        feedback_coupon_config:
                          type: string
                          example: null
                        salt:
                          type: string
                          example: 1e597cc8693cc
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        name:
                          type: string
                          example: 'License Keys'
                        path:
                          type: string
                          example: null
                        description:
                          type: string
                          example: 'Instant delivery of software license keys.'
                        meta_title:
                          type: string
                          example: null
                        meta_description:
                          type: string
                          example: null
                        meta_image_id:
                          type: string
                          example: null
                        meta_twitter_card:
                          type: string
                          example: summary_large_image
                        price:
                          type: string
                          example: '14.99'
                        price_slash:
                          type: string
                          example: null
                        currency:
                          type: string
                          example: USD
                        tax_inclusive:
                          type: boolean
                          example: true
                        payment_methods:
                          type: string
                          example: null
                        deliverables:
                          type: string
                          example: null
                        deliverables_type:
                          type: string
                          example: serials
                        requires_fulfillment:
                          type: boolean
                          example: false
                        serial_selection_method:
                          type: string
                          example: null
                        dynamic_url:
                          type: string
                          example: null
                        stock:
                          type: string
                          example: null
                        group_id:
                          type: integer
                          example: 1
                        category_id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        volume_discounts:
                          type: string
                          example: null
                        disable_volume_discounts_if_coupon:
                          type: integer
                          example: 0
                        type:
                          type: string
                          example: variant
                        instructions:
                          type: string
                          example: null
                        out_of_stock_message:
                          type: string
                          example: null
                        thank_you_message:
                          type: string
                          example: null
                        custom_fields_after_payment:
                          type: boolean
                          example: false
                        sort_priority:
                          type: integer
                          example: 0
                        group_sort_priority:
                          type: integer
                          example: 0
                        dashboard_order:
                          type: string
                          example: null
                        visibility:
                          type: string
                          example: public
                        cloudflare_image_id:
                          type: string
                          example: null
                        deleted_at:
                          type: string
                          example: null
                        terminated_at:
                          type: string
                          example: null
                        quantity_min:
                          type: string
                          example: null
                        quantity_max:
                          type: string
                          example: null
                        discord_required:
                          type: boolean
                          example: false
                        discord_guild_id:
                          type: string
                          example: null
                        discord_role_id:
                          type: string
                          example: null
                        block_vpn:
                          type: integer
                          example: 0
                        hide_stock_count:
                          type: boolean
                          example: false
                        status_color:
                          type: string
                          example: null
                        status_text:
                          type: string
                          example: null
                        products_sold:
                          type: integer
                          example: 0
                        show_views_count:
                          type: boolean
                          example: false
                        show_sales_count:
                          type: boolean
                          example: false
                        show_sales_notifications:
                          type: boolean
                          example: false
                        sales_count_hours:
                          type: string
                          example: null
                        deliverables_label:
                          type: string
                          example: null
                        affiliate_percentage:
                          type: string
                          example: null
                        is_mandatory:
                          type: boolean
                          example: false
                        reseller_enabled:
                          type: integer
                          example: 1
                        reseller_disable_volume_discount:
                          type: integer
                          example: 0
                        cashback_percentage:
                          type: string
                          example: null
                        stock_count:
                          type: integer
                          example: 3
                        group:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            metadata:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-08-28T18:23:02.000000Z'
                            updated_at:
                              type: string
                              example: '2026-08-28T18:23:02.000000Z'
                            name:
                              type: string
                              example: 'Keys & Serials'
                            shop_id:
                              type: integer
                              example: 1
                            category_id:
                              type: integer
                              example: 1
                            image_id:
                              type: string
                              example: null
                            sort_priority:
                              type: integer
                              example: 0
                            visibility:
                              type: string
                              example: public
                            deleted_at:
                              type: string
                              example: null
                            badge_color:
                              type: string
                              example: null
                            badge_text:
                              type: string
                              example: null
                        category:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            metadata:
                              type: string
                              example: null
                            shop_id:
                              type: integer
                              example: 1
                            parent_id:
                              type: string
                              example: null
                            name:
                              type: string
                              example: 'Digital Goods'
                            path:
                              type: string
                              example: digital-goods
                            description:
                              type: string
                              example: null
                            image_id:
                              type: string
                              example: null
                            meta_title:
                              type: string
                              example: null
                            meta_description:
                              type: string
                              example: null
                            color:
                              type: string
                              example: null
                            order:
                              type: integer
                              example: 0
                            created_at:
                              type: string
                              example: '2026-08-28T18:23:02.000000Z'
                            updated_at:
                              type: string
                              example: '2026-08-28T18:23:02.000000Z'
                            deleted_at:
                              type: string
                              example: null
                        images:
                          type: array
                          example:
                            -
                              id: 1
                              cloudflare_image_id: null
                              created_at: '2026-08-28T18:23:02.000000Z'
                              updated_at: '2026-08-28T18:23:02.000000Z'
                              deleted_at: null
                              shop_id: 1
                              url: 'http://static.mysellauth.test/storage/images/1.webp'
                              pivot:
                                product_id: 1
                                image_id: 1
                                order: 0
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 1
                              cloudflare_image_id:
                                type: string
                                example: null
                              created_at:
                                type: string
                                example: '2026-08-28T18:23:02.000000Z'
                              updated_at:
                                type: string
                                example: '2026-08-28T18:23:02.000000Z'
                              deleted_at:
                                type: string
                                example: null
                              shop_id:
                                type: integer
                                example: 1
                              url:
                                type: string
                                example: 'http://static.mysellauth.test/storage/images/1.webp'
                              pivot:
                                type: object
                                properties:
                                  product_id:
                                    type: integer
                                    example: 1
                                  image_id:
                                    type: integer
                                    example: 1
                                  order:
                                    type: integer
                                    example: 0
                        variants:
                          type: array
                          example:
                            -
                              id: 1
                              product_id: 1
                              name: Standard
                              description: null
                              price: '14.99'
                              price_slash: null
                              cost: '4.50'
                              quantity_min: null
                              quantity_max: null
                              volume_discounts: null
                              disable_volume_discounts_if_coupon: false
                              serial_selection_method: random
                              dynamic_url: null
                              redirect_url: null
                              stock: 3
                              instructions: null
                              disabled_payment_method_ids: null
                              order: 0
                              subscription_mode: disabled
                              recurring_price: null
                              recurring_interval: null
                              recurring_interval_count: 1
                              recurring_trial_days: 0
                              renewal_delivery: redeliver
                              reseller_connection_id: null
                              supplier_variant_id: null
                              reseller_sync_stock: false
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 1
                              product_id:
                                type: integer
                                example: 1
                              name:
                                type: string
                                example: Standard
                              description:
                                type: string
                                example: null
                              price:
                                type: string
                                example: '14.99'
                              price_slash:
                                type: string
                                example: null
                              cost:
                                type: string
                                example: '4.50'
                              quantity_min:
                                type: string
                                example: null
                              quantity_max:
                                type: string
                                example: null
                              volume_discounts:
                                type: string
                                example: null
                              disable_volume_discounts_if_coupon:
                                type: boolean
                                example: false
                              serial_selection_method:
                                type: string
                                example: random
                              dynamic_url:
                                type: string
                                example: null
                              redirect_url:
                                type: string
                                example: null
                              stock:
                                type: integer
                                example: 3
                              instructions:
                                type: string
                                example: null
                              disabled_payment_method_ids:
                                type: string
                                example: null
                              order:
                                type: integer
                                example: 0
                              subscription_mode:
                                type: string
                                example: disabled
                              recurring_price:
                                type: string
                                example: null
                              recurring_interval:
                                type: string
                                example: null
                              recurring_interval_count:
                                type: integer
                                example: 1
                              recurring_trial_days:
                                type: integer
                                example: 0
                              renewal_delivery:
                                type: string
                                example: redeliver
                              reseller_connection_id:
                                type: string
                                example: null
                              supplier_variant_id:
                                type: string
                                example: null
                              reseller_sync_stock:
                                type: boolean
                                example: false
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/products?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/products?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/products?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/products'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - name
                    - price
                    - stock
                    - products_sold
                    - dashboard_order
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                type:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - variant
                    - addon
                ids:
                  type: array
                  description: 'Filter by product IDs.'
                  example: null
                  items:
                    type: integer
                paths:
                  type: array
                  description: 'Filter by product paths.'
                  example: null
                  items:
                    type: string
                name:
                  type: string
                  description: 'Filter by product name.'
                  example: null
                variant_name:
                  type: string
                  description: 'Filter by variant name.'
                  example: null
                visibilities:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                group_ids:
                  type: array
                  description: 'Filter by group IDs.'
                  example: null
                  items:
                    type: integer
                group_null:
                  type: boolean
                  description: 'Only products without a group.'
                  example: null
                badge_text:
                  type: string
                  description: ''
                  example: null
                status_text:
                  type: string
                  description: ''
                  example: null
                deliverable:
                  type: string
                  description: 'Filter by deliverable content.'
                  example: null
                deliverables_type:
                  type: string
                  description: ''
                  example: null
                all:
                  type: string
                  description: 'Include all relation data (variants, badges, tabs, custom fields, addons, upsells).'
                  example: null
    post:
      summary: 'Create Product'
      operationId: createProduct
      description: 'Creates a new product.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Products
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                type:
                  type: string
                  description: ''
                  example: addon
                  enum:
                    - variant
                    - addon
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: asyzwszwtxpeqqi
                path:
                  type: string
                  description: 'Must match the regex /^[a-z0-9-]+$/.'
                  example: '8'
                category_id:
                  type: string
                  description: ''
                  example: null
                description:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: 'Accusamus nihil repellat vero omnis voluptates id amet et.'
                meta_title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: qikymwkiinfowtz
                meta_description:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: mixkolowyuffszf
                meta_image_id:
                  type: string
                  description: ''
                  example: null
                meta_twitter_card:
                  type: string
                  description: ''
                  example: summary_large_image
                  enum:
                    - summary
                    - summary_large_image
                instructions:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: csnwwxvxezhebdr
                out_of_stock_message:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: xkpiypmuihrdife
                thank_you_message:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: kzagqzitsslufxb
                currency:
                  type: string
                  description: 'Must not be greater than 3 characters.'
                  example: 'on'
                tax_inclusive:
                  type: boolean
                  description: ''
                  example: false
                deliverables_type:
                  type: string
                  description: ''
                  example: serials
                  enum:
                    - serials
                    - service
                    - files
                    - dynamic
                    - physical
                requires_fulfillment:
                  type: boolean
                  description: ''
                  example: false
                custom_fields_after_payment:
                  type: boolean
                  description: ''
                  example: true
                group_id:
                  type: string
                  description: ''
                  example: null
                image_ids:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                visibility:
                  type: string
                  description: ''
                  example: on_hold
                  enum:
                    - public
                    - unlisted
                    - private
                    - on_hold
                discord_required:
                  type: boolean
                  description: ''
                  example: false
                hide_stock_count:
                  type: boolean
                  description: ''
                  example: true
                cashback_percentage:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 14
                status_color:
                  type: string
                  description: 'Must not be greater than 24 characters.'
                  example: acixfxgsmpbolp
                status_text:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: wypthgxnkysmpob
                show_views_count:
                  type: boolean
                  description: ''
                  example: false
                show_sales_count:
                  type: boolean
                  description: ''
                  example: false
                show_sales_notifications:
                  type: boolean
                  description: ''
                  example: true
                sales_count_hours:
                  type: number
                  description: ''
                  example: 6.5279
                feedback_coupon_config:
                  type: object
                  description: ''
                  example: null
                  properties:
                    min_rating:
                      type: integer
                      description: 'This field is required when <code>feedback_coupon_config</code> is present. Must be at least 1. Must not be greater than 5.'
                      example: 5
                    discount:
                      type: number
                      description: 'This field is required when <code>feedback_coupon_config</code> is present. Must be at least 0.01. Must not be greater than 999999.'
                      example: 22
                    type:
                      type: string
                      description: 'This field is required when <code>feedback_coupon_config</code> is present.'
                      example: fixed
                      enum:
                        - percentage
                        - fixed
                    expiration_days:
                      type: integer
                      description: 'Must be at least 1. Must not be greater than 3650.'
                      example: 25
                    min_invoice_price:
                      type: number
                      description: 'Must be at least 0. Must not be greater than 999999.'
                      example: 22
                    disable_if_volume_discount:
                      type: boolean
                      description: ''
                      example: true
                    disable_if_bundle_offer:
                      type: boolean
                      description: ''
                      example: true
                    disable_if_quantity_deal:
                      type: boolean
                      description: ''
                      example: false
                    show_discount:
                      type: boolean
                      description: ''
                      example: true
                deliverables_label:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: qqikymwkiinfowt
                metadata:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: zmixkolowyuffsz
                is_mandatory:
                  type: boolean
                  description: ''
                  example: false
                custom_fields:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
                product_tabs:
                  type: array
                  description: 'Must not have more than 10 items.'
                  example: asyzws
                  items:
                    type: string
                product_badges:
                  type: array
                  description: 'Must not have more than 10 items.'
                  example: zwtxpe
                  items:
                    type: string
                product_addons:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
                product_upsells:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
                variants:
                  type: array
                  description: 'This field is required when <code>type</code> is <code>variant</code>. Must have at least 1 items.'
                  example: asyzwszwtxpeqqikymwkiinfowtzmixkolowyuffszfrcsnwwxvxe
                  items:
                    type: string
              required:
                - type
                - name
                - currency
                - visibility
                - product_addons
                - product_upsells
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/sort':
    put:
      summary: 'Update Product and Group Order'
      operationId: updateProductAndGroupOrder
      description: 'Updates the order of products and groups.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                sortedIds:
                  type: string
                  description: ''
                  example: null
                groupProducts:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/dashboard-sort':
    put:
      summary: 'Update Product Dashboard Order'
      operationId: updateProductDashboardOrder
      description: 'Updates the order products are listed in within the dashboard. Does not affect the storefront.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                sortedIds:
                  type: string
                  description: ''
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/{productId}':
    get:
      summary: 'Get Product'
      operationId: getProduct
      description: 'Retrieves a product.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  metadata: null
                  feedback_coupon_config: null
                  salt: 1e597cc8693cc
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  name: 'License Keys'
                  path: null
                  description: 'Instant delivery of software license keys.'
                  meta_title: null
                  meta_description: null
                  meta_image_id: null
                  meta_twitter_card: summary_large_image
                  price: '14.99'
                  price_slash: null
                  currency: USD
                  tax_inclusive: true
                  payment_methods: null
                  deliverables: null
                  deliverables_type: serials
                  requires_fulfillment: false
                  serial_selection_method: null
                  dynamic_url: null
                  stock: null
                  group_id: 1
                  category_id: 1
                  shop_id: 1
                  volume_discounts: null
                  disable_volume_discounts_if_coupon: 0
                  type: variant
                  instructions: null
                  out_of_stock_message: null
                  thank_you_message: null
                  custom_fields_after_payment: false
                  sort_priority: 0
                  group_sort_priority: 0
                  dashboard_order: null
                  visibility: public
                  cloudflare_image_id: null
                  deleted_at: null
                  terminated_at: null
                  quantity_min: null
                  quantity_max: null
                  discord_required: false
                  discord_guild_id: null
                  discord_role_id: null
                  block_vpn: 0
                  hide_stock_count: false
                  status_color: null
                  status_text: null
                  products_sold: 0
                  show_views_count: false
                  show_sales_count: false
                  show_sales_notifications: false
                  sales_count_hours: null
                  deliverables_label: null
                  affiliate_percentage: null
                  is_mandatory: false
                  reseller_enabled: 1
                  reseller_disable_volume_discount: 0
                  cashback_percentage: null
                  stock_count: 3
                  images:
                    -
                      id: 1
                      cloudflare_image_id: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                      shop_id: 1
                      url: 'http://static.mysellauth.test/storage/images/1.webp'
                      pivot:
                        product_id: 1
                        image_id: 1
                        order: 0
                  variants:
                    -
                      id: 1
                      product_id: 1
                      name: Standard
                      description: null
                      price: '14.99'
                      price_slash: null
                      cost: '4.50'
                      quantity_min: null
                      quantity_max: null
                      volume_discounts: null
                      disable_volume_discounts_if_coupon: false
                      serial_selection_method: random
                      dynamic_url: null
                      redirect_url: null
                      stock: 3
                      instructions: null
                      disabled_payment_method_ids: null
                      order: 0
                      subscription_mode: disabled
                      recurring_price: null
                      recurring_interval: null
                      recurring_interval_count: 1
                      recurring_trial_days: 0
                      renewal_delivery: redeliver
                      reseller_connection_id: null
                      supplier_variant_id: null
                      reseller_sync_stock: false
                      discord_roles: []
                      files: []
                  product_tabs: []
                  custom_fields: []
                  product_badges: []
                  product_addons: []
                  product_upsells: []
                properties:
                  id:
                    type: integer
                    example: 1
                  metadata:
                    type: string
                    example: null
                  feedback_coupon_config:
                    type: string
                    example: null
                  salt:
                    type: string
                    example: 1e597cc8693cc
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  name:
                    type: string
                    example: 'License Keys'
                  path:
                    type: string
                    example: null
                  description:
                    type: string
                    example: 'Instant delivery of software license keys.'
                  meta_title:
                    type: string
                    example: null
                  meta_description:
                    type: string
                    example: null
                  meta_image_id:
                    type: string
                    example: null
                  meta_twitter_card:
                    type: string
                    example: summary_large_image
                  price:
                    type: string
                    example: '14.99'
                  price_slash:
                    type: string
                    example: null
                  currency:
                    type: string
                    example: USD
                  tax_inclusive:
                    type: boolean
                    example: true
                  payment_methods:
                    type: string
                    example: null
                  deliverables:
                    type: string
                    example: null
                  deliverables_type:
                    type: string
                    example: serials
                  requires_fulfillment:
                    type: boolean
                    example: false
                  serial_selection_method:
                    type: string
                    example: null
                  dynamic_url:
                    type: string
                    example: null
                  stock:
                    type: string
                    example: null
                  group_id:
                    type: integer
                    example: 1
                  category_id:
                    type: integer
                    example: 1
                  shop_id:
                    type: integer
                    example: 1
                  volume_discounts:
                    type: string
                    example: null
                  disable_volume_discounts_if_coupon:
                    type: integer
                    example: 0
                  type:
                    type: string
                    example: variant
                  instructions:
                    type: string
                    example: null
                  out_of_stock_message:
                    type: string
                    example: null
                  thank_you_message:
                    type: string
                    example: null
                  custom_fields_after_payment:
                    type: boolean
                    example: false
                  sort_priority:
                    type: integer
                    example: 0
                  group_sort_priority:
                    type: integer
                    example: 0
                  dashboard_order:
                    type: string
                    example: null
                  visibility:
                    type: string
                    example: public
                  cloudflare_image_id:
                    type: string
                    example: null
                  deleted_at:
                    type: string
                    example: null
                  terminated_at:
                    type: string
                    example: null
                  quantity_min:
                    type: string
                    example: null
                  quantity_max:
                    type: string
                    example: null
                  discord_required:
                    type: boolean
                    example: false
                  discord_guild_id:
                    type: string
                    example: null
                  discord_role_id:
                    type: string
                    example: null
                  block_vpn:
                    type: integer
                    example: 0
                  hide_stock_count:
                    type: boolean
                    example: false
                  status_color:
                    type: string
                    example: null
                  status_text:
                    type: string
                    example: null
                  products_sold:
                    type: integer
                    example: 0
                  show_views_count:
                    type: boolean
                    example: false
                  show_sales_count:
                    type: boolean
                    example: false
                  show_sales_notifications:
                    type: boolean
                    example: false
                  sales_count_hours:
                    type: string
                    example: null
                  deliverables_label:
                    type: string
                    example: null
                  affiliate_percentage:
                    type: string
                    example: null
                  is_mandatory:
                    type: boolean
                    example: false
                  reseller_enabled:
                    type: integer
                    example: 1
                  reseller_disable_volume_discount:
                    type: integer
                    example: 0
                  cashback_percentage:
                    type: string
                    example: null
                  stock_count:
                    type: integer
                    example: 3
                  images:
                    type: array
                    example:
                      -
                        id: 1
                        cloudflare_image_id: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                        shop_id: 1
                        url: 'http://static.mysellauth.test/storage/images/1.webp'
                        pivot:
                          product_id: 1
                          image_id: 1
                          order: 0
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        cloudflare_image_id:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        deleted_at:
                          type: string
                          example: null
                        shop_id:
                          type: integer
                          example: 1
                        url:
                          type: string
                          example: 'http://static.mysellauth.test/storage/images/1.webp'
                        pivot:
                          type: object
                          properties:
                            product_id:
                              type: integer
                              example: 1
                            image_id:
                              type: integer
                              example: 1
                            order:
                              type: integer
                              example: 0
                  variants:
                    type: array
                    example:
                      -
                        id: 1
                        product_id: 1
                        name: Standard
                        description: null
                        price: '14.99'
                        price_slash: null
                        cost: '4.50'
                        quantity_min: null
                        quantity_max: null
                        volume_discounts: null
                        disable_volume_discounts_if_coupon: false
                        serial_selection_method: random
                        dynamic_url: null
                        redirect_url: null
                        stock: 3
                        instructions: null
                        disabled_payment_method_ids: null
                        order: 0
                        subscription_mode: disabled
                        recurring_price: null
                        recurring_interval: null
                        recurring_interval_count: 1
                        recurring_trial_days: 0
                        renewal_delivery: redeliver
                        reseller_connection_id: null
                        supplier_variant_id: null
                        reseller_sync_stock: false
                        discord_roles: []
                        files: []
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        product_id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: Standard
                        description:
                          type: string
                          example: null
                        price:
                          type: string
                          example: '14.99'
                        price_slash:
                          type: string
                          example: null
                        cost:
                          type: string
                          example: '4.50'
                        quantity_min:
                          type: string
                          example: null
                        quantity_max:
                          type: string
                          example: null
                        volume_discounts:
                          type: string
                          example: null
                        disable_volume_discounts_if_coupon:
                          type: boolean
                          example: false
                        serial_selection_method:
                          type: string
                          example: random
                        dynamic_url:
                          type: string
                          example: null
                        redirect_url:
                          type: string
                          example: null
                        stock:
                          type: integer
                          example: 3
                        instructions:
                          type: string
                          example: null
                        disabled_payment_method_ids:
                          type: string
                          example: null
                        order:
                          type: integer
                          example: 0
                        subscription_mode:
                          type: string
                          example: disabled
                        recurring_price:
                          type: string
                          example: null
                        recurring_interval:
                          type: string
                          example: null
                        recurring_interval_count:
                          type: integer
                          example: 1
                        recurring_trial_days:
                          type: integer
                          example: 0
                        renewal_delivery:
                          type: string
                          example: redeliver
                        reseller_connection_id:
                          type: string
                          example: null
                        supplier_variant_id:
                          type: string
                          example: null
                        reseller_sync_stock:
                          type: boolean
                          example: false
                        discord_roles:
                          type: array
                          example: []
                        files:
                          type: array
                          example: []
                  product_tabs:
                    type: array
                    example: []
                  custom_fields:
                    type: array
                    example: []
                  product_badges:
                    type: array
                    example: []
                  product_addons:
                    type: array
                    example: []
                  product_upsells:
                    type: array
                    example: []
      tags:
        - Products
    delete:
      summary: 'Delete Product'
      operationId: deleteProduct
      description: 'Deletes a product.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Products
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: productId
        description: 'The product ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/{productId}/update':
    put:
      summary: 'Update Product'
      operationId: updateProduct
      description: 'Updates a product.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Products
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                type:
                  type: string
                  description: ''
                  example: addon
                  enum:
                    - variant
                    - addon
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: asyzwszwtxpeqqi
                path:
                  type: string
                  description: 'Must match the regex /^[a-z0-9-]+$/.'
                  example: '8'
                category_id:
                  type: string
                  description: ''
                  example: null
                description:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: 'Accusamus nihil repellat vero omnis voluptates id amet et.'
                meta_title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: qikymwkiinfowtz
                meta_description:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: mixkolowyuffszf
                meta_image_id:
                  type: string
                  description: ''
                  example: null
                meta_twitter_card:
                  type: string
                  description: ''
                  example: summary_large_image
                  enum:
                    - summary
                    - summary_large_image
                instructions:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: csnwwxvxezhebdr
                out_of_stock_message:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: xkpiypmuihrdife
                thank_you_message:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: kzagqzitsslufxb
                currency:
                  type: string
                  description: 'Must not be greater than 3 characters.'
                  example: 'on'
                tax_inclusive:
                  type: boolean
                  description: ''
                  example: false
                deliverables_type:
                  type: string
                  description: ''
                  example: serials
                  enum:
                    - serials
                    - service
                    - files
                    - dynamic
                    - physical
                requires_fulfillment:
                  type: boolean
                  description: ''
                  example: false
                custom_fields_after_payment:
                  type: boolean
                  description: ''
                  example: true
                group_id:
                  type: string
                  description: ''
                  example: null
                image_ids:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                visibility:
                  type: string
                  description: ''
                  example: on_hold
                  enum:
                    - public
                    - unlisted
                    - private
                    - on_hold
                discord_required:
                  type: boolean
                  description: ''
                  example: false
                hide_stock_count:
                  type: boolean
                  description: ''
                  example: true
                cashback_percentage:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 14
                reseller_enabled:
                  type: boolean
                  description: ''
                  example: false
                reseller_disable_volume_discount:
                  type: boolean
                  description: ''
                  example: false
                status_color:
                  type: string
                  description: 'Must not be greater than 24 characters.'
                  example: ixfxgsmpbolpwy
                status_text:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pthgxnkysmpobtn
                show_views_count:
                  type: boolean
                  description: ''
                  example: true
                show_sales_count:
                  type: boolean
                  description: ''
                  example: true
                show_sales_notifications:
                  type: boolean
                  description: ''
                  example: false
                sales_count_hours:
                  type: number
                  description: ''
                  example: 6.5279
                feedback_coupon_config:
                  type: object
                  description: ''
                  example: null
                  properties:
                    min_rating:
                      type: integer
                      description: 'This field is required when <code>feedback_coupon_config</code> is present. Must be at least 1. Must not be greater than 5.'
                      example: 5
                    discount:
                      type: number
                      description: 'This field is required when <code>feedback_coupon_config</code> is present. Must be at least 0.01. Must not be greater than 999999.'
                      example: 22
                    type:
                      type: string
                      description: 'This field is required when <code>feedback_coupon_config</code> is present.'
                      example: fixed
                      enum:
                        - percentage
                        - fixed
                    expiration_days:
                      type: number
                      description: 'Must be at least 0.25. Must not be greater than 3650.'
                      example: 25
                    min_invoice_price:
                      type: number
                      description: 'Must be at least 0. Must not be greater than 999999.'
                      example: 22
                    disable_if_volume_discount:
                      type: boolean
                      description: ''
                      example: true
                    disable_if_bundle_offer:
                      type: boolean
                      description: ''
                      example: true
                    disable_if_quantity_deal:
                      type: boolean
                      description: ''
                      example: false
                    show_discount:
                      type: boolean
                      description: ''
                      example: true
                deliverables_label:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: qqikymwkiinfowt
                metadata:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: zmixkolowyuffsz
                is_mandatory:
                  type: boolean
                  description: ''
                  example: false
                custom_fields:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
                product_tabs:
                  type: array
                  description: 'Must not have more than 10 items.'
                  example: asyzws
                  items:
                    type: string
                product_badges:
                  type: array
                  description: 'Must not have more than 10 items.'
                  example: zwtxpe
                  items:
                    type: string
                product_addons:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
                product_upsells:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
                variants:
                  type: array
                  description: 'This field is required when <code>type</code> is <code>variant</code>. Must have at least 1 items.'
                  example: asyzwszwtxpeqqikymwkiinfowtzmixkolowyuffszfrcsnwwxvxe
                  items:
                    type: string
              required:
                - type
                - name
                - currency
                - visibility
                - product_addons
                - product_upsells
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: productId
        description: 'The product ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/{productId}/clone':
    post:
      summary: 'Clone Product'
      operationId: cloneProduct
      description: 'Clones a product.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Products
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: productId
        description: ''
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/{productId}/stock/{variantId}':
    put:
      summary: 'Update Stock'
      operationId: updateStock
      description: 'Updates the stock count of a service or dynamic product variant.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Products
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: productId
        description: 'The product ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: variantId
        description: 'The variant ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/{productId}/deliverables/{variantId}':
    get:
      summary: 'Get Deliverables'
      operationId: getDeliverables
      description: 'Retrieves the deliverables for a product or variant.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
                example:
                  - KEY-AAAA-1111-XXXX
                  - KEY-BBBB-2222-YYYY
                  - KEY-CCCC-3333-ZZZZ
      tags:
        - Products
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: productId
        description: 'The product ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: variantId
        description: 'The variant ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/{productId}/deliverables/append/{variantId}':
    put:
      summary: 'Append Deliverables'
      operationId: appendDeliverables
      description: 'Appends deliverables to a product or variant.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Products
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deliverables:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
              required:
                - deliverables
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: productId
        description: 'The product ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: variantId
        description: 'The variant ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/{productId}/deliverables/overwrite/{variantId}':
    put:
      summary: 'Overwrite Deliverables'
      operationId: overwriteDeliverables
      description: 'Overwrites deliverables for a product or variant.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Products
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deliverables:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
                confirm_empty:
                  type: boolean
                  description: ''
                  example: false
              required:
                - deliverables
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: productId
        description: 'The product ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: variantId
        description: 'The variant ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/disabled-payment-methods':
    put:
      summary: 'Bulk Update Disabled Payment Methods'
      operationId: bulkUpdateDisabledPaymentMethods
      description: 'Bulk updates disabled payment methods for products.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                disabled_payment_method_ids:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/custom-fields':
    put:
      summary: 'Bulk Update Custom Fields'
      operationId: bulkUpdateCustomFields
      description: 'Bulk updates custom fields for products.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                custom_fields:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/addons':
    put:
      summary: 'Bulk Update Addons'
      operationId: bulkUpdateAddons
      description: 'Bulk updates addons for products.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                product_addons:
                  type: object
                  description: ''
                  example: null
                  properties: {  }
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/upsells':
    put:
      summary: 'Bulk Update Upsells'
      operationId: bulkUpdateUpsells
      description: 'Bulk updates upsells for products.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                product_upsells:
                  type: object
                  description: ''
                  example: null
                  properties: {  }
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/discord-integration':
    put:
      summary: 'Bulk Update Discord Integration'
      operationId: bulkUpdateDiscordIntegration
      description: 'Bulk updates Discord integration for products.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                discord_required:
                  type: boolean
                  description: ''
                  example: true
                discord_roles:
                  type: array
                  description: 'Must not have more than 10 items.'
                  example: yzwszw
                  items:
                    type: string
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/description':
    put:
      summary: 'Bulk Update Description'
      operationId: bulkUpdateDescription
      description: 'Bulk updates product descriptions.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                type:
                  type: string
                  description: ''
                  example: overwrite
                  enum:
                    - overwrite
                    - append
                    - prepend
                description:
                  type: string
                  description: ''
                  example: null
              required:
                - type
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/instructions':
    put:
      summary: 'Bulk Update Instructions'
      operationId: bulkUpdateInstructions
      description: 'Bulk updates product instructions.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                instructions:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: syzwszwtxpeqqik
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/out-of-stock-message':
    put:
      summary: 'Bulk Update Out of Stock Message'
      operationId: bulkUpdateOutOfStockMessage
      description: 'Bulk updates product out of stock message.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                out_of_stock_message:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: syzwszwtxpeqqik
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/thank-you-message':
    put:
      summary: 'Bulk Update Thank You Message'
      operationId: bulkUpdateThankYouMessage
      description: 'Bulk updates product thank you message.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                thank_you_message:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: syzwszwtxpeqqik
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/badges':
    put:
      summary: 'Bulk Update Badges'
      operationId: bulkUpdateBadges
      description: 'Bulk updates product badges.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                type:
                  type: string
                  description: ''
                  example: overwrite
                  enum:
                    - overwrite
                    - append
                    - prepend
                product_badges:
                  type: array
                  description: 'Must not have more than 10 items.'
                  example: yzwszw
                  items:
                    type: string
              required:
                - type
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/status':
    put:
      summary: 'Bulk Update Status'
      operationId: bulkUpdateStatus
      description: 'Bulk updates product status.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                status_color:
                  type: string
                  description: ''
                  example: null
                status_text:
                  type: string
                  description: ''
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/visibility':
    put:
      summary: 'Bulk Update Visibility'
      operationId: bulkUpdateVisibility
      description: 'Bulk updates product visibility.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                visibility:
                  type: string
                  description: ''
                  example: public
                  enum:
                    - public
                    - unlisted
                    - private
                    - on_hold
              required:
                - visibility
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/live-stats':
    put:
      summary: 'Bulk Update Live Stats'
      operationId: bulkUpdateLiveStats
      description: 'Bulk updates product live stats.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                show_views_count:
                  type: boolean
                  description: ''
                  example: true
                show_sales_count:
                  type: boolean
                  description: ''
                  example: true
                show_sales_notifications:
                  type: boolean
                  description: ''
                  example: false
                sales_count_hours:
                  type: number
                  description: ''
                  example: 6.5279
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/feedback-coupon':
    put:
      summary: 'Bulk Update Feedback Coupon'
      operationId: bulkUpdateFeedbackCoupon
      description: 'Bulk updates product feedback coupon.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                feedback_coupon_config:
                  type: object
                  description: ''
                  example: null
                  properties:
                    min_rating:
                      type: integer
                      description: 'This field is required when <code>feedback_coupon_config</code> is present. Must be at least 1. Must not be greater than 5.'
                      example: 4
                    discount:
                      type: number
                      description: 'This field is required when <code>feedback_coupon_config</code> is present. Must be at least 0.01. Must not be greater than 999999.'
                      example: 24
                    type:
                      type: string
                      description: 'This field is required when <code>feedback_coupon_config</code> is present.'
                      example: fixed
                      enum:
                        - percentage
                        - fixed
                    expiration_days:
                      type: integer
                      description: 'Must be at least 1. Must not be greater than 3650.'
                      example: 22
                    min_invoice_price:
                      type: number
                      description: 'Must be at least 0. Must not be greater than 999999.'
                      example: 18
                    disable_if_volume_discount:
                      type: boolean
                      description: ''
                      example: false
                    disable_if_bundle_offer:
                      type: boolean
                      description: ''
                      example: false
                    disable_if_quantity_deal:
                      type: boolean
                      description: ''
                      example: true
                    show_discount:
                      type: boolean
                      description: ''
                      example: true
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/volume-discounts':
    put:
      summary: 'Bulk Update Volume Discounts'
      operationId: bulkUpdateVolumeDiscounts
      description: 'Bulk updates product volume discounts.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                volume_discounts:
                  type: array
                  description: 'Must not have more than 10 items.'
                  example: syzwsz
                  items:
                    type: number
                disable_volume_discounts_if_coupon:
                  type: boolean
                  description: ''
                  example: false
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/redirect-url':
    put:
      summary: 'Bulk Update Redirect URL'
      operationId: bulkUpdateRedirectURL
      description: 'Bulk updates product redirect URL.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                redirect_url:
                  type: string
                  description: 'Must start with one of <code>https</code> Must not be greater than 2048 characters.'
                  example: 'http://watsica.org/nihil-repellat-vero-omnis-voluptates-id-amet-et'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/deliverables-type':
    put:
      summary: 'Bulk Update Deliverables Type'
      operationId: bulkUpdateDeliverablesType
      description: 'Bulk updates product deliverables label.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                deliverables_type:
                  type: string
                  description: ''
                  example: physical
                  enum:
                    - serials
                    - service
                    - files
                    - dynamic
                    - physical
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/deliverables-label':
    put:
      summary: 'Bulk Update Deliverables Label'
      operationId: bulkUpdateDeliverablesLabel
      description: 'Bulk updates product deliverables label.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                deliverables_label:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: syzwszwtxpeqqik
              required:
                - deliverables_label
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/quantity':
    put:
      summary: 'Bulk Update Quantity'
      operationId: bulkUpdateQuantity
      description: 'Bulk updates variant min/max order quantity.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                quantity_min:
                  type: number
                  description: 'Must be at least 1. Must not be greater than 999999.'
                  example: 19
                quantity_max:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 999999.'
                  example: 24
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/serial-selection-method':
    put:
      summary: 'Bulk Update Serial Selection Method'
      operationId: bulkUpdateSerialSelectionMethod
      description: 'Bulk updates variant deliverable selection method.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                serial_selection_method:
                  type: string
                  description: ''
                  example: last
                  enum:
                    - last
                    - first
                    - random
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/currency':
    put:
      summary: 'Bulk Update Currency'
      operationId: bulkUpdateCurrency
      description: 'Bulk updates product currency.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                currency:
                  type: string
                  description: 'Must not be greater than 3 characters.'
                  example: sy
              required:
                - currency
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/cashback-percentage':
    put:
      summary: ''
      operationId: putV1ShopsShopIdProductsBulkUpdateCashbackPercentage
      description: ''
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                cashback_percentage:
                  type: number
                  description: 'NULL = shop default, 0 = disabled, n = override. Must be at least 0. Must not be greater than 100.'
                  example: 19
    parameters:
      -
        in: path
        name: shopId
        description: ''
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-update/hide-stock-count':
    put:
      summary: 'Bulk Update Hide Stock Count'
      operationId: bulkUpdateHideStockCount
      description: 'Bulk updates product stock count visibility.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products updated successfully'
                  updated_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products updated successfully'
                  updated_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                all:
                  type: boolean
                  description: ''
                  example: false
                hide_stock_count:
                  type: boolean
                  description: ''
                  example: true
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/products/bulk-delete':
    post:
      summary: 'Bulk Delete Products'
      operationId: bulkDeleteProducts
      description: 'Bulk deletes products.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Products deleted successfully'
                  deleted_count: 2
                  skipped_count: 0
                  skipped_product_ids: []
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Products deleted successfully'
                  deleted_count:
                    type: integer
                    example: 2
                  skipped_count:
                    type: integer
                    example: 0
                  skipped_product_ids:
                    type: array
                    example: []
      tags:
        - Products
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                product_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/groups':
    get:
      summary: 'Get Groups'
      operationId: getGroups
      description: 'Retrieves the groups.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      metadata: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      name: 'Keys & Serials'
                      shop_id: 1
                      category_id: 1
                      image_id: null
                      sort_priority: 0
                      visibility: public
                      deleted_at: null
                      badge_color: null
                      badge_text: null
                      products:
                        -
                          id: 1
                          group_id: 1
                          name: 'License Keys'
                          stock_count: 0
                      image: null
                      category:
                        id: 1
                        name: 'Digital Goods'
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/groups?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/groups?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/groups?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/groups'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        metadata: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        name: 'Keys & Serials'
                        shop_id: 1
                        category_id: 1
                        image_id: null
                        sort_priority: 0
                        visibility: public
                        deleted_at: null
                        badge_color: null
                        badge_text: null
                        products:
                          -
                            id: 1
                            group_id: 1
                            name: 'License Keys'
                            stock_count: 0
                        image: null
                        category:
                          id: 1
                          name: 'Digital Goods'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        metadata:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        name:
                          type: string
                          example: 'Keys & Serials'
                        shop_id:
                          type: integer
                          example: 1
                        category_id:
                          type: integer
                          example: 1
                        image_id:
                          type: string
                          example: null
                        sort_priority:
                          type: integer
                          example: 0
                        visibility:
                          type: string
                          example: public
                        deleted_at:
                          type: string
                          example: null
                        badge_color:
                          type: string
                          example: null
                        badge_text:
                          type: string
                          example: null
                        products:
                          type: array
                          example:
                            -
                              id: 1
                              group_id: 1
                              name: 'License Keys'
                              stock_count: 0
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 1
                              group_id:
                                type: integer
                                example: 1
                              name:
                                type: string
                                example: 'License Keys'
                              stock_count:
                                type: integer
                                example: 0
                        image:
                          type: string
                          example: null
                        category:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            name:
                              type: string
                              example: 'Digital Goods'
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/groups?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/groups?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/groups?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/groups'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Groups
    post:
      summary: 'Create Group'
      operationId: createGroup
      description: 'Creates a new group.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Groups
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: ''
                  example: culpa
                category_id:
                  type: string
                  description: ''
                  example: null
                image_id:
                  type: string
                  description: ''
                  example: null
                visibility:
                  type: string
                  description: ''
                  example: unlisted
                  enum:
                    - public
                    - unlisted
                    - private
                products:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
                badge_color:
                  type: string
                  description: ''
                  example: null
                badge_text:
                  type: string
                  description: ''
                  example: null
                metadata:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: asyzwszwtxpeqqi
                apply_category_to_products:
                  type: boolean
                  description: ''
                  example: true
              required:
                - name
                - visibility
                - products
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/groups/{groupId}':
    get:
      summary: 'Get Group'
      operationId: getGroup
      description: 'Retrieves a specific group.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  metadata: null
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  name: 'Keys & Serials'
                  shop_id: 1
                  category_id: 1
                  image_id: null
                  sort_priority: 0
                  visibility: public
                  deleted_at: null
                  badge_color: null
                  badge_text: null
                  products:
                    -
                      id: 1
                      group_id: 1
                      group_sort_priority: 0
                      stock_count: 0
                properties:
                  id:
                    type: integer
                    example: 1
                  metadata:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  name:
                    type: string
                    example: 'Keys & Serials'
                  shop_id:
                    type: integer
                    example: 1
                  category_id:
                    type: integer
                    example: 1
                  image_id:
                    type: string
                    example: null
                  sort_priority:
                    type: integer
                    example: 0
                  visibility:
                    type: string
                    example: public
                  deleted_at:
                    type: string
                    example: null
                  badge_color:
                    type: string
                    example: null
                  badge_text:
                    type: string
                    example: null
                  products:
                    type: array
                    example:
                      -
                        id: 1
                        group_id: 1
                        group_sort_priority: 0
                        stock_count: 0
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        group_id:
                          type: integer
                          example: 1
                        group_sort_priority:
                          type: integer
                          example: 0
                        stock_count:
                          type: integer
                          example: 0
      tags:
        - Groups
    delete:
      summary: 'Delete Group'
      operationId: deleteGroup
      description: 'Deletes a specific group.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Groups
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: groupId
        description: 'The group ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/groups/{groupId}/update':
    put:
      summary: 'Update Group'
      operationId: updateGroup
      description: 'Updates a specific group.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Groups
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: ''
                  example: culpa
                category_id:
                  type: string
                  description: ''
                  example: null
                image_id:
                  type: string
                  description: ''
                  example: null
                visibility:
                  type: string
                  description: ''
                  example: unlisted
                  enum:
                    - public
                    - unlisted
                    - private
                products:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
                badge_color:
                  type: string
                  description: ''
                  example: null
                badge_text:
                  type: string
                  description: ''
                  example: null
                metadata:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: asyzwszwtxpeqqi
                apply_category_to_products:
                  type: boolean
                  description: ''
                  example: true
              required:
                - name
                - visibility
                - products
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: groupId
        description: 'The group ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/categories':
    get:
      summary: 'Get Categories'
      operationId: getCategories
      description: 'Retrieves the categories.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      metadata: null
                      shop_id: 1
                      parent_id: null
                      name: 'Digital Goods'
                      path: digital-goods
                      description: null
                      image_id: null
                      meta_title: null
                      meta_description: null
                      color: null
                      order: 0
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/categories?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/categories?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/categories?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/categories'
                  per_page: 1
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        metadata: null
                        shop_id: 1
                        parent_id: null
                        name: 'Digital Goods'
                        path: digital-goods
                        description: null
                        image_id: null
                        meta_title: null
                        meta_description: null
                        color: null
                        order: 0
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        metadata:
                          type: string
                          example: null
                        shop_id:
                          type: integer
                          example: 1
                        parent_id:
                          type: string
                          example: null
                        name:
                          type: string
                          example: 'Digital Goods'
                        path:
                          type: string
                          example: digital-goods
                        description:
                          type: string
                          example: null
                        image_id:
                          type: string
                          example: null
                        meta_title:
                          type: string
                          example: null
                        meta_description:
                          type: string
                          example: null
                        color:
                          type: string
                          example: null
                        order:
                          type: integer
                          example: 0
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        deleted_at:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/categories?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/categories?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/categories?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/categories'
                  per_page:
                    type: integer
                    example: 1
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Categories
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: ''
                  example: 12
                perPage:
                  type: integer
                  description: 'Must be at least 1. Must not be greater than 100.'
                  example: 1
                orderColumn:
                  type: string
                  description: ''
                  example: updated_at
                  enum:
                    - id
                    - parent_id
                    - name
                    - created_at
                    - updated_at
                orderDirection:
                  type: string
                  description: ''
                  example: asc
                  enum:
                    - asc
                    - desc
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: zwszwtxpeqqikym
                parent_id:
                  type: string
                  description: ''
                  example: null
    post:
      summary: 'Create Category'
      operationId: createCategory
      description: 'Creates a new category.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Categories
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                parent_id:
                  type: string
                  description: ''
                  example: null
                path:
                  type: string
                  description: 'Must match the regex /^[a-z0-9-]+$/.'
                  example: '8'
                description:
                  type: string
                  description: 'Must not be greater than 1000 characters.'
                  example: 'Accusamus nihil repellat vero omnis voluptates id amet et.'
                image_id:
                  type: string
                  description: ''
                  example: null
                meta_title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: qikymwkiinfowtz
                meta_description:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: mixkolowyuffszf
                color:
                  type: string
                  description: 'Must not be greater than 7 characters.'
                  example: rcsnw
                order:
                  type: integer
                  description: ''
                  example: 12
                metadata:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: asyzwszwtxpeqqi
              required:
                - name
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/categories/{categoryId}':
    get:
      summary: 'Get Category'
      operationId: getCategory
      description: 'Retrieves a specific category.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  metadata: null
                  shop_id: 1
                  parent_id: null
                  name: 'Digital Goods'
                  path: digital-goods
                  description: null
                  image_id: null
                  meta_title: null
                  meta_description: null
                  color: null
                  order: 0
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  deleted_at: null
                properties:
                  id:
                    type: integer
                    example: 1
                  metadata:
                    type: string
                    example: null
                  shop_id:
                    type: integer
                    example: 1
                  parent_id:
                    type: string
                    example: null
                  name:
                    type: string
                    example: 'Digital Goods'
                  path:
                    type: string
                    example: digital-goods
                  description:
                    type: string
                    example: null
                  image_id:
                    type: string
                    example: null
                  meta_title:
                    type: string
                    example: null
                  meta_description:
                    type: string
                    example: null
                  color:
                    type: string
                    example: null
                  order:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  deleted_at:
                    type: string
                    example: null
      tags:
        - Categories
    delete:
      summary: 'Delete Category'
      operationId: deleteCategory
      description: 'Deletes a specific category.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Categories
    put:
      summary: 'Update Category'
      operationId: updateCategory
      description: 'Updates a specific category.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Categories
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: integer
                  description: ''
                  example: 12
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: asyzwszwtxpeqqi
                parent_id:
                  type: string
                  description: ''
                  example: null
                path:
                  type: string
                  description: 'Must match the regex /^[a-z0-9-]+$/.'
                  example: '8'
                description:
                  type: string
                  description: 'Must not be greater than 1000 characters.'
                  example: 'Accusamus nihil repellat vero omnis voluptates id amet et.'
                image_id:
                  type: string
                  description: ''
                  example: null
                meta_title:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: qikymwkiinfowtz
                meta_description:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: mixkolowyuffszf
                color:
                  type: string
                  description: 'Must not be greater than 7 characters.'
                  example: rcsnw
                order:
                  type: integer
                  description: ''
                  example: 12
                metadata:
                  type: string
                  description: 'Must not be greater than 65535 characters.'
                  example: asyzwszwtxpeqqi
              required:
                - id
                - name
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: categoryId
        description: 'The category ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/categories/reorder':
    post:
      summary: 'Reorder Categories'
      operationId: reorderCategories
      description: 'Reorders categories and updates their parent relationships.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Categories
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                categories:
                  type: array
                  description: 'Must have at least 1 items.'
                  example: pasyzwszwtxpeqqikymwkiinfowtzmixkolowyuffszfrcsnwwxvx
                  items:
                    type: integer
              required:
                - categories
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/images':
    get:
      summary: 'Get Images'
      operationId: getImages
      description: 'Retrieves the images.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    id: 1
                    cloudflare_image_id: null
                    created_at: '2026-08-28T18:23:02.000000Z'
                    updated_at: '2026-08-28T18:23:02.000000Z'
                    deleted_at: null
                    shop_id: 1
                    url: 'http://static.mysellauth.test/storage/images/1.webp'
      tags:
        - Images
    post:
      summary: 'Create Image'
      operationId: createImage
      description: 'Uploads an image.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Images
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                image:
                  type: string
                  description: ''
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/images/bulk-delete':
    post:
      summary: 'Bulk Delete Images'
      operationId: bulkDeleteImages
      description: 'Deletes images in bulk.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Images
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                image_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/images/{imageId}':
    delete:
      summary: 'Delete Image'
      operationId: deleteImage
      description: 'Deletes an image.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Images
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: imageId
        description: ''
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/downloadable-files':
    get:
      summary: 'Get Files'
      operationId: getFiles
      description: 'Retrieves the downloadable files for a shop.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    id: 3f2504e0-4f89-41d3-9a0c-0305e82c3301
                    shop_id: 1
                    display_name: installer.zip
                    mime_type: application/zip
                    disk: local
                    path: downloadable-files/3f2504e0-4f89-41d3-9a0c-0305e82c3301.zip
                    size: 1048576
                    created_at: '2026-08-28T18:23:02.000000Z'
                    updated_at: '2026-08-28T18:23:02.000000Z'
                    deleted_at: null
                    products: []
      tags:
        - 'Downloadable Files'
    post:
      summary: 'Create File'
      operationId: createFile
      description: 'Uploads a downloadable file.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Downloadable Files'
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                  description: 'Must be a file.'
                display_name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
              required:
                - file
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/downloadable-files/bulk-delete':
    post:
      summary: 'Bulk Delete Files'
      operationId: bulkDeleteFiles
      description: 'Deletes downloadable files in bulk.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Downloadable Files'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                file_ids:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/downloadable-files/{fileId}':
    delete:
      summary: 'Delete File'
      operationId: deleteFile
      description: 'Deletes a downloadable file.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Downloadable Files'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: fileId
        description: ''
        example: 3f2504e0-4f89-41d3-9a0c-0305e82c3301
        required: true
        schema:
          type: string
  '/v1/shops/{shopId}/custom-fields':
    get:
      summary: 'Get Custom Fields'
      operationId: getCustomFields
      description: 'Retrieves the custom fields.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      name: 'Discord Username'
                      placeholder: null
                      hint: null
                      type: text
                      options: null
                      default: null
                      regex: null
                      is_required: false
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/custom-fields?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/custom-fields?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/custom-fields?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/custom-fields'
                  per_page: 10
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        name: 'Discord Username'
                        placeholder: null
                        hint: null
                        type: text
                        options: null
                        default: null
                        regex: null
                        is_required: false
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'Discord Username'
                        placeholder:
                          type: string
                          example: null
                        hint:
                          type: string
                          example: null
                        type:
                          type: string
                          example: text
                        options:
                          type: string
                          example: null
                        default:
                          type: string
                          example: null
                        regex:
                          type: string
                          example: null
                        is_required:
                          type: boolean
                          example: false
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/custom-fields?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/custom-fields?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/custom-fields?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/custom-fields'
                  per_page:
                    type: integer
                    example: 10
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - 'Custom Fields'
    post:
      summary: 'Create Custom Field'
      operationId: createCustomField
      description: 'Creates a new custom field.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Custom Fields'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                placeholder:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: ikymwkiinfowtzm
                hint:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: ixkolowyuffszfr
                type:
                  type: string
                  description: ''
                  example: textarea
                  enum:
                    - text
                    - textarea
                    - checkbox
                    - select
                options:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: snwwxvxezhebdrx
                default:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: kpiypmuihrdifek
                regex:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: zagqzitsslufxbo
                is_required:
                  type: boolean
                  description: ''
                  example: true
              required:
                - name
                - type
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/custom-fields/{customFieldId}':
    put:
      summary: 'Update Custom Field'
      operationId: updateCustomField
      description: 'Updates an existing custom field.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Custom Fields'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                placeholder:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: ikymwkiinfowtzm
                hint:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: ixkolowyuffszfr
                type:
                  type: string
                  description: ''
                  example: textarea
                  enum:
                    - text
                    - textarea
                    - checkbox
                    - select
                options:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: snwwxvxezhebdrx
                default:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: kpiypmuihrdifek
                regex:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: zagqzitsslufxbo
                is_required:
                  type: boolean
                  description: ''
                  example: true
              required:
                - name
                - type
    delete:
      summary: 'Delete Custom Field'
      operationId: deleteCustomField
      description: 'Deletes a custom field.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Custom Fields'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customFieldId
        description: 'The custom field ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/quantity-deals':
    get:
      summary: 'Get Quantity Deals'
      operationId: getQuantityDeals
      description: 'Retrieves a paginated list of quantity deals.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      name: 'Bulk Discount'
                      product_id: 1
                      variant_id: 1
                      buy_quantity: 5
                      discounted_quantity: 5
                      percentage: '10.00'
                      max_uses_per_cart: null
                      priority: 0
                      starts_at: null
                      ends_at: null
                      enabled: true
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      product:
                        id: 1
                        name: 'License Keys'
                        stock_count: 0
                      variant:
                        id: 1
                        name: Standard
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/quantity-deals?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/quantity-deals?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/quantity-deals?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/quantity-deals'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        name: 'Bulk Discount'
                        product_id: 1
                        variant_id: 1
                        buy_quantity: 5
                        discounted_quantity: 5
                        percentage: '10.00'
                        max_uses_per_cart: null
                        priority: 0
                        starts_at: null
                        ends_at: null
                        enabled: true
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        product:
                          id: 1
                          name: 'License Keys'
                          stock_count: 0
                        variant:
                          id: 1
                          name: Standard
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'Bulk Discount'
                        product_id:
                          type: integer
                          example: 1
                        variant_id:
                          type: integer
                          example: 1
                        buy_quantity:
                          type: integer
                          example: 5
                        discounted_quantity:
                          type: integer
                          example: 5
                        percentage:
                          type: string
                          example: '10.00'
                        max_uses_per_cart:
                          type: string
                          example: null
                        priority:
                          type: integer
                          example: 0
                        starts_at:
                          type: string
                          example: null
                        ends_at:
                          type: string
                          example: null
                        enabled:
                          type: boolean
                          example: true
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        product:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            name:
                              type: string
                              example: 'License Keys'
                            stock_count:
                              type: integer
                              example: 0
                        variant:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            name:
                              type: string
                              example: Standard
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/quantity-deals?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/quantity-deals?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/quantity-deals?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/quantity-deals'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - 'Quantity Deals'
    post:
      summary: 'Create Quantity Deal'
      operationId: createQuantityDeal
      description: 'Creates a new quantity deal.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Quantity Deals'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                product_id:
                  type: integer
                  description: ''
                  example: 12
                variant_id:
                  type: integer
                  description: ''
                  example: 12
                buy_quantity:
                  type: integer
                  description: 'Must be at least 1.'
                  example: 1
                discounted_quantity:
                  type: integer
                  description: 'Must be at least 1.'
                  example: 65
                percentage:
                  type: number
                  description: 'Must be at least 0.01. Must not be greater than 100.'
                  example: 24
                max_uses_per_cart:
                  type: integer
                  description: 'Must be at least 1.'
                  example: 90
                priority:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 79
                starts_at:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                ends_at:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                enabled:
                  type: boolean
                  description: ''
                  example: false
              required:
                - name
                - product_id
                - buy_quantity
                - discounted_quantity
                - percentage
                - enabled
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/quantity-deals/{dealId}':
    get:
      summary: 'Get Quantity Deal'
      operationId: getQuantityDeal
      description: 'Retrieves a specific quantity deal.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  shop_id: 1
                  name: 'Bulk Discount'
                  product_id: 1
                  variant_id: 1
                  buy_quantity: 5
                  discounted_quantity: 5
                  percentage: '10.00'
                  max_uses_per_cart: null
                  priority: 0
                  starts_at: null
                  ends_at: null
                  enabled: true
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  product:
                    id: 1
                    name: 'License Keys'
                    stock_count: 0
                  variant:
                    id: 1
                    name: Standard
                properties:
                  id:
                    type: integer
                    example: 1
                  shop_id:
                    type: integer
                    example: 1
                  name:
                    type: string
                    example: 'Bulk Discount'
                  product_id:
                    type: integer
                    example: 1
                  variant_id:
                    type: integer
                    example: 1
                  buy_quantity:
                    type: integer
                    example: 5
                  discounted_quantity:
                    type: integer
                    example: 5
                  percentage:
                    type: string
                    example: '10.00'
                  max_uses_per_cart:
                    type: string
                    example: null
                  priority:
                    type: integer
                    example: 0
                  starts_at:
                    type: string
                    example: null
                  ends_at:
                    type: string
                    example: null
                  enabled:
                    type: boolean
                    example: true
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  product:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 'License Keys'
                      stock_count:
                        type: integer
                        example: 0
                  variant:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: Standard
      tags:
        - 'Quantity Deals'
    delete:
      summary: 'Delete Quantity Deal'
      operationId: deleteQuantityDeal
      description: 'Deletes a specific quantity deal.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Quantity Deals'
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: dealId
        description: 'The ID of the quantity deal.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/quantity-deals/{dealId}/update':
    put:
      summary: 'Update Quantity Deal'
      operationId: updateQuantityDeal
      description: 'Updates a specific quantity deal.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Quantity Deals'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                product_id:
                  type: integer
                  description: ''
                  example: 12
                variant_id:
                  type: integer
                  description: ''
                  example: 12
                buy_quantity:
                  type: integer
                  description: 'Must be at least 1.'
                  example: 1
                discounted_quantity:
                  type: integer
                  description: 'Must be at least 1.'
                  example: 65
                percentage:
                  type: number
                  description: 'Must be at least 0.01. Must not be greater than 100.'
                  example: 24
                max_uses_per_cart:
                  type: integer
                  description: 'Must be at least 1.'
                  example: 90
                priority:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 79
                starts_at:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                ends_at:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                enabled:
                  type: boolean
                  description: ''
                  example: false
              required:
                - name
                - product_id
                - buy_quantity
                - discounted_quantity
                - percentage
                - enabled
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: dealId
        description: 'The ID of the quantity deal.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/bundle-offers':
    get:
      summary: 'Get Bundle Offers'
      operationId: getBundleOffers
      description: 'Retrieves a paginated list of bundle offers.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      name: 'Starter Bundle'
                      type: percentage
                      discount: '15.00'
                      max_uses_per_cart: null
                      priority: 0
                      starts_at: null
                      ends_at: null
                      enabled: true
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      items: []
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/bundle-offers?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/bundle-offers?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/bundle-offers?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/bundle-offers'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        name: 'Starter Bundle'
                        type: percentage
                        discount: '15.00'
                        max_uses_per_cart: null
                        priority: 0
                        starts_at: null
                        ends_at: null
                        enabled: true
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        items: []
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'Starter Bundle'
                        type:
                          type: string
                          example: percentage
                        discount:
                          type: string
                          example: '15.00'
                        max_uses_per_cart:
                          type: string
                          example: null
                        priority:
                          type: integer
                          example: 0
                        starts_at:
                          type: string
                          example: null
                        ends_at:
                          type: string
                          example: null
                        enabled:
                          type: boolean
                          example: true
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        items:
                          type: array
                          example: []
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/bundle-offers?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/bundle-offers?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/bundle-offers?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/bundle-offers'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - 'Bundle Offers'
    post:
      summary: 'Create Bundle Offer'
      operationId: createBundleOffer
      description: 'Creates a new bundle offer.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Bundle Offers'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                type:
                  type: string
                  description: ''
                  example: percentage
                  enum:
                    - percentage
                    - fixed
                discount:
                  type: number
                  description: 'Must be at least 0.01. Must not be greater than 999999.'
                  example: 10
                max_uses_per_cart:
                  type: integer
                  description: 'Must be at least 1.'
                  example: 85
                priority:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 42
                starts_at:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                ends_at:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                enabled:
                  type: boolean
                  description: ''
                  example: false
                items:
                  type: array
                  description: 'Must have at least 1 items.'
                  example: syzwszwtxpeqqikymwkiinfowtzmixkolowyuffszfrcsnwwxvxez
                  items:
                    type: integer
              required:
                - name
                - type
                - discount
                - enabled
                - items
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/bundle-offers/{offerId}':
    get:
      summary: 'Get Bundle Offer'
      operationId: getBundleOffer
      description: 'Retrieves a specific bundle offer.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  shop_id: 1
                  name: 'Starter Bundle'
                  type: percentage
                  discount: '15.00'
                  max_uses_per_cart: null
                  priority: 0
                  starts_at: null
                  ends_at: null
                  enabled: true
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  items: []
                properties:
                  id:
                    type: integer
                    example: 1
                  shop_id:
                    type: integer
                    example: 1
                  name:
                    type: string
                    example: 'Starter Bundle'
                  type:
                    type: string
                    example: percentage
                  discount:
                    type: string
                    example: '15.00'
                  max_uses_per_cart:
                    type: string
                    example: null
                  priority:
                    type: integer
                    example: 0
                  starts_at:
                    type: string
                    example: null
                  ends_at:
                    type: string
                    example: null
                  enabled:
                    type: boolean
                    example: true
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  items:
                    type: array
                    example: []
      tags:
        - 'Bundle Offers'
    delete:
      summary: 'Delete Bundle Offer'
      operationId: deleteBundleOffer
      description: 'Deletes a specific bundle offer.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Bundle Offers'
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: offerId
        description: 'The ID of the bundle offer.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/bundle-offers/{offerId}/update':
    put:
      summary: 'Update Bundle Offer'
      operationId: updateBundleOffer
      description: 'Updates a specific bundle offer.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Bundle Offers'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                type:
                  type: string
                  description: ''
                  example: percentage
                  enum:
                    - percentage
                    - fixed
                discount:
                  type: number
                  description: 'Must be at least 0.01. Must not be greater than 999999.'
                  example: 10
                max_uses_per_cart:
                  type: integer
                  description: 'Must be at least 1.'
                  example: 85
                priority:
                  type: integer
                  description: 'Must be at least 0.'
                  example: 42
                starts_at:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                ends_at:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                enabled:
                  type: boolean
                  description: ''
                  example: false
                items:
                  type: array
                  description: 'Must have at least 1 items.'
                  example: syzwszwtxpeqqikymwkiinfowtzmixkolowyuffszfrcsnwwxvxez
                  items:
                    type: integer
              required:
                - name
                - type
                - discount
                - enabled
                - items
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: offerId
        description: 'The ID of the bundle offer.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/coupons':
    get:
      summary: 'Get Coupons'
      operationId: getCoupons
      description: 'Retrieves the coupons.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      code: SAVE10
                      global: true
                      discount: '10.00'
                      uses: 0
                      max_uses: null
                      max_uses_per_customer: null
                      min_invoice_price: null
                      allowed_emails: null
                      disable_if_volume_discount: false
                      type: percentage
                      start_date: null
                      expiration_date: null
                      uses_count_mode: pending
                      last_used_at: null
                      total_saved: '0.00'
                      revenue_attributed: '0.00'
                      items: []
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/coupons?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/coupons?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/coupons?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/coupons'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        code: SAVE10
                        global: true
                        discount: '10.00'
                        uses: 0
                        max_uses: null
                        max_uses_per_customer: null
                        min_invoice_price: null
                        allowed_emails: null
                        disable_if_volume_discount: false
                        type: percentage
                        start_date: null
                        expiration_date: null
                        uses_count_mode: pending
                        last_used_at: null
                        total_saved: '0.00'
                        revenue_attributed: '0.00'
                        items: []
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        code:
                          type: string
                          example: SAVE10
                        global:
                          type: boolean
                          example: true
                        discount:
                          type: string
                          example: '10.00'
                        uses:
                          type: integer
                          example: 0
                        max_uses:
                          type: string
                          example: null
                        max_uses_per_customer:
                          type: string
                          example: null
                        min_invoice_price:
                          type: string
                          example: null
                        allowed_emails:
                          type: string
                          example: null
                        disable_if_volume_discount:
                          type: boolean
                          example: false
                        type:
                          type: string
                          example: percentage
                        start_date:
                          type: string
                          example: null
                        expiration_date:
                          type: string
                          example: null
                        uses_count_mode:
                          type: string
                          example: pending
                        last_used_at:
                          type: string
                          example: null
                        total_saved:
                          type: string
                          example: '0.00'
                        revenue_attributed:
                          type: string
                          example: '0.00'
                        items:
                          type: array
                          example: []
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/coupons?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/coupons?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/coupons?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/coupons'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Coupons
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - code
                    - discount
                    - uses
                    - start_date
                    - expiration_date
                    - last_used_at
                    - total_saved
                    - revenue_attributed
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                code:
                  type: string
                  description: 'Filter by coupon code.'
                  example: null
                ids:
                  type: array
                  description: 'Filter by coupon IDs.'
                  example: null
                  items:
                    type: integer
                statuses:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                type:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - percentage
                    - fixed
                global:
                  type: boolean
                  description: 'Only global (all-products) coupons.'
                  example: null
    post:
      summary: 'Create Coupon'
      operationId: createCoupon
      description: 'Creates a new coupon.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Coupons
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                  description: ''
                  example: culpa
                global:
                  type: boolean
                  description: ''
                  example: false
                discount:
                  type: number
                  description: 'Must be at least -999999. Must not be greater than 999999.'
                  example: 19
                type:
                  type: string
                  description: ''
                  example: percentage
                  enum:
                    - percentage
                    - fixed
                max_uses:
                  type: number
                  description: 'Must be at least 1. Must not be greater than 999999.'
                  example: 25
                max_uses_per_customer:
                  type: number
                  description: 'Must be at least 1. Must not be greater than 999999.'
                  example: 22
                min_invoice_price:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 999999.'
                  example: 18
                start_date:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                expiration_date:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>today</code>. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                allowed_emails:
                  type: array
                  description: 'Must be a valid email address.'
                  example:
                    - reichel.zetta@example.net
                  items:
                    type: string
                payment_method_ids:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                disable_if_volume_discount:
                  type: boolean
                  description: ''
                  example: false
                disable_if_quantity_deal:
                  type: boolean
                  description: ''
                  example: false
                disable_if_bundle_offer:
                  type: boolean
                  description: ''
                  example: false
                disable_if_gateway_discount:
                  type: boolean
                  description: ''
                  example: true
                disable_if_affiliate_discount:
                  type: boolean
                  description: ''
                  example: true
                uses_count_mode:
                  type: string
                  description: ''
                  example: paid
                  enum:
                    - pending
                    - paid
                applies_to_renewals:
                  type: boolean
                  description: ''
                  example: true
                items:
                  type: array
                  description: 'This field is required when <code>global</code> is <code>false</code>.'
                  example:
                    - culpa
                  items:
                    type: string
              required:
                - code
                - global
                - discount
                - type
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/coupons/{couponId}':
    get:
      summary: 'Get Coupon'
      operationId: getCoupon
      description: 'Retrieves a specific coupon.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  code: SAVE10
                  salt: da80b07b45688
                  global: true
                  discount: '10.00'
                  uses: 0
                  max_uses: null
                  max_uses_per_customer: null
                  min_invoice_price: null
                  allowed_emails: null
                  payment_method_ids: null
                  disable_if_volume_discount: false
                  disable_if_bundle_offer: false
                  disable_if_quantity_deal: false
                  disable_if_gateway_discount: false
                  disable_if_affiliate_discount: false
                  uses_count_mode: pending
                  type: percentage
                  start_date: null
                  expiration_date: null
                  shop_id: 1
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  applies_to_renewals: false
                  items: []
                properties:
                  id:
                    type: integer
                    example: 1
                  code:
                    type: string
                    example: SAVE10
                  salt:
                    type: string
                    example: da80b07b45688
                  global:
                    type: boolean
                    example: true
                  discount:
                    type: string
                    example: '10.00'
                  uses:
                    type: integer
                    example: 0
                  max_uses:
                    type: string
                    example: null
                  max_uses_per_customer:
                    type: string
                    example: null
                  min_invoice_price:
                    type: string
                    example: null
                  allowed_emails:
                    type: string
                    example: null
                  payment_method_ids:
                    type: string
                    example: null
                  disable_if_volume_discount:
                    type: boolean
                    example: false
                  disable_if_bundle_offer:
                    type: boolean
                    example: false
                  disable_if_quantity_deal:
                    type: boolean
                    example: false
                  disable_if_gateway_discount:
                    type: boolean
                    example: false
                  disable_if_affiliate_discount:
                    type: boolean
                    example: false
                  uses_count_mode:
                    type: string
                    example: pending
                  type:
                    type: string
                    example: percentage
                  start_date:
                    type: string
                    example: null
                  expiration_date:
                    type: string
                    example: null
                  shop_id:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  applies_to_renewals:
                    type: boolean
                    example: false
                  items:
                    type: array
                    example: []
      tags:
        - Coupons
    delete:
      summary: 'Delete Coupon'
      operationId: deleteCoupon
      description: 'Deletes a specific coupon.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Coupons
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: couponId
        description: 'The coupon ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/coupons/used':
    delete:
      summary: 'Delete Used Coupons'
      operationId: deleteUsedCoupons
      description: 'Deletes all used coupons.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Coupons
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/coupons/{couponId}/update':
    put:
      summary: 'Update Coupon'
      operationId: updateCoupon
      description: 'Updates a specific coupon.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Coupons
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                  description: ''
                  example: culpa
                global:
                  type: boolean
                  description: ''
                  example: false
                discount:
                  type: number
                  description: 'Must be at least -999999. Must not be greater than 999999.'
                  example: 19
                type:
                  type: string
                  description: ''
                  example: percentage
                  enum:
                    - percentage
                    - fixed
                max_uses:
                  type: number
                  description: 'Must be at least 1. Must not be greater than 999999.'
                  example: 25
                max_uses_per_customer:
                  type: number
                  description: 'Must be at least 1. Must not be greater than 999999.'
                  example: 22
                min_invoice_price:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 999999.'
                  example: 18
                start_date:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                expiration_date:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>today</code>. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                allowed_emails:
                  type: array
                  description: 'Must be a valid email address.'
                  example:
                    - reichel.zetta@example.net
                  items:
                    type: string
                payment_method_ids:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                disable_if_volume_discount:
                  type: boolean
                  description: ''
                  example: false
                disable_if_quantity_deal:
                  type: boolean
                  description: ''
                  example: false
                disable_if_bundle_offer:
                  type: boolean
                  description: ''
                  example: false
                disable_if_gateway_discount:
                  type: boolean
                  description: ''
                  example: true
                disable_if_affiliate_discount:
                  type: boolean
                  description: ''
                  example: true
                uses_count_mode:
                  type: string
                  description: ''
                  example: paid
                  enum:
                    - pending
                    - paid
                applies_to_renewals:
                  type: boolean
                  description: ''
                  example: true
                items:
                  type: array
                  description: 'This field is required when <code>global</code> is <code>false</code>.'
                  example:
                    - culpa
                  items:
                    type: string
              required:
                - code
                - global
                - discount
                - type
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: couponId
        description: ''
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/shipping-zones':
    get:
      summary: 'Get Shipping Zones'
      operationId: getShippingZones
      description: 'Retrieves the shipping zones for a shop.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    id: 1
                    shop_id: 1
                    name: Worldwide
                    price: '9.99'
                    currency: USD
                    countries: []
                    free_shipping_threshold: null
      tags:
        - 'Shipping Zones'
    post:
      summary: 'Create Shipping Zone'
      operationId: createShippingZone
      description: 'Creates a new shipping zone.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Shipping Zones'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                price:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 99999.'
                  example: 9
                currency:
                  type: string
                  description: 'Must be 3 characters.'
                  example: kym
                countries:
                  type: array
                  description: 'Must be 2 characters.'
                  example:
                    - wk
                  items:
                    type: string
                free_shipping_threshold:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 99999.'
                  example: 8
              required:
                - name
                - price
                - currency
                - countries
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/shipping-zones/{zoneId}':
    get:
      summary: 'Get Shipping Zone'
      operationId: getShippingZone
      description: 'Retrieves a specific shipping zone.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  shop_id: 1
                  name: Worldwide
                  price: '9.99'
                  currency: USD
                  free_shipping_threshold: null
                  countries: []
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  deleted_at: null
                properties:
                  id:
                    type: integer
                    example: 1
                  shop_id:
                    type: integer
                    example: 1
                  name:
                    type: string
                    example: Worldwide
                  price:
                    type: string
                    example: '9.99'
                  currency:
                    type: string
                    example: USD
                  free_shipping_threshold:
                    type: string
                    example: null
                  countries:
                    type: array
                    example: []
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  deleted_at:
                    type: string
                    example: null
      tags:
        - 'Shipping Zones'
    delete:
      summary: 'Delete Shipping Zone'
      operationId: deleteShippingZone
      description: 'Deletes a specific shipping zone.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Shipping Zones'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: zoneId
        description: 'The shipping zone ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/shipping-zones/{zoneId}/update':
    put:
      summary: 'Update Shipping Zone'
      operationId: updateShippingZone
      description: 'Updates a specific shipping zone.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Shipping Zones'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                price:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 99999.'
                  example: 9
                currency:
                  type: string
                  description: 'Must be 3 characters.'
                  example: kym
                countries:
                  type: array
                  description: 'Must be 2 characters.'
                  example:
                    - wk
                  items:
                    type: string
                free_shipping_threshold:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 99999.'
                  example: 8
              required:
                - name
                - price
                - currency
                - countries
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: zoneId
        description: 'The shipping zone ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/checkout':
    post:
      summary: 'Create Checkout Session'
      operationId: createCheckoutSession
      description: 'Creates a checkout session (invoice) server-side and returns the URL to send the buyer to. Requires an API key; call it from your backend, never from a browser. Cart items are either <b>catalog items</b> (<code>productId</code> + <code>variantId</code>) or <b>custom items</b> (<code>name</code> + <code>price</code>, for one-off charges that are not in your catalog); both kinds can be mixed. If you pass both <code>email</code> and a payment method, the invoice is created as <code>pending</code> and a payment session is started immediately, so the returned <code>url</code> goes straight to the payment provider; otherwise it opens the hosted checkout where the buyer completes those steps. Available on plans with the Checkout API feature.'
      parameters: []
      responses:
        200:
          description: 'Without a preselected payment method: url opens the hosted checkout'
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  invoice_id: 3
                  invoice_url: 'https://demo-shop.sellauth.com/checkout/98b3f45d848c5-0000000000003'
                  url: 'https://demo-shop.sellauth.com/checkout/98b3f45d848c5-0000000000003'
                properties:
                  success:
                    type: boolean
                    example: true
                  invoice_id:
                    type: integer
                    example: 3
                  invoice_url:
                    type: string
                    example: 'https://demo-shop.sellauth.com/checkout/98b3f45d848c5-0000000000003'
                  url:
                    type: string
                    example: 'https://demo-shop.sellauth.com/checkout/98b3f45d848c5-0000000000003'
        403:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'You do not have permission to create checkouts for this shop.'
                properties:
                  message:
                    type: string
                    example: 'You do not have permission to create checkouts for this shop.'
        422:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'The cart total must be greater than 0 when all cart items are custom.'
                properties:
                  message:
                    type: string
                    example: 'The cart total must be greater than 0 when all cart items are custom.'
      tags:
        - Checkout
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                cart:
                  type: array
                  description: 'The cart items. Each item is either a <b>catalog item</b> (<code>productId</code> + <code>variantId</code>) or a <b>custom item</b> (<code>name</code> + <code>price</code>). Both kinds can be mixed in one cart.'
                  example:
                    -
                      productId: 1
                      variantId: 1
                      quantity: 1
                  items:
                    type: object
                    properties:
                      productId:
                        type: integer
                        description: 'Catalog item: the product ID. Shown when viewing the product in the dashboard. Omit for custom items.'
                        example: 1
                      variantId:
                        type: integer
                        description: 'Catalog item: the variant ID. Shown when editing the product in the dashboard. Omit for custom items.'
                        example: 1
                      name:
                        type: string
                        description: 'Custom item: the item name shown on the checkout and invoice. Requires <code>price</code>; not needed for catalog items. Must not be greater than 255 characters.'
                        example: 'Custom order'
                      price:
                        type: number
                        description: 'Custom item: unit price in the checkout currency. Requires <code>name</code>; not needed for catalog items. Must be at least 0.'
                        example: 49.99
                      quantity:
                        type: integer
                        description: 'The quantity of the item. Must be at least 1. Must not be greater than 100000.'
                        example: 1
                      subscribe:
                        type: boolean
                        description: 'For subscription-enabled variants: start a recurring subscription instead of a one-time purchase.'
                        example: false
                      custom_fields:
                        type: object
                        description: "Values for the product's custom fields, keyed by field name."
                        example:
                          'Discord Username': 'customer#0001'
                        properties: {  }
                    required:
                      - quantity
                currency:
                  type: string
                  description: 'ISO 4217 currency code. <b>Required when every cart item is a custom item</b>; otherwise inferred from the products. Must be 3 characters.'
                  example: USD
                ip:
                  type: string
                  description: "The end buyer's IP address. Defaults to the caller's IP; forward the buyer's IP when calling from your backend so fraud checks and analytics see the real buyer. Must be a valid IP address."
                  example: 203.0.113.10
                country_code:
                  type: string
                  description: "The end buyer's ISO 3166-1 alpha-2 country code. Must contain only letters. Must be 2 characters."
                  example: US
                user_agent:
                  type: string
                  description: "The end buyer's user agent. Defaults to the caller's user agent."
                  example: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                asn:
                  type: integer
                  description: "The end buyer's autonomous system number, if you have it."
                  example: 64496
                email:
                  type: string
                  description: 'Prefill the customer email. When both <code>email</code> and a payment method are provided, the invoice is created as <code>pending</code> and a payment session is started immediately.'
                  example: customer@example.com
                discord_user_id:
                  type: string
                  description: "Internal: link the customer's Discord account."
                  example: null
                discord_user_username:
                  type: string
                  description: "Internal: link the customer's Discord account."
                  example: null
                discord_access_token:
                  type: string
                  description: "Internal: link the customer's Discord account."
                  example: null
                discord_refresh_token:
                  type: string
                  description: "Internal: link the customer's Discord account."
                  example: null
                coupon:
                  type: string
                  description: 'A coupon code to apply.'
                  example: SAVE10
                gateway:
                  type: string
                  description: 'DEPRECATED, use <code>payment_method_id</code>. The payment gateway type to preselect. One of <code>STRIPE</code>, <code>SQUARE</code>, <code>SUMUP</code>, <code>MOLLIE</code>, <code>SKRILL</code>, <code>AUTHORIZENET</code>, <code>REVOLUTBUSINESS</code>, <code>LEMONSQUEEZY</code>, <code>NMI</code>, <code>OVERPAY</code>, <code>MONEI</code>, <code>RAZORPAY</code>, <code>PANDABASE</code>, <code>VENPAYR</code>, <code>OVGC</code>, <code>ADYEN</code>, <code>SHOPIFY</code>, <code>AMAZONPS</code>, <code>PAYCEK</code>, <code>PAYPAL</code>, <code>PAYPALFF</code>, <code>CASHAPP</code>, <code>VENMO</code>, <code>REWARBLE</code>, <code>BTC</code>, <code>LTC</code>. <code>CUSTOMERBALANCE</code> is not allowed on this endpoint.'
                  example: STRIPE
                payment_method_id:
                  type: integer
                  description: 'The payment method to preselect. Shown in the URL when editing a payment method in the dashboard. When set together with <code>email</code>, a payment session is started immediately and the response <code>url</code> points to the payment page.'
                  example: 1
                newsletter:
                  type: boolean
                  description: 'Subscribe the customer to the shop newsletter.'
                  example: false
                affiliate:
                  type: string
                  description: 'An affiliate code to credit for this sale. Must not be greater than 16 characters.'
                  example: PARTNER10
                billing_name:
                  type: string
                  description: 'Prefill: billing name. Must not be greater than 100 characters.'
                  example: 'John Doe'
                billing_address_line1:
                  type: string
                  description: 'Prefill: billing address line 1. Must not be greater than 150 characters.'
                  example: '123 Main St'
                billing_address_line2:
                  type: string
                  description: 'Prefill: billing address line 2. Must not be greater than 150 characters.'
                  example: 'Apt 4'
                billing_city:
                  type: string
                  description: 'Prefill: billing city. Must not be greater than 100 characters.'
                  example: Springfield
                billing_state:
                  type: string
                  description: 'Prefill: billing state or region. Must not be greater than 100 characters.'
                  example: IL
                billing_postcode:
                  type: string
                  description: 'Prefill: billing postcode. Must not be greater than 20 characters.'
                  example: '62701'
                billing_country:
                  type: string
                  description: 'Prefill: billing country (ISO 3166-1 alpha-2). Must be 2 characters.'
                  example: US
                shipping_name:
                  type: string
                  description: 'Prefill: shipping name. Must not be greater than 100 characters.'
                  example: 'John Doe'
                shipping_address_line1:
                  type: string
                  description: 'Prefill: shipping address line 1. Must not be greater than 150 characters.'
                  example: '123 Main St'
                shipping_address_line2:
                  type: string
                  description: 'Prefill: shipping address line 2. Must not be greater than 150 characters.'
                  example: 'Apt 4'
                shipping_city:
                  type: string
                  description: 'Prefill: shipping city. Must not be greater than 100 characters.'
                  example: Springfield
                shipping_state:
                  type: string
                  description: 'Prefill: shipping state or region. Must not be greater than 100 characters.'
                  example: IL
                shipping_postcode:
                  type: string
                  description: 'Prefill: shipping postcode. Must not be greater than 20 characters.'
                  example: '62701'
                shipping_country:
                  type: string
                  description: 'Prefill: shipping country (ISO 3166-1 alpha-2). Must be 2 characters.'
                  example: US
                shipping_phone:
                  type: string
                  description: 'Prefill: shipping phone number. Must not be greater than 20 characters.'
                  example: '+1 555 0100'
                metadata:
                  type: array
                  description: 'Must not be greater than 255 characters.'
                  example:
                    - pasyzwszwtxpeqq
                  items:
                    type: string
              required:
                - cart
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/backfill-cost/preview':
    get:
      summary: 'Preview Cost Backfill'
      operationId: previewCostBackfill
      description: 'Counts the historical invoice items in a date window that would receive a cost snapshot.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  count: 0
                  maxItems: 25000
                  maxRangeDays: 90
                properties:
                  count:
                    type: integer
                    example: 0
                  maxItems:
                    type: integer
                    example: 25000
                  maxRangeDays:
                    type: integer
                    example: 90
      tags:
        - Invoices
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                start:
                  type: string
                  description: 'Start of the completion date window. Must be a valid date.'
                  example: '2026-07-15'
                end:
                  type: string
                  description: 'End of the completion date window. Must be a valid date. Must be a date after or equal to <code>start</code>.'
                  example: '2026-08-15'
              required:
                - start
                - end
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/backfill-cost/status':
    get:
      summary: 'Get Cost Backfill Status'
      operationId: getCostBackfillStatus
      description: "Retrieves the state of the shop's most recent cost backfill run."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: idle
                  cooldown: false
                properties:
                  status:
                    type: string
                    example: idle
                  cooldown:
                    type: boolean
                    example: false
      tags:
        - Invoices
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/backfill-cost':
    post:
      summary: 'Backfill Costs'
      operationId: backfillCosts
      description: 'Queues a job that stamps the current variant cost onto historical invoice items in a date window that have no cost snapshot yet. Limited to one run per hour per shop.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                start:
                  type: string
                  description: 'Start of the completion date window. Must be a valid date.'
                  example: '2026-07-15'
                end:
                  type: string
                  description: 'End of the completion date window. Must be a valid date. Must be a date after or equal to <code>start</code>.'
                  example: '2026-08-15'
              required:
                - start
                - end
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices':
    get:
      summary: 'Get Invoices'
      operationId: getInvoices
      description: 'Retrieves the invoices.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 2
                      status: completed
                      price: '14.99'
                      currency: USD
                      paid: '0.00'
                      paid_usd: '0.00'
                      gateway: null
                      payment_method_id: null
                      email: reseller@sellauth.test
                      salt: 04fa0a37b47bd
                      manual: false
                      created_at: '2026-08-28T18:23:02.000000Z'
                      completed_at: '2026-08-28T18:23:02.000000Z'
                      archived_at: null
                      shop_customer_id: 3
                      tax_rate: '0.00'
                      ip: 127.0.0.1
                      country_code: null
                      user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                      asn: null
                      unique_id: 04fa0a37b47bd-0000000000002
                      product: null
                      variant: null
                      items:
                        -
                          id: 2
                          invoice_id: 2
                          product_id: 1
                          variant_id: 1
                          custom_name: null
                          product:
                            id: 1
                            name: 'License Keys'
                            stock_count: 0
                            images:
                              -
                                id: 1
                                cloudflare_image_id: null
                                url: 'http://static.mysellauth.test/storage/images/1.webp'
                                pivot:
                                  product_id: 1
                                  image_id: 1
                                  order: 0
                          variant:
                            id: 1
                            name: Standard
                      payment_method: null
                    -
                      id: 1
                      status: completed
                      price: '14.99'
                      currency: USD
                      paid: '14.99'
                      paid_usd: '14.99'
                      gateway: STRIPE
                      payment_method_id: 1
                      email: customer@sellauth.test
                      salt: e1ba502e01286
                      manual: false
                      created_at: '2026-08-28T18:23:02.000000Z'
                      completed_at: '2026-08-28T18:23:02.000000Z'
                      archived_at: null
                      shop_customer_id: 1
                      tax_rate: '0.00'
                      ip: 127.0.0.1
                      country_code: null
                      user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                      asn: null
                      unique_id: e1ba502e01286-0000000000001
                      product: null
                      variant: null
                      items:
                        -
                          id: 1
                          invoice_id: 1
                          product_id: 1
                          variant_id: 1
                          custom_name: null
                          product:
                            id: 1
                            name: 'License Keys'
                            stock_count: 0
                            images:
                              -
                                id: 1
                                cloudflare_image_id: null
                                url: 'http://static.mysellauth.test/storage/images/1.webp'
                                pivot:
                                  product_id: 1
                                  image_id: 1
                                  order: 0
                          variant:
                            id: 1
                            name: Standard
                      payment_method:
                        id: 1
                        name: Stripe
                        icon_image_id: null
                        icon_image_url: null
                        icon_image: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/invoices?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/invoices?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/invoices?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/invoices'
                  per_page: 20
                  prev_page_url: null
                  to: 2
                  total: 2
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 2
                        status: completed
                        price: '14.99'
                        currency: USD
                        paid: '0.00'
                        paid_usd: '0.00'
                        gateway: null
                        payment_method_id: null
                        email: reseller@sellauth.test
                        salt: 04fa0a37b47bd
                        manual: false
                        created_at: '2026-08-28T18:23:02.000000Z'
                        completed_at: '2026-08-28T18:23:02.000000Z'
                        archived_at: null
                        shop_customer_id: 3
                        tax_rate: '0.00'
                        ip: 127.0.0.1
                        country_code: null
                        user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                        asn: null
                        unique_id: 04fa0a37b47bd-0000000000002
                        product: null
                        variant: null
                        items:
                          -
                            id: 2
                            invoice_id: 2
                            product_id: 1
                            variant_id: 1
                            custom_name: null
                            product:
                              id: 1
                              name: 'License Keys'
                              stock_count: 0
                              images:
                                -
                                  id: 1
                                  cloudflare_image_id: null
                                  url: 'http://static.mysellauth.test/storage/images/1.webp'
                                  pivot:
                                    product_id: 1
                                    image_id: 1
                                    order: 0
                            variant:
                              id: 1
                              name: Standard
                        payment_method: null
                      -
                        id: 1
                        status: completed
                        price: '14.99'
                        currency: USD
                        paid: '14.99'
                        paid_usd: '14.99'
                        gateway: STRIPE
                        payment_method_id: 1
                        email: customer@sellauth.test
                        salt: e1ba502e01286
                        manual: false
                        created_at: '2026-08-28T18:23:02.000000Z'
                        completed_at: '2026-08-28T18:23:02.000000Z'
                        archived_at: null
                        shop_customer_id: 1
                        tax_rate: '0.00'
                        ip: 127.0.0.1
                        country_code: null
                        user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                        asn: null
                        unique_id: e1ba502e01286-0000000000001
                        product: null
                        variant: null
                        items:
                          -
                            id: 1
                            invoice_id: 1
                            product_id: 1
                            variant_id: 1
                            custom_name: null
                            product:
                              id: 1
                              name: 'License Keys'
                              stock_count: 0
                              images:
                                -
                                  id: 1
                                  cloudflare_image_id: null
                                  url: 'http://static.mysellauth.test/storage/images/1.webp'
                                  pivot:
                                    product_id: 1
                                    image_id: 1
                                    order: 0
                            variant:
                              id: 1
                              name: Standard
                        payment_method:
                          id: 1
                          name: Stripe
                          icon_image_id: null
                          icon_image_url: null
                          icon_image: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 2
                        status:
                          type: string
                          example: completed
                        price:
                          type: string
                          example: '14.99'
                        currency:
                          type: string
                          example: USD
                        paid:
                          type: string
                          example: '0.00'
                        paid_usd:
                          type: string
                          example: '0.00'
                        gateway:
                          type: string
                          example: null
                        payment_method_id:
                          type: string
                          example: null
                        email:
                          type: string
                          example: reseller@sellauth.test
                        salt:
                          type: string
                          example: 04fa0a37b47bd
                        manual:
                          type: boolean
                          example: false
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        completed_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        archived_at:
                          type: string
                          example: null
                        shop_customer_id:
                          type: integer
                          example: 3
                        tax_rate:
                          type: string
                          example: '0.00'
                        ip:
                          type: string
                          example: 127.0.0.1
                        country_code:
                          type: string
                          example: null
                        user_agent:
                          type: string
                          example: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                        asn:
                          type: string
                          example: null
                        unique_id:
                          type: string
                          example: 04fa0a37b47bd-0000000000002
                        product:
                          type: string
                          example: null
                        variant:
                          type: string
                          example: null
                        items:
                          type: array
                          example:
                            -
                              id: 2
                              invoice_id: 2
                              product_id: 1
                              variant_id: 1
                              custom_name: null
                              product:
                                id: 1
                                name: 'License Keys'
                                stock_count: 0
                                images:
                                  -
                                    id: 1
                                    cloudflare_image_id: null
                                    url: 'http://static.mysellauth.test/storage/images/1.webp'
                                    pivot:
                                      product_id: 1
                                      image_id: 1
                                      order: 0
                              variant:
                                id: 1
                                name: Standard
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 2
                              invoice_id:
                                type: integer
                                example: 2
                              product_id:
                                type: integer
                                example: 1
                              variant_id:
                                type: integer
                                example: 1
                              custom_name:
                                type: string
                                example: null
                              product:
                                type: object
                                properties:
                                  id:
                                    type: integer
                                    example: 1
                                  name:
                                    type: string
                                    example: 'License Keys'
                                  stock_count:
                                    type: integer
                                    example: 0
                                  images:
                                    type: array
                                    example:
                                      - { id: 1, cloudflare_image_id: null, url: 'http://static.mysellauth.test/storage/images/1.webp', pivot: { product_id: 1, image_id: 1, order: 0 } }
                                    items:
                                      type: object
                                      properties: { id: { type: integer, example: 1 }, cloudflare_image_id: { type: string, example: null }, url: { type: string, example: 'http://static.mysellauth.test/storage/images/1.webp' }, pivot: { type: object, properties: { product_id: { type: integer, example: 1 }, image_id: { type: integer, example: 1 }, order: { type: integer, example: 0 } } } }
                              variant:
                                type: object
                                properties:
                                  id:
                                    type: integer
                                    example: 1
                                  name:
                                    type: string
                                    example: Standard
                        payment_method:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/invoices?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/invoices?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/invoices?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/invoices'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 2
                  total:
                    type: integer
                    example: 2
      tags:
        - Invoices
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number. Must be at least 1.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - price_usd
                    - paid_usd
                    - created_at
                    - completed_at
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                id:
                  type: string
                  description: 'Filter by invoice ID or unique ID.'
                  example: null
                statuses:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                email:
                  type: string
                  description: 'Filter by customer email.'
                  example: null
                gateways:
                  type: object
                  description: 'Deprecated. Use payment_method_ids.'
                  example: null
                  properties: {  }
                payment_method_ids:
                  type: object
                  description: 'Filter by payment method IDs.'
                  example: null
                  properties: {  }
                created_at_start:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                created_at_end:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>created_at_start</code>.'
                  example: null
                completed_at_start:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                completed_at_end:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>completed_at_start</code>.'
                  example: null
                product_name:
                  type: string
                  description: ''
                  example: null
                variant_name:
                  type: string
                  description: ''
                  example: null
                coupon_code:
                  type: string
                  description: ''
                  example: null
                ip:
                  type: string
                  description: ''
                  example: null
                discord_id:
                  type: string
                  description: ''
                  example: null
                discord_username:
                  type: string
                  description: ''
                  example: null
                deliverable:
                  type: string
                  description: 'Filter by delivered content.'
                  example: null
                custom_field:
                  type: string
                  description: 'Filter by custom field value.'
                  example: null
                archived:
                  type: string
                  description: 'Only archived invoices.'
                  example: null
                manual:
                  type: string
                  description: 'Only manual invoices.'
                  example: null
                external_id_type:
                  type: string
                  description: ''
                  example: null
                external_id_value:
                  type: string
                  description: ''
                  example: null
                cashapp_note:
                  type: string
                  description: ''
                  example: null
                paypalff_note:
                  type: string
                  description: ''
                  example: null
                venmo_note:
                  type: string
                  description: ''
                  example: null
                customer_id:
                  type: string
                  description: 'Filter by customer ID.'
                  example: null
                all:
                  type: boolean
                  description: 'Include full invoice details in the list.'
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}':
    get:
      summary: 'Get Invoice'
      operationId: getInvoice
      description: 'Retrieves a specific invoice.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  coupon_id: null
                  shipping_fee: '0.00'
                  paypalff_email: null
                  shop_customer_id: 1
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  completed_at: '2026-08-28T18:23:02.000000Z'
                  processed_email_sent_at: null
                  archived_at: null
                  salt: e1ba502e01286
                  gateway: STRIPE
                  payment_method_id: 1
                  external_url: null
                  stripe_client_secret: null
                  sumup_checkout_id: null
                  email: customer@sellauth.test
                  delivered: null
                  delivered_old: null
                  redirect_url: null
                  status: completed
                  fulfillment_status: null
                  status_description: null
                  price: '14.99'
                  tax_rate: '0.00'
                  currency: USD
                  customer_currency: null
                  price_usd: '14.99'
                  balance_applied: null
                  balance_applied_usd: null
                  paid: '14.99'
                  paid_usd: '14.99'
                  custom_fields: null
                  dashboard_note: null
                  ip: 127.0.0.1
                  country_code: null
                  user_agent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                  asn: null
                  crypto_address: null
                  crypto_amount: null
                  shop_id: 1
                  cashapp_cashtag: null
                  cashapp_note: null
                  venmo_tag: null
                  venmo_email: null
                  venmo_note: null
                  manual: false
                  paypalff_currency: USD
                  paypalff_price: null
                  paypalff_note: null
                  revolutbusiness_token: null
                  customer_id: null
                  transaction_id: null
                  proof_of_payment: null
                  proof_of_payment_image: null
                  metadata: null
                  source: null
                  misticpay_address: null
                  billing_name: null
                  billing_address_line1: null
                  billing_address_line2: null
                  billing_city: null
                  billing_state: null
                  billing_postcode: null
                  billing_country: null
                  shipping_name: null
                  shipping_address_line1: null
                  shipping_address_line2: null
                  shipping_city: null
                  shipping_state: null
                  shipping_postcode: null
                  shipping_country: null
                  shipping_phone: null
                  tracking_code: null
                  tracking_link: null
                  shipped_at: null
                  delivered_at: null
                  fulfillment_note: null
                  abandoned_dismissed_at: null
                  abandoned_recovery_sent_at: null
                  venpayr_id: null
                  shipping_zone_id: null
                  withdrawal_disabled: false
                  affiliate_customer_id: null
                  affiliate_code: null
                  affiliate_commission_usd: null
                  affiliate_commission_skip_reason: null
                  affiliate_tier_id: null
                  product_subscription_id: null
                  subscription_cycle: null
                  is_reseller_order: false
                  reseller_tier_id: null
                  reseller_source: null
                  cashback_usd: null
                  unique_id: e1ba502e01286-0000000000001
                  customer:
                    id: 1
                    shop_id: 1
                    email: customer@sellauth.test
                    discord_id: null
                    discord_username: null
                  coupon: null
                  items:
                    -
                      id: 1
                      invoice_id: 1
                      product_id: 1
                      variant_id: 1
                      parent_variant_id: null
                      custom_name: null
                      status: completed
                      price: '14.99'
                      cost: '4.50'
                      quantity: 1
                      balance_credit: null
                      coupon_discount: '0.00'
                      volume_discount: '0.00'
                      gateway_fee: '0.00'
                      tax_inclusive: false
                      total_tax: '0.00'
                      total_price: '14.99'
                      custom_fields: null
                      custom_fields_submitted_at: null
                      delivered:
                        - KEY-AAAA-1111-XXXX
                      completed_at: '2026-08-28T18:23:02.000000Z'
                      product:
                        id: 1
                        type: variant
                        name: 'License Keys'
                        deliverables_type: serials
                        requires_fulfillment: false
                        stock_count: 3
                        images:
                          -
                            id: 1
                            cloudflare_image_id: null
                            url: 'http://static.mysellauth.test/storage/images/1.webp'
                            pivot:
                              product_id: 1
                              image_id: 1
                              order: 0
                      variant:
                        id: 1
                        name: Standard
                        stock: 3
                  payments: []
                  payment_method:
                    id: 1
                    name: Stripe
                    icon_image_id: null
                    icon_image_url: null
                    icon_image: null
                  feedback:
                    id: 1
                    invoice_id: 1
                    status: published
                    message: 'Great product, instant delivery.'
                    image: null
                    rating: 5
                    is_automatic: false
                    reply: null
                    dispute_reason: null
                    disputed_at: null
                    created_at: '2026-08-28T18:23:02.000000Z'
                    updated_at: '2026-08-28T18:23:02.000000Z'
                    replied_at: null
                    image_url: null
                  shipping_zone: null
                  proof_of_payment_image_url: null
                  blacklist_status:
                    email: false
                    discord_id: false
                    ip: false
                properties:
                  id:
                    type: integer
                    example: 1
                  coupon_id:
                    type: string
                    example: null
                  shipping_fee:
                    type: string
                    example: '0.00'
                  paypalff_email:
                    type: string
                    example: null
                  shop_customer_id:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  completed_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  processed_email_sent_at:
                    type: string
                    example: null
                  archived_at:
                    type: string
                    example: null
                  salt:
                    type: string
                    example: e1ba502e01286
                  gateway:
                    type: string
                    example: STRIPE
                  payment_method_id:
                    type: integer
                    example: 1
                  external_url:
                    type: string
                    example: null
                  stripe_client_secret:
                    type: string
                    example: null
                  sumup_checkout_id:
                    type: string
                    example: null
                  email:
                    type: string
                    example: customer@sellauth.test
                  delivered:
                    type: string
                    example: null
                  delivered_old:
                    type: string
                    example: null
                  redirect_url:
                    type: string
                    example: null
                  status:
                    type: string
                    example: completed
                  fulfillment_status:
                    type: string
                    example: null
                  status_description:
                    type: string
                    example: null
                  price:
                    type: string
                    example: '14.99'
                  tax_rate:
                    type: string
                    example: '0.00'
                  currency:
                    type: string
                    example: USD
                  customer_currency:
                    type: string
                    example: null
                  price_usd:
                    type: string
                    example: '14.99'
                  balance_applied:
                    type: string
                    example: null
                  balance_applied_usd:
                    type: string
                    example: null
                  paid:
                    type: string
                    example: '14.99'
                  paid_usd:
                    type: string
                    example: '14.99'
                  custom_fields:
                    type: string
                    example: null
                  dashboard_note:
                    type: string
                    example: null
                  ip:
                    type: string
                    example: 127.0.0.1
                  country_code:
                    type: string
                    example: null
                  user_agent:
                    type: string
                    example: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                  asn:
                    type: string
                    example: null
                  crypto_address:
                    type: string
                    example: null
                  crypto_amount:
                    type: string
                    example: null
                  shop_id:
                    type: integer
                    example: 1
                  cashapp_cashtag:
                    type: string
                    example: null
                  cashapp_note:
                    type: string
                    example: null
                  venmo_tag:
                    type: string
                    example: null
                  venmo_email:
                    type: string
                    example: null
                  venmo_note:
                    type: string
                    example: null
                  manual:
                    type: boolean
                    example: false
                  paypalff_currency:
                    type: string
                    example: USD
                  paypalff_price:
                    type: string
                    example: null
                  paypalff_note:
                    type: string
                    example: null
                  revolutbusiness_token:
                    type: string
                    example: null
                  customer_id:
                    type: string
                    example: null
                  transaction_id:
                    type: string
                    example: null
                  proof_of_payment:
                    type: string
                    example: null
                  proof_of_payment_image:
                    type: string
                    example: null
                  metadata:
                    type: string
                    example: null
                  source:
                    type: string
                    example: null
                  misticpay_address:
                    type: string
                    example: null
                  billing_name:
                    type: string
                    example: null
                  billing_address_line1:
                    type: string
                    example: null
                  billing_address_line2:
                    type: string
                    example: null
                  billing_city:
                    type: string
                    example: null
                  billing_state:
                    type: string
                    example: null
                  billing_postcode:
                    type: string
                    example: null
                  billing_country:
                    type: string
                    example: null
                  shipping_name:
                    type: string
                    example: null
                  shipping_address_line1:
                    type: string
                    example: null
                  shipping_address_line2:
                    type: string
                    example: null
                  shipping_city:
                    type: string
                    example: null
                  shipping_state:
                    type: string
                    example: null
                  shipping_postcode:
                    type: string
                    example: null
                  shipping_country:
                    type: string
                    example: null
                  shipping_phone:
                    type: string
                    example: null
                  tracking_code:
                    type: string
                    example: null
                  tracking_link:
                    type: string
                    example: null
                  shipped_at:
                    type: string
                    example: null
                  delivered_at:
                    type: string
                    example: null
                  fulfillment_note:
                    type: string
                    example: null
                  abandoned_dismissed_at:
                    type: string
                    example: null
                  abandoned_recovery_sent_at:
                    type: string
                    example: null
                  venpayr_id:
                    type: string
                    example: null
                  shipping_zone_id:
                    type: string
                    example: null
                  withdrawal_disabled:
                    type: boolean
                    example: false
                  affiliate_customer_id:
                    type: string
                    example: null
                  affiliate_code:
                    type: string
                    example: null
                  affiliate_commission_usd:
                    type: string
                    example: null
                  affiliate_commission_skip_reason:
                    type: string
                    example: null
                  affiliate_tier_id:
                    type: string
                    example: null
                  product_subscription_id:
                    type: string
                    example: null
                  subscription_cycle:
                    type: string
                    example: null
                  is_reseller_order:
                    type: boolean
                    example: false
                  reseller_tier_id:
                    type: string
                    example: null
                  reseller_source:
                    type: string
                    example: null
                  cashback_usd:
                    type: string
                    example: null
                  unique_id:
                    type: string
                    example: e1ba502e01286-0000000000001
                  customer:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      shop_id:
                        type: integer
                        example: 1
                      email:
                        type: string
                        example: customer@sellauth.test
                      discord_id:
                        type: string
                        example: null
                      discord_username:
                        type: string
                        example: null
                  coupon:
                    type: string
                    example: null
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        invoice_id: 1
                        product_id: 1
                        variant_id: 1
                        parent_variant_id: null
                        custom_name: null
                        status: completed
                        price: '14.99'
                        cost: '4.50'
                        quantity: 1
                        balance_credit: null
                        coupon_discount: '0.00'
                        volume_discount: '0.00'
                        gateway_fee: '0.00'
                        tax_inclusive: false
                        total_tax: '0.00'
                        total_price: '14.99'
                        custom_fields: null
                        custom_fields_submitted_at: null
                        delivered:
                          - KEY-AAAA-1111-XXXX
                        completed_at: '2026-08-28T18:23:02.000000Z'
                        product:
                          id: 1
                          type: variant
                          name: 'License Keys'
                          deliverables_type: serials
                          requires_fulfillment: false
                          stock_count: 3
                          images:
                            -
                              id: 1
                              cloudflare_image_id: null
                              url: 'http://static.mysellauth.test/storage/images/1.webp'
                              pivot:
                                product_id: 1
                                image_id: 1
                                order: 0
                        variant:
                          id: 1
                          name: Standard
                          stock: 3
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        invoice_id:
                          type: integer
                          example: 1
                        product_id:
                          type: integer
                          example: 1
                        variant_id:
                          type: integer
                          example: 1
                        parent_variant_id:
                          type: string
                          example: null
                        custom_name:
                          type: string
                          example: null
                        status:
                          type: string
                          example: completed
                        price:
                          type: string
                          example: '14.99'
                        cost:
                          type: string
                          example: '4.50'
                        quantity:
                          type: integer
                          example: 1
                        balance_credit:
                          type: string
                          example: null
                        coupon_discount:
                          type: string
                          example: '0.00'
                        volume_discount:
                          type: string
                          example: '0.00'
                        gateway_fee:
                          type: string
                          example: '0.00'
                        tax_inclusive:
                          type: boolean
                          example: false
                        total_tax:
                          type: string
                          example: '0.00'
                        total_price:
                          type: string
                          example: '14.99'
                        custom_fields:
                          type: string
                          example: null
                        custom_fields_submitted_at:
                          type: string
                          example: null
                        delivered:
                          type: array
                          example:
                            - KEY-AAAA-1111-XXXX
                          items:
                            type: string
                        completed_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        product:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            type:
                              type: string
                              example: variant
                            name:
                              type: string
                              example: 'License Keys'
                            deliverables_type:
                              type: string
                              example: serials
                            requires_fulfillment:
                              type: boolean
                              example: false
                            stock_count:
                              type: integer
                              example: 3
                            images:
                              type: array
                              example:
                                -
                                  id: 1
                                  cloudflare_image_id: null
                                  url: 'http://static.mysellauth.test/storage/images/1.webp'
                                  pivot:
                                    product_id: 1
                                    image_id: 1
                                    order: 0
                              items:
                                type: object
                                properties:
                                  id:
                                    type: integer
                                    example: 1
                                  cloudflare_image_id:
                                    type: string
                                    example: null
                                  url:
                                    type: string
                                    example: 'http://static.mysellauth.test/storage/images/1.webp'
                                  pivot:
                                    type: object
                                    properties:
                                      product_id: { type: integer, example: 1 }
                                      image_id: { type: integer, example: 1 }
                                      order: { type: integer, example: 0 }
                        variant:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            name:
                              type: string
                              example: Standard
                            stock:
                              type: integer
                              example: 3
                  payments:
                    type: array
                    example: []
                  payment_method:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: Stripe
                      icon_image_id:
                        type: string
                        example: null
                      icon_image_url:
                        type: string
                        example: null
                      icon_image:
                        type: string
                        example: null
                  feedback:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      invoice_id:
                        type: integer
                        example: 1
                      status:
                        type: string
                        example: published
                      message:
                        type: string
                        example: 'Great product, instant delivery.'
                      image:
                        type: string
                        example: null
                      rating:
                        type: integer
                        example: 5
                      is_automatic:
                        type: boolean
                        example: false
                      reply:
                        type: string
                        example: null
                      dispute_reason:
                        type: string
                        example: null
                      disputed_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      updated_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      replied_at:
                        type: string
                        example: null
                      image_url:
                        type: string
                        example: null
                  shipping_zone:
                    type: string
                    example: null
                  proof_of_payment_image_url:
                    type: string
                    example: null
                  blacklist_status:
                    type: object
                    properties:
                      email:
                        type: boolean
                        example: false
                      discord_id:
                        type: boolean
                        example: false
                      ip:
                        type: boolean
                        example: false
      tags:
        - Invoices
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The invoice ID or unique ID.'
        example: '1'
        required: true
        schema:
          type: string
  '/v1/shops/{shopId}/invoices/{invoiceId}/status':
    post:
      summary: 'Update Invoice Status'
      operationId: updateInvoiceStatus
      description: 'Updates the status of an invoice to completed, cancelled, failed or refunded.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  description: ''
                  example: failed
                  enum:
                    - completed
                    - cancelled
                    - failed
                    - refunded
              required:
                - status
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The ID of the invoice.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/archive':
    post:
      summary: 'Archive Invoice'
      operationId: archiveInvoice
      description: 'Marks an invoice as archived.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The invoice ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/unarchive':
    post:
      summary: 'Unarchive Invoice'
      operationId: unarchiveInvoice
      description: 'Marks an invoice as unarchived.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The invoice ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/reverse-affiliate-commission':
    post:
      summary: 'Reverse Affiliate Commission'
      operationId: reverseAffiliateCommission
      description: 'Claws back the affiliate commission credited for an invoice (e.g. after a refund or chargeback). The affiliate wallet may go negative; payouts are blocked while it is.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The invoice ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/reverse-cashback':
    post:
      summary: 'Reverse Cashback'
      operationId: reverseCashback
      description: 'Claws back the cashback credited for an invoice (e.g. after a refund or chargeback). The customer balance may go negative.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The invoice ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/dashboard-note':
    put:
      summary: 'Update Invoice Dashboard Note'
      operationId: updateInvoiceDashboardNote
      description: 'Updates the invoice dashboard note.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The invoice ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/paid-amount':
    put:
      summary: 'Update Paid Amount'
      operationId: updatePaidAmount
      description: 'Updates the paid amount of an invoice.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                paid:
                  type: number
                  description: 'The amount paid in the invoice currency.'
                  example: 9.99
                paid_usd:
                  type: number
                  description: 'The amount paid in USD.'
                  example: 9.99
              required:
                - paid
                - paid_usd
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The invoice ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/ship':
    post:
      summary: 'Mark Invoice as Shipped'
      operationId: markInvoiceAsShipped
      description: 'Marks an invoice as shipped with an optional tracking code and link.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                tracking_code:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: pasyzwszwtxpeqq
                tracking_link:
                  type: string
                  description: 'Must not be greater than 2048 characters.'
                  example: ikymwkiinfowtzm
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The ID of the invoice.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/deliver':
    post:
      summary: 'Deliver Invoice Items'
      operationId: deliverInvoiceItems
      description: 'Delivers the items of an invoice and notifies the customer.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The ID of the invoice.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/fulfillment':
    post:
      summary: 'Fulfill Invoice'
      operationId: fulfillInvoice
      description: 'Marks a service order as in progress or completed and optionally notifies the customer with a message.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  description: 'The new fulfillment status: in_progress or completed.'
                  example: completed
                message:
                  type: string
                  description: 'An optional message shown to the customer and included in the e-mail.'
                  example: 'Your boost has been delivered.'
                notify:
                  type: boolean
                  description: 'Whether to e-mail the customer. Completed orders always notify.'
                  example: null
              required:
                - status
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The ID of the invoice.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/process':
    get:
      summary: 'Process Invoice'
      operationId: processInvoice
      description: 'Processes a pending, confirming or out-of-stock invoice, delivering its items. Pass <code>mark_as_paid</code> to also set the paid amount to the invoice price.'
      parameters:
        -
          in: query
          name: mark_as_paid
          description: 'Set the paid amount to the invoice price if nothing was paid yet.'
          example: null
          required: false
          schema:
            type: boolean
            description: 'Set the paid amount to the invoice price if nothing was paid yet.'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: 'Invoice processed'
                properties:
                  success:
                    type: string
                    example: 'Invoice processed'
        400:
          description: 'Processing failed'
          content:
            application/json:
              schema:
                type: object
                example:
                  error: 'Invoice processing failed'
                properties:
                  error:
                    type: string
                    example: 'Invoice processing failed'
      tags:
        - Invoices
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The invoice ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/replace-delivered':
    post:
      summary: 'Replace Delivered'
      operationId: replaceDelivered
      description: 'Replaces the delivered items of an invoice.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                invoice_item_id:
                  type: integer
                  description: ''
                  example: 12
                replacements:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: string
              required:
                - invoice_item_id
                - replacements
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The invoice ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/redo-dynamic-delivery':
    post:
      summary: 'Redo Dynamic Delivery'
      operationId: redoDynamicDelivery
      description: 'Calls the dynamic delivery endpoint for an invoice item again.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                invoice_item_id:
                  type: integer
                  description: ''
                  example: 12
              required:
                - invoice_item_id
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The invoice ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/invoices/{invoiceId}/resend-email':
    post:
      summary: 'Resend Invoice Email'
      operationId: resendInvoiceEmail
      description: 'Resends the order confirmation email for a processed invoice, optionally to a different email address.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Invoices
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: ''
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The ID of the invoice.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/subscriptions':
    get:
      summary: 'Get Subscriptions'
      operationId: getSubscriptions
      description: 'Retrieves a paginated list of product subscriptions.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      customer_id: 1
                      product_id: 1
                      variant_id: 1
                      product_name: 'License Keys'
                      variant_name: Standard
                      initial_invoice_id: 1
                      open_renewal_invoice_id: null
                      gateway: null
                      renewal_method: manual
                      payment_method_id: null
                      status: active
                      interval: month
                      interval_count: 1
                      trial_days: 0
                      trial_ends_at: null
                      quantity: 1
                      currency: USD
                      recurring_price: '14.99'
                      recurring_price_usd: null
                      renewal_delivery: redeliver
                      current_period_start: null
                      current_period_end: null
                      cycles_completed: 0
                      cancel_at_period_end: false
                      cancelled_at: null
                      expired_at: null
                      cancellation_reason: null
                      external_id: null
                      external_customer_id: null
                      last_renewal_reminder_at: null
                      failed_payment_count: 0
                      suspended_at: null
                      metadata: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                      customer:
                        id: 1
                        email: customer@sellauth.test
                      product:
                        id: 1
                        name: 'License Keys'
                        stock_count: 0
                      variant:
                        id: 1
                        name: Standard
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/subscriptions?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/subscriptions?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/subscriptions?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/subscriptions'
                  per_page: 25
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        customer_id: 1
                        product_id: 1
                        variant_id: 1
                        product_name: 'License Keys'
                        variant_name: Standard
                        initial_invoice_id: 1
                        open_renewal_invoice_id: null
                        gateway: null
                        renewal_method: manual
                        payment_method_id: null
                        status: active
                        interval: month
                        interval_count: 1
                        trial_days: 0
                        trial_ends_at: null
                        quantity: 1
                        currency: USD
                        recurring_price: '14.99'
                        recurring_price_usd: null
                        renewal_delivery: redeliver
                        current_period_start: null
                        current_period_end: null
                        cycles_completed: 0
                        cancel_at_period_end: false
                        cancelled_at: null
                        expired_at: null
                        cancellation_reason: null
                        external_id: null
                        external_customer_id: null
                        last_renewal_reminder_at: null
                        failed_payment_count: 0
                        suspended_at: null
                        metadata: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                        customer:
                          id: 1
                          email: customer@sellauth.test
                        product:
                          id: 1
                          name: 'License Keys'
                          stock_count: 0
                        variant:
                          id: 1
                          name: Standard
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        customer_id:
                          type: integer
                          example: 1
                        product_id:
                          type: integer
                          example: 1
                        variant_id:
                          type: integer
                          example: 1
                        product_name:
                          type: string
                          example: 'License Keys'
                        variant_name:
                          type: string
                          example: Standard
                        initial_invoice_id:
                          type: integer
                          example: 1
                        open_renewal_invoice_id:
                          type: string
                          example: null
                        gateway:
                          type: string
                          example: null
                        renewal_method:
                          type: string
                          example: manual
                        payment_method_id:
                          type: string
                          example: null
                        status:
                          type: string
                          example: active
                        interval:
                          type: string
                          example: month
                        interval_count:
                          type: integer
                          example: 1
                        trial_days:
                          type: integer
                          example: 0
                        trial_ends_at:
                          type: string
                          example: null
                        quantity:
                          type: integer
                          example: 1
                        currency:
                          type: string
                          example: USD
                        recurring_price:
                          type: string
                          example: '14.99'
                        recurring_price_usd:
                          type: string
                          example: null
                        renewal_delivery:
                          type: string
                          example: redeliver
                        current_period_start:
                          type: string
                          example: null
                        current_period_end:
                          type: string
                          example: null
                        cycles_completed:
                          type: integer
                          example: 0
                        cancel_at_period_end:
                          type: boolean
                          example: false
                        cancelled_at:
                          type: string
                          example: null
                        expired_at:
                          type: string
                          example: null
                        cancellation_reason:
                          type: string
                          example: null
                        external_id:
                          type: string
                          example: null
                        external_customer_id:
                          type: string
                          example: null
                        last_renewal_reminder_at:
                          type: string
                          example: null
                        failed_payment_count:
                          type: integer
                          example: 0
                        suspended_at:
                          type: string
                          example: null
                        metadata:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        deleted_at:
                          type: string
                          example: null
                        customer:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            email:
                              type: string
                              example: customer@sellauth.test
                        product:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            name:
                              type: string
                              example: 'License Keys'
                            stock_count:
                              type: integer
                              example: 0
                        variant:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            name:
                              type: string
                              example: Standard
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/subscriptions?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/subscriptions?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/subscriptions?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/subscriptions'
                  per_page:
                    type: integer
                    example: 25
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Subscriptions
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - pending
                    - trialing
                    - active
                    - past_due
                    - cancelled
                    - expired
                product_id:
                  type: integer
                  description: 'Filter by product ID.'
                  example: null
                customer_id:
                  type: integer
                  description: 'Filter by customer ID.'
                  example: null
                perPage:
                  type: integer
                  description: 'Items per page, 1-100.'
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/subscriptions/{subscriptionId}':
    get:
      summary: 'Get Subscription'
      operationId: getSubscription
      description: 'Retrieves a specific subscription with its recent invoices.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  subscription:
                    id: 1
                    shop_id: 1
                    customer_id: 1
                    product_id: 1
                    variant_id: 1
                    product_name: 'License Keys'
                    variant_name: Standard
                    initial_invoice_id: 1
                    open_renewal_invoice_id: null
                    gateway: null
                    renewal_method: manual
                    payment_method_id: null
                    status: active
                    interval: month
                    interval_count: 1
                    trial_days: 0
                    trial_ends_at: null
                    quantity: 1
                    currency: USD
                    recurring_price: '14.99'
                    recurring_price_usd: null
                    renewal_delivery: redeliver
                    current_period_start: null
                    current_period_end: null
                    cycles_completed: 0
                    cancel_at_period_end: false
                    cancelled_at: null
                    expired_at: null
                    cancellation_reason: null
                    external_id: null
                    external_customer_id: null
                    last_renewal_reminder_at: null
                    failed_payment_count: 0
                    suspended_at: null
                    metadata: null
                    created_at: '2026-08-28T18:23:02.000000Z'
                    updated_at: '2026-08-28T18:23:02.000000Z'
                    deleted_at: null
                    customer:
                      id: 1
                      email: customer@sellauth.test
                    product:
                      id: 1
                      name: 'License Keys'
                      stock_count: 0
                    variant:
                      id: 1
                      name: Standard
                  invoices: []
                properties:
                  subscription:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      shop_id:
                        type: integer
                        example: 1
                      customer_id:
                        type: integer
                        example: 1
                      product_id:
                        type: integer
                        example: 1
                      variant_id:
                        type: integer
                        example: 1
                      product_name:
                        type: string
                        example: 'License Keys'
                      variant_name:
                        type: string
                        example: Standard
                      initial_invoice_id:
                        type: integer
                        example: 1
                      open_renewal_invoice_id:
                        type: string
                        example: null
                      gateway:
                        type: string
                        example: null
                      renewal_method:
                        type: string
                        example: manual
                      payment_method_id:
                        type: string
                        example: null
                      status:
                        type: string
                        example: active
                      interval:
                        type: string
                        example: month
                      interval_count:
                        type: integer
                        example: 1
                      trial_days:
                        type: integer
                        example: 0
                      trial_ends_at:
                        type: string
                        example: null
                      quantity:
                        type: integer
                        example: 1
                      currency:
                        type: string
                        example: USD
                      recurring_price:
                        type: string
                        example: '14.99'
                      recurring_price_usd:
                        type: string
                        example: null
                      renewal_delivery:
                        type: string
                        example: redeliver
                      current_period_start:
                        type: string
                        example: null
                      current_period_end:
                        type: string
                        example: null
                      cycles_completed:
                        type: integer
                        example: 0
                      cancel_at_period_end:
                        type: boolean
                        example: false
                      cancelled_at:
                        type: string
                        example: null
                      expired_at:
                        type: string
                        example: null
                      cancellation_reason:
                        type: string
                        example: null
                      external_id:
                        type: string
                        example: null
                      external_customer_id:
                        type: string
                        example: null
                      last_renewal_reminder_at:
                        type: string
                        example: null
                      failed_payment_count:
                        type: integer
                        example: 0
                      suspended_at:
                        type: string
                        example: null
                      metadata:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      updated_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      deleted_at:
                        type: string
                        example: null
                      customer:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 1
                          email:
                            type: string
                            example: customer@sellauth.test
                      product:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 1
                          name:
                            type: string
                            example: 'License Keys'
                          stock_count:
                            type: integer
                            example: 0
                      variant:
                        type: object
                        properties:
                          id:
                            type: integer
                            example: 1
                          name:
                            type: string
                            example: Standard
                  invoices:
                    type: array
                    example: []
      tags:
        - Subscriptions
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: subscriptionId
        description: 'The ID of the subscription.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/subscriptions/{subscriptionId}/cancel':
    post:
      summary: 'Cancel Subscription'
      operationId: cancelSubscription
      description: 'Cancels a subscription immediately or at the end of the current period.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Subscriptions
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                at_period_end:
                  type: boolean
                  description: ''
                  example: true
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: subscriptionId
        description: 'The ID of the subscription.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/abandoned-checkouts':
    get:
      summary: 'Get Abandoned Checkouts'
      operationId: getAbandonedCheckouts
      description: 'Retrieves a paginated list of abandoned checkouts.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 3
                      status: created
                      price: '14.99'
                      currency: USD
                      gateway: null
                      payment_method_id: null
                      email: customer@sellauth.test
                      salt: bd4614f41919e
                      created_at: '2026-08-28T18:23:02.000000Z'
                      shop_customer_id: 1
                      abandoned_dismissed_at: null
                      abandoned_recovery_sent_at: null
                      unique_id: bd4614f41919e-0000000000003
                      customer:
                        id: 1
                        shop_id: 1
                        email: customer@sellauth.test
                        discord_id: null
                        discord_username: null
                      items: []
                      payment_method: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/abandoned-checkouts?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/abandoned-checkouts?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/abandoned-checkouts?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/abandoned-checkouts'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 3
                        status: created
                        price: '14.99'
                        currency: USD
                        gateway: null
                        payment_method_id: null
                        email: customer@sellauth.test
                        salt: bd4614f41919e
                        created_at: '2026-08-28T18:23:02.000000Z'
                        shop_customer_id: 1
                        abandoned_dismissed_at: null
                        abandoned_recovery_sent_at: null
                        unique_id: bd4614f41919e-0000000000003
                        customer:
                          id: 1
                          shop_id: 1
                          email: customer@sellauth.test
                          discord_id: null
                          discord_username: null
                        items: []
                        payment_method: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        status:
                          type: string
                          example: created
                        price:
                          type: string
                          example: '14.99'
                        currency:
                          type: string
                          example: USD
                        gateway:
                          type: string
                          example: null
                        payment_method_id:
                          type: string
                          example: null
                        email:
                          type: string
                          example: customer@sellauth.test
                        salt:
                          type: string
                          example: bd4614f41919e
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        shop_customer_id:
                          type: integer
                          example: 1
                        abandoned_dismissed_at:
                          type: string
                          example: null
                        abandoned_recovery_sent_at:
                          type: string
                          example: null
                        unique_id:
                          type: string
                          example: bd4614f41919e-0000000000003
                        customer:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            shop_id:
                              type: integer
                              example: 1
                            email:
                              type: string
                              example: customer@sellauth.test
                            discord_id:
                              type: string
                              example: null
                            discord_username:
                              type: string
                              example: null
                        items:
                          type: array
                          example: []
                        payment_method:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/abandoned-checkouts?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/abandoned-checkouts?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/abandoned-checkouts?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/abandoned-checkouts'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - 'Abandoned Checkouts'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                type:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - created
                    - pending
                    - all
                search:
                  type: string
                  description: 'Search by email. Must not be greater than 255 characters.'
                  example: null
                date_from:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                date_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after or equal to <code>date_from</code>.'
                  example: null
                include_dismissed:
                  type: boolean
                  description: 'Include dismissed checkouts.'
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/abandoned-checkouts/stats':
    get:
      summary: 'Get Abandoned Checkout Stats'
      operationId: getAbandonedCheckoutStats
      description: 'Retrieves abandoned checkout counts and recovery statistics.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  total: 1
                  ghost_count: 1
                  dropped_count: 0
                  dismissed_count: 0
                properties:
                  total:
                    type: integer
                    example: 1
                  ghost_count:
                    type: integer
                    example: 1
                  dropped_count:
                    type: integer
                    example: 0
                  dismissed_count:
                    type: integer
                    example: 0
      tags:
        - 'Abandoned Checkouts'
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/abandoned-checkouts/{invoiceId}/dismiss':
    post:
      summary: 'Dismiss Abandoned Checkout'
      operationId: dismissAbandonedCheckout
      description: 'Marks an abandoned checkout as dismissed.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Abandoned Checkouts'
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The ID of the abandoned checkout invoice.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/abandoned-checkouts/{invoiceId}/undismiss':
    post:
      summary: 'Undismiss Abandoned Checkout'
      operationId: undismissAbandonedCheckout
      description: 'Removes the dismissed status from an abandoned checkout.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Abandoned Checkouts'
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The ID of the abandoned checkout invoice.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/abandoned-checkouts/bulk-recover':
    post:
      summary: 'Bulk Recover Abandoned Checkouts'
      operationId: bulkRecoverAbandonedCheckouts
      description: 'Sends recovery emails for multiple abandoned checkouts at once.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Abandoned Checkouts'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                invoice_ids:
                  type: array
                  description: ''
                  example:
                    - 12
                  items:
                    type: integer
                coupon_id:
                  type: integer
                  description: ''
                  example: 12
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/abandoned-checkouts/{invoiceId}/recover':
    post:
      summary: 'Recover Abandoned Checkout'
      operationId: recoverAbandonedCheckout
      description: 'Sends a recovery email for an abandoned checkout, optionally with a coupon.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Abandoned Checkouts'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                coupon_id:
                  type: integer
                  description: ''
                  example: 12
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: invoiceId
        description: 'The ID of the abandoned checkout invoice.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/customers':
    get:
      summary: 'Get Customers'
      operationId: getCustomers
      description: 'Retrieves the customers.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 3
                      email: reseller@sellauth.test
                      discord_id: null
                      discord_username: null
                      balance: '100.00'
                      total_completed: 0
                      total_spent_usd: '0.00'
                      last_completed_at: null
                      newsletter_at: null
                      affiliate_code: null
                      affiliate_referrer_id: null
                      affiliate_referrer: null
                    -
                      id: 2
                      email: customer-240@sellauth.test
                      discord_id: null
                      discord_username: null
                      balance: '0.00'
                      total_completed: 0
                      total_spent_usd: '0.00'
                      last_completed_at: null
                      newsletter_at: null
                      affiliate_code: null
                      affiliate_referrer_id: null
                      affiliate_referrer: null
                    -
                      id: 1
                      email: customer@sellauth.test
                      discord_id: null
                      discord_username: null
                      balance: '0.00'
                      total_completed: 0
                      total_spent_usd: '0.00'
                      last_completed_at: null
                      newsletter_at: null
                      affiliate_code: PARTNER10
                      affiliate_referrer_id: null
                      affiliate_referrer: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/customers?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/customers?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/customers?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/customers'
                  per_page: 20
                  prev_page_url: null
                  to: 3
                  total: 3
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 3
                        email: reseller@sellauth.test
                        discord_id: null
                        discord_username: null
                        balance: '100.00'
                        total_completed: 0
                        total_spent_usd: '0.00'
                        last_completed_at: null
                        newsletter_at: null
                        affiliate_code: null
                        affiliate_referrer_id: null
                        affiliate_referrer: null
                      -
                        id: 2
                        email: customer-240@sellauth.test
                        discord_id: null
                        discord_username: null
                        balance: '0.00'
                        total_completed: 0
                        total_spent_usd: '0.00'
                        last_completed_at: null
                        newsletter_at: null
                        affiliate_code: null
                        affiliate_referrer_id: null
                        affiliate_referrer: null
                      -
                        id: 1
                        email: customer@sellauth.test
                        discord_id: null
                        discord_username: null
                        balance: '0.00'
                        total_completed: 0
                        total_spent_usd: '0.00'
                        last_completed_at: null
                        newsletter_at: null
                        affiliate_code: PARTNER10
                        affiliate_referrer_id: null
                        affiliate_referrer: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        email:
                          type: string
                          example: reseller@sellauth.test
                        discord_id:
                          type: string
                          example: null
                        discord_username:
                          type: string
                          example: null
                        balance:
                          type: string
                          example: '100.00'
                        total_completed:
                          type: integer
                          example: 0
                        total_spent_usd:
                          type: string
                          example: '0.00'
                        last_completed_at:
                          type: string
                          example: null
                        newsletter_at:
                          type: string
                          example: null
                        affiliate_code:
                          type: string
                          example: null
                        affiliate_referrer_id:
                          type: string
                          example: null
                        affiliate_referrer:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/customers?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/customers?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/customers?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/customers'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 3
                  total:
                    type: integer
                    example: 3
      tags:
        - Customers
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - email
                    - discord_id
                    - discord_username
                    - balance
                    - total_completed
                    - total_spent_usd
                    - last_completed_at
                    - newsletter_at
                    - affiliate_code
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                id:
                  type: string
                  description: 'Filter by customer ID.'
                  example: null
                email:
                  type: string
                  description: 'Filter by email.'
                  example: null
                discord_id:
                  type: string
                  description: ''
                  example: null
                discord_username:
                  type: string
                  description: ''
                  example: null
                subscribed:
                  type: string
                  description: 'Only newsletter subscribers.'
                  example: null
                affiliate_code:
                  type: string
                  description: 'Filter by affiliate code.'
                  example: null
                affiliate_referrer_email:
                  type: string
                  description: 'Filter by referring affiliate email.'
                  example: null
    post:
      summary: 'Create Customer'
      operationId: createCustomer
      description: 'Creates a customer by email, or returns the existing customer with that email.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Customers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: "The customer's email."
                  example: buyer@example.com
                phone_number:
                  type: string
                  description: "The customer's phone number."
                  example: null
              required:
                - email
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/customers/{customerId}':
    get:
      summary: 'Get Customer'
      operationId: getCustomer
      description: 'Retrieves a specific customer.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 2
                  email: customer-240@sellauth.test
                  shop_id: 1
                  user_id: null
                  balance: '0.00'
                  affiliate_balance: '0.00'
                  phone_number: null
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  deleted_at: null
                  otp_expires_at: null
                  total_completed: 0
                  total_spent_usd: '0.00'
                  last_completed_at: null
                  discord_id: null
                  discord_username: null
                  newsletter_at: null
                  affiliate_code: null
                  affiliate_status: null
                  affiliate_tier_id: null
                  affiliate_code_set_at: null
                  affiliate_referrer_id: null
                  affiliate_referrer_earnings: '0.00'
                  affiliate_referred_at: null
                  reseller_status: null
                  reseller_application_answer: null
                  reseller_applied_at: null
                  reseller_approved_at: null
                  reseller_tier_id: null
                  reseller_dd_enabled: false
                  reseller_total_spent_usd: 0
                  reseller_total_completed: 0
                  tfa_enabled: false
                  sessions: []
                  has_password: false
                properties:
                  id:
                    type: integer
                    example: 2
                  email:
                    type: string
                    example: customer-240@sellauth.test
                  shop_id:
                    type: integer
                    example: 1
                  user_id:
                    type: string
                    example: null
                  balance:
                    type: string
                    example: '0.00'
                  affiliate_balance:
                    type: string
                    example: '0.00'
                  phone_number:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  deleted_at:
                    type: string
                    example: null
                  otp_expires_at:
                    type: string
                    example: null
                  total_completed:
                    type: integer
                    example: 0
                  total_spent_usd:
                    type: string
                    example: '0.00'
                  last_completed_at:
                    type: string
                    example: null
                  discord_id:
                    type: string
                    example: null
                  discord_username:
                    type: string
                    example: null
                  newsletter_at:
                    type: string
                    example: null
                  affiliate_code:
                    type: string
                    example: null
                  affiliate_status:
                    type: string
                    example: null
                  affiliate_tier_id:
                    type: string
                    example: null
                  affiliate_code_set_at:
                    type: string
                    example: null
                  affiliate_referrer_id:
                    type: string
                    example: null
                  affiliate_referrer_earnings:
                    type: string
                    example: '0.00'
                  affiliate_referred_at:
                    type: string
                    example: null
                  reseller_status:
                    type: string
                    example: null
                  reseller_application_answer:
                    type: string
                    example: null
                  reseller_applied_at:
                    type: string
                    example: null
                  reseller_approved_at:
                    type: string
                    example: null
                  reseller_tier_id:
                    type: string
                    example: null
                  reseller_dd_enabled:
                    type: boolean
                    example: false
                  reseller_total_spent_usd:
                    type: integer
                    example: 0
                  reseller_total_completed:
                    type: integer
                    example: 0
                  tfa_enabled:
                    type: boolean
                    example: false
                  sessions:
                    type: array
                    example: []
                  has_password:
                    type: boolean
                    example: false
      tags:
        - Customers
    delete:
      summary: 'Delete Customer'
      operationId: deleteCustomer
      description: 'Deletes a customer in a shop.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Customers
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The customer ID.'
        example: 2
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/customers/{customerId}/balance-transactions':
    get:
      summary: 'Get Customer Balance Transactions'
      operationId: getCustomerBalanceTransactions
      description: 'Retrieves the balance transactions for a customer in a shop.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: a29cc119-29aa-414d-a360-797eff729ce0
                      type: incoming
                      description: 'Balance top up'
                      shop_customer_id: 2
                      invoice_id: null
                      amount: '25.00'
                      currency: USD
                      created_at: '2026-08-28T18:23:02.000000Z'
                      invoice: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/customers/2/balance-transactions?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/customers/2/balance-transactions?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/customers/2/balance-transactions?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/customers/2/balance-transactions'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: a29cc119-29aa-414d-a360-797eff729ce0
                        type: incoming
                        description: 'Balance top up'
                        shop_customer_id: 2
                        invoice_id: null
                        amount: '25.00'
                        currency: USD
                        created_at: '2026-08-28T18:23:02.000000Z'
                        invoice: null
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          example: a29cc119-29aa-414d-a360-797eff729ce0
                        type:
                          type: string
                          example: incoming
                        description:
                          type: string
                          example: 'Balance top up'
                        shop_customer_id:
                          type: integer
                          example: 2
                        invoice_id:
                          type: string
                          example: null
                        amount:
                          type: string
                          example: '25.00'
                        currency:
                          type: string
                          example: USD
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        invoice:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/customers/2/balance-transactions?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/customers/2/balance-transactions?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/customers/2/balance-transactions?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/customers/2/balance-transactions'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Customers
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The customer ID.'
        example: 2
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/customers/{customerId}/balance':
    put:
      summary: 'Edit Customer Balance'
      operationId: editCustomerBalance
      description: 'Adds or deducts balance to/from a customer in a shop.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Customers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                amount:
                  type: number
                  description: 'Must be at least -1000. Must not be greater than 1000.'
                  example: 15
                description:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: 'Quisquam recusandae asperiores accusamus.'
                invoice_id:
                  type: integer
                  description: ''
                  example: 12
              required:
                - amount
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: ''
        example: culpa
        required: true
        schema:
          type: string
  '/v1/shops/{shopId}/customers/{customerId}/token':
    post:
      summary: 'Create Customer Token'
      operationId: createCustomerToken
      description: 'Mints a customer-dashboard token so a custom storefront can act as this customer. Call this server-to-server only; never expose your API key in the browser. The customer can revoke minted tokens via "log out other sessions", so handle 401 responses by minting a new token.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Customers
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                expires_in:
                  type: integer
                  description: 'Token lifetime in seconds, 60 to 2592000 (30 days). Defaults to 30 days.'
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The customer ID.'
        example: 2
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/customers/{customerId}/password/remove':
    post:
      summary: 'Remove Customer Password'
      operationId: removeCustomerPassword
      description: "Removes a customer's password. The customer signs in with e-mail codes until they set a new one."
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Customers
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The customer ID.'
        example: 2
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/customers/{customerId}/tfa/disable':
    post:
      summary: 'Disable Customer Two-Factor Authentication'
      operationId: disableCustomerTwoFactorAuthentication
      description: "Disables a customer's two-factor authentication."
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Customers
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The customer ID.'
        example: 2
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/tickets':
    get:
      summary: 'Get Tickets'
      operationId: getTickets
      description: 'Retrieves the tickets.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: a0ec2492-c627-4b90-a390-6ca955902f27
                      shop_id: 1
                      shop_customer_id: 1
                      invoice_id: null
                      subject: 'Order question'
                      status: open
                      closed_at: null
                      archived_at: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      customer:
                        id: 1
                        shop_id: 1
                        email: customer@sellauth.test
                      last_message: null
                      invoice: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/tickets?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/tickets?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/tickets?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/tickets'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: a0ec2492-c627-4b90-a390-6ca955902f27
                        shop_id: 1
                        shop_customer_id: 1
                        invoice_id: null
                        subject: 'Order question'
                        status: open
                        closed_at: null
                        archived_at: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        customer:
                          id: 1
                          shop_id: 1
                          email: customer@sellauth.test
                        last_message: null
                        invoice: null
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          example: a0ec2492-c627-4b90-a390-6ca955902f27
                        shop_id:
                          type: integer
                          example: 1
                        shop_customer_id:
                          type: integer
                          example: 1
                        invoice_id:
                          type: string
                          example: null
                        subject:
                          type: string
                          example: 'Order question'
                        status:
                          type: string
                          example: open
                        closed_at:
                          type: string
                          example: null
                        archived_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        customer:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            shop_id:
                              type: integer
                              example: 1
                            email:
                              type: string
                              example: customer@sellauth.test
                        last_message:
                          type: string
                          example: null
                        invoice:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/tickets?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/tickets?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/tickets?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/tickets'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Tickets
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - subject
                    - created_at
                    - closed_at
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                id:
                  type: string
                  description: 'Filter by ticket ID.'
                  example: null
                statuses:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                customer_email:
                  type: string
                  description: 'Filter by customer email.'
                  example: null
                created_at_start:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                created_at_end:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>created_at_start</code>.'
                  example: null
                closed_at_start:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                closed_at_end:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>closed_at_start</code>.'
                  example: null
                archived:
                  type: string
                  description: 'Only archived tickets.'
                  example: null
    post:
      summary: 'Create Ticket'
      operationId: createTicket
      description: 'Creates a new ticket.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Tickets
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_id:
                  type: string
                  description: ''
                  example: culpa
                subject:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: asyzwszwtxpeqqi
                invoice_id:
                  type: string
                  description: ''
                  example: null
              required:
                - customer_id
                - subject
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/tickets/{ticketId}':
    get:
      summary: 'Get Ticket'
      operationId: getTicket
      description: 'Retrieves a specific ticket.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: a0ec2492-c627-4b90-a390-6ca955902f27
                  shop_id: 1
                  shop_customer_id: 1
                  invoice_id: null
                  subject: 'Order question'
                  status: open
                  closed_at: null
                  archived_at: null
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  messages: []
                  customer:
                    id: 1
                    email: customer@sellauth.test
                    shop_id: 1
                    user_id: null
                    balance: '0.00'
                    affiliate_balance: '0.00'
                    phone_number: null
                    created_at: '2026-08-28T18:23:02.000000Z'
                    updated_at: '2026-08-28T18:23:02.000000Z'
                    deleted_at: null
                    otp_expires_at: null
                    total_completed: 0
                    total_spent_usd: '0.00'
                    last_completed_at: null
                    discord_id: null
                    discord_username: null
                    newsletter_at: null
                    affiliate_code: PARTNER10
                    affiliate_status: null
                    affiliate_tier_id: null
                    affiliate_code_set_at: '2026-08-28 18:23:02'
                    affiliate_referrer_id: null
                    affiliate_referrer_earnings: '0.00'
                    affiliate_referred_at: null
                    reseller_status: null
                    reseller_application_answer: null
                    reseller_applied_at: null
                    reseller_approved_at: null
                    reseller_tier_id: null
                    reseller_dd_enabled: false
                    reseller_total_spent_usd: 0
                    reseller_total_completed: 0
                    tfa_enabled: false
                  invoice: null
                properties:
                  id:
                    type: string
                    example: a0ec2492-c627-4b90-a390-6ca955902f27
                  shop_id:
                    type: integer
                    example: 1
                  shop_customer_id:
                    type: integer
                    example: 1
                  invoice_id:
                    type: string
                    example: null
                  subject:
                    type: string
                    example: 'Order question'
                  status:
                    type: string
                    example: open
                  closed_at:
                    type: string
                    example: null
                  archived_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  messages:
                    type: array
                    example: []
                  customer:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      email:
                        type: string
                        example: customer@sellauth.test
                      shop_id:
                        type: integer
                        example: 1
                      user_id:
                        type: string
                        example: null
                      balance:
                        type: string
                        example: '0.00'
                      affiliate_balance:
                        type: string
                        example: '0.00'
                      phone_number:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      updated_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      deleted_at:
                        type: string
                        example: null
                      otp_expires_at:
                        type: string
                        example: null
                      total_completed:
                        type: integer
                        example: 0
                      total_spent_usd:
                        type: string
                        example: '0.00'
                      last_completed_at:
                        type: string
                        example: null
                      discord_id:
                        type: string
                        example: null
                      discord_username:
                        type: string
                        example: null
                      newsletter_at:
                        type: string
                        example: null
                      affiliate_code:
                        type: string
                        example: PARTNER10
                      affiliate_status:
                        type: string
                        example: null
                      affiliate_tier_id:
                        type: string
                        example: null
                      affiliate_code_set_at:
                        type: string
                        example: '2026-08-28 18:23:02'
                      affiliate_referrer_id:
                        type: string
                        example: null
                      affiliate_referrer_earnings:
                        type: string
                        example: '0.00'
                      affiliate_referred_at:
                        type: string
                        example: null
                      reseller_status:
                        type: string
                        example: null
                      reseller_application_answer:
                        type: string
                        example: null
                      reseller_applied_at:
                        type: string
                        example: null
                      reseller_approved_at:
                        type: string
                        example: null
                      reseller_tier_id:
                        type: string
                        example: null
                      reseller_dd_enabled:
                        type: boolean
                        example: false
                      reseller_total_spent_usd:
                        type: integer
                        example: 0
                      reseller_total_completed:
                        type: integer
                        example: 0
                      tfa_enabled:
                        type: boolean
                        example: false
                  invoice:
                    type: string
                    example: null
      tags:
        - Tickets
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: ticketId
        description: 'The ticket ID.'
        example: a0ec2492-c627-4b90-a390-6ca955902f27
        required: true
        schema:
          type: string
  '/v1/shops/{shopId}/tickets/{ticketId}/close':
    post:
      summary: 'Close Ticket'
      operationId: closeTicket
      description: 'Closes a ticket.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Tickets
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: ticketId
        description: 'The ticket ID.'
        example: a0ec2492-c627-4b90-a390-6ca955902f27
        required: true
        schema:
          type: string
  '/v1/shops/{shopId}/tickets/{ticketId}/reopen':
    post:
      summary: 'Reopen Ticket'
      operationId: reopenTicket
      description: 'Reopens a ticket.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Tickets
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: ticketId
        description: 'The ticket ID.'
        example: a0ec2492-c627-4b90-a390-6ca955902f27
        required: true
        schema:
          type: string
  '/v1/shops/{shopId}/tickets/{ticketId}/archive':
    post:
      summary: 'Archive Ticket'
      operationId: archiveTicket
      description: 'Archives a ticket.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Tickets
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: ticketId
        description: 'The ticket ID.'
        example: a0ec2492-c627-4b90-a390-6ca955902f27
        required: true
        schema:
          type: string
  '/v1/shops/{shopId}/tickets/{ticketId}/unarchive':
    post:
      summary: 'Unarchive Ticket'
      operationId: unarchiveTicket
      description: 'Unarchives a ticket.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Tickets
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: ticketId
        description: 'The ticket ID.'
        example: a0ec2492-c627-4b90-a390-6ca955902f27
        required: true
        schema:
          type: string
  '/v1/shops/{shopId}/tickets/{ticketId}/messages':
    post:
      summary: 'Send Ticket Message'
      operationId: sendTicketMessage
      description: 'Sends a message to a ticket.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Tickets
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                content:
                  type: string
                  description: 'Must not be greater than 8000 characters.'
                  example: pasyzwszwtxpeqq
              required:
                - content
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: ticketId
        description: 'The ticket ID.'
        example: a0ec2492-c627-4b90-a390-6ca955902f27
        required: true
        schema:
          type: string
  '/v1/shops/{shopId}/tickets/{ticketId}/messages/{messageId}':
    delete:
      summary: 'Delete Ticket Message'
      operationId: deleteTicketMessage
      description: 'Deletes a message from a ticket.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Tickets
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: ticketId
        description: 'The ID of the ticket.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: messageId
        description: 'The ID of the ticket message.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/feedbacks':
    get:
      summary: 'Get Feedbacks'
      operationId: getFeedbacks
      description: 'Retrieves the feedbacks.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      invoice_id: 1
                      status: published
                      message: 'Great product, instant delivery.'
                      image: null
                      rating: 5
                      is_automatic: false
                      reply: null
                      dispute_reason: null
                      disputed_at: null
                      replied_at: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                      image_url: null
                      invoice:
                        id: 1
                        salt: e1ba502e01286
                        email: customer@sellauth.test
                        unique_id: e1ba502e01286-0000000000001
                        items:
                          -
                            id: 1
                            invoice_id: 1
                            product_id: 1
                            variant_id: 1
                            custom_name: null
                            product:
                              id: 1
                              name: 'License Keys'
                              stock_count: 0
                            variant:
                              id: 1
                              name: Standard
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/feedbacks?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/feedbacks?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/feedbacks?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/feedbacks'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        invoice_id: 1
                        status: published
                        message: 'Great product, instant delivery.'
                        image: null
                        rating: 5
                        is_automatic: false
                        reply: null
                        dispute_reason: null
                        disputed_at: null
                        replied_at: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                        image_url: null
                        invoice:
                          id: 1
                          salt: e1ba502e01286
                          email: customer@sellauth.test
                          unique_id: e1ba502e01286-0000000000001
                          items:
                            -
                              id: 1
                              invoice_id: 1
                              product_id: 1
                              variant_id: 1
                              custom_name: null
                              product:
                                id: 1
                                name: 'License Keys'
                                stock_count: 0
                              variant:
                                id: 1
                                name: Standard
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        invoice_id:
                          type: integer
                          example: 1
                        status:
                          type: string
                          example: published
                        message:
                          type: string
                          example: 'Great product, instant delivery.'
                        image:
                          type: string
                          example: null
                        rating:
                          type: integer
                          example: 5
                        is_automatic:
                          type: boolean
                          example: false
                        reply:
                          type: string
                          example: null
                        dispute_reason:
                          type: string
                          example: null
                        disputed_at:
                          type: string
                          example: null
                        replied_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        deleted_at:
                          type: string
                          example: null
                        image_url:
                          type: string
                          example: null
                        invoice:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            salt:
                              type: string
                              example: e1ba502e01286
                            email:
                              type: string
                              example: customer@sellauth.test
                            unique_id:
                              type: string
                              example: e1ba502e01286-0000000000001
                            items:
                              type: array
                              example:
                                -
                                  id: 1
                                  invoice_id: 1
                                  product_id: 1
                                  variant_id: 1
                                  custom_name: null
                                  product:
                                    id: 1
                                    name: 'License Keys'
                                    stock_count: 0
                                  variant:
                                    id: 1
                                    name: Standard
                              items:
                                type: object
                                properties:
                                  id:
                                    type: integer
                                    example: 1
                                  invoice_id:
                                    type: integer
                                    example: 1
                                  product_id:
                                    type: integer
                                    example: 1
                                  variant_id:
                                    type: integer
                                    example: 1
                                  custom_name:
                                    type: string
                                    example: null
                                  product:
                                    type: object
                                    properties:
                                      id: { type: integer, example: 1 }
                                      name: { type: string, example: 'License Keys' }
                                      stock_count: { type: integer, example: 0 }
                                  variant:
                                    type: object
                                    properties:
                                      id: { type: integer, example: 1 }
                                      name: { type: string, example: Standard }
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/feedbacks?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/feedbacks?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/feedbacks?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/feedbacks'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Feedbacks
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - status
                    - rating
                    - reply
                    - created_at
                    - updated_at
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                id:
                  type: string
                  description: 'Filter by feedback ID.'
                  example: null
                statuses:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                invoice_id:
                  type: string
                  description: 'Filter by invoice ID.'
                  example: null
                rating:
                  type: integer
                  description: 'Filter by rating, 1-5. Must be at least 1. Must not be greater than 5.'
                  example: null
                invoice_email:
                  type: string
                  description: 'Filter by customer email.'
                  example: null
                message_keyword:
                  type: string
                  description: 'Search in feedback messages.'
                  example: null
                is_automatic:
                  type: boolean
                  description: 'Only automatic feedbacks.'
                  example: null
                created_at_start:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                created_at_end:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>created_at_start</code>.'
                  example: null
                reply_keyword:
                  type: string
                  description: 'Search in replies.'
                  example: null
                has_reply:
                  type: boolean
                  description: 'Only feedbacks with a reply.'
                  example: null
                product_name:
                  type: string
                  description: ''
                  example: null
                variant_name:
                  type: string
                  description: ''
                  example: null
                product_id:
                  type: string
                  description: ''
                  example: null
                variant_id:
                  type: string
                  description: ''
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/feedbacks/stats':
    get:
      summary: 'Get Feedback Stats'
      operationId: getFeedbackStats
      description: 'Retrieves feedback statistics for a shop.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  total: 1
                  published: 1
                  pending_disputes: 0
                  replied: 0
                  automatic: 0
                  reply_rate: 0
                  average_rating: 5
                  by_rating:
                    '1': 0
                    '2': 0
                    '3': 0
                    '4': 0
                    '5': 1
                properties:
                  total:
                    type: integer
                    example: 1
                  published:
                    type: integer
                    example: 1
                  pending_disputes:
                    type: integer
                    example: 0
                  replied:
                    type: integer
                    example: 0
                  automatic:
                    type: integer
                    example: 0
                  reply_rate:
                    type: integer
                    example: 0
                  average_rating:
                    type: integer
                    example: 5
                  by_rating:
                    type: object
                    properties:
                      1:
                        type: integer
                        example: 0
                      2:
                        type: integer
                        example: 0
                      3:
                        type: integer
                        example: 0
                      4:
                        type: integer
                        example: 0
                      5:
                        type: integer
                        example: 1
      tags:
        - Feedbacks
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                created_at_start:
                  type: string
                  description: 'Must be a valid date.'
                  example: '2026-08-28T18:23:04'
                created_at_end:
                  type: string
                  description: 'Must be a valid date.'
                  example: '2026-08-28T18:23:04'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/feedbacks/{feedbackId}':
    get:
      summary: 'Get Feedback'
      operationId: getFeedback
      description: 'Retrieves a specific feedback.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  feedback:
                    id: 1
                    salt: beb4969cda4b9
                    shop_id: 1
                    invoice_id: 1
                    status: published
                    message: 'Great product, instant delivery.'
                    image: null
                    rating: 5
                    is_automatic: false
                    edit_count: 0
                    reply: null
                    dispute_reason: null
                    disputed_at: null
                    created_at: '2026-08-28T18:23:02.000000Z'
                    edited_at: null
                    updated_at: '2026-08-28T18:23:02.000000Z'
                    replied_at: null
                    deleted_at: null
                    image_url: null
                properties:
                  feedback:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      salt:
                        type: string
                        example: beb4969cda4b9
                      shop_id:
                        type: integer
                        example: 1
                      invoice_id:
                        type: integer
                        example: 1
                      status:
                        type: string
                        example: published
                      message:
                        type: string
                        example: 'Great product, instant delivery.'
                      image:
                        type: string
                        example: null
                      rating:
                        type: integer
                        example: 5
                      is_automatic:
                        type: boolean
                        example: false
                      edit_count:
                        type: integer
                        example: 0
                      reply:
                        type: string
                        example: null
                      dispute_reason:
                        type: string
                        example: null
                      disputed_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      edited_at:
                        type: string
                        example: null
                      updated_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      replied_at:
                        type: string
                        example: null
                      deleted_at:
                        type: string
                        example: null
                      image_url:
                        type: string
                        example: null
      tags:
        - Feedbacks
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: feedbackId
        description: 'The feedback ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/feedbacks/{feedbackId}/reply':
    post:
      summary: 'Reply to Feedback'
      operationId: replyToFeedback
      description: 'Replies to a specific feedback.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Feedbacks
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                reply:
                  type: string
                  description: ''
                  example: culpa
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: feedbackId
        description: 'The feedback ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/feedbacks/{feedbackId}/dispute':
    post:
      summary: 'Dispute Feedback'
      operationId: disputeFeedback
      description: 'Disputes a specific feedback.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Feedbacks
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                reason:
                  type: string
                  description: ''
                  example: culpa
              required:
                - reason
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: feedbackId
        description: 'The feedback ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/feedbacks/{feedbackId}/cancel-dispute':
    post:
      summary: 'Cancel Feedback Dispute'
      operationId: cancelFeedbackDispute
      description: 'Cancels an existing dispute for a specific feedback.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Feedbacks
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: feedbackId
        description: 'The feedback ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/feedbacks/delete-automatic':
    post:
      summary: 'Delete Automatic Feedbacks'
      operationId: deleteAutomaticFeedbacks
      description: 'Deletes all automatic feedbacks.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Feedbacks
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blacklist/export':
    get:
      summary: 'Export Blacklist'
      operationId: exportBlacklist
      description: 'Exports the blacklist entries to CSV. Accepts the same filters as Get Blacklist. Limited to 50000 rows.'
      parameters: []
      responses:
        200:
          description: 'CSV file download'
          content:
            text/plain:
              schema:
                type: string
                example: "ID,Type,Match Type,Value,Reason,Message,Enabled,Payment Method IDs,Active From,Active To,Created At,Updated At\n1,email,exact,blocked@sellauth.test,Example entry,,1,,,,2026-07-24 12:00:00,2026-07-24 12:00:00"
      tags:
        - Blacklist
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - value
                    - type
                    - match_type
                    - reason
                    - enabled
                    - created_at
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                id:
                  type: string
                  description: 'Filter by entry ID.'
                  example: null
                types:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                match_type:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - exact
                    - regex
                value:
                  type: string
                  description: 'Filter by blacklisted value.'
                  example: null
                reason:
                  type: string
                  description: 'Filter by reason.'
                  example: null
                message:
                  type: string
                  description: 'Filter by message.'
                  example: null
                payment_method_ids:
                  type: object
                  description: 'Filter by payment method IDs.'
                  example: null
                  properties: {  }
                enabled:
                  type: boolean
                  description: 'Only enabled or disabled entries.'
                  example: null
                active_from:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                active_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>active_from</code>.'
                  example: null
                created_at_from:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                created_at_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>created_at_from</code>.'
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blacklist':
    get:
      summary: 'Get Blacklist'
      operationId: getBlacklist
      description: 'Retrieves the blacklist entries.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      type: email
                      match_type: exact
                      value: blocked@sellauth.test
                      payment_method_ids: null
                      reason: 'Example entry'
                      message: null
                      enabled: true
                      active_from: null
                      active_to: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/blacklist?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/blacklist?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/blacklist?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/blacklist'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        type: email
                        match_type: exact
                        value: blocked@sellauth.test
                        payment_method_ids: null
                        reason: 'Example entry'
                        message: null
                        enabled: true
                        active_from: null
                        active_to: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        type:
                          type: string
                          example: email
                        match_type:
                          type: string
                          example: exact
                        value:
                          type: string
                          example: blocked@sellauth.test
                        payment_method_ids:
                          type: string
                          example: null
                        reason:
                          type: string
                          example: 'Example entry'
                        message:
                          type: string
                          example: null
                        enabled:
                          type: boolean
                          example: true
                        active_from:
                          type: string
                          example: null
                        active_to:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        deleted_at:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/blacklist?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/blacklist?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/blacklist?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/blacklist'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Blacklist
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - value
                    - type
                    - match_type
                    - reason
                    - enabled
                    - created_at
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                id:
                  type: string
                  description: 'Filter by entry ID.'
                  example: null
                types:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                match_type:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - exact
                    - regex
                value:
                  type: string
                  description: 'Filter by blacklisted value.'
                  example: null
                reason:
                  type: string
                  description: 'Filter by reason.'
                  example: null
                message:
                  type: string
                  description: 'Filter by message.'
                  example: null
                payment_method_ids:
                  type: object
                  description: 'Filter by payment method IDs.'
                  example: null
                  properties: {  }
                enabled:
                  type: boolean
                  description: 'Only enabled or disabled entries.'
                  example: null
                active_from:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                active_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>active_from</code>.'
                  example: null
                created_at_from:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                created_at_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>created_at_from</code>.'
                  example: null
    post:
      summary: 'Create Blacklist Entry'
      operationId: createBlacklistEntry
      description: 'Creates a new blacklist entry.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Blacklist
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                value:
                  type: string
                  description: ''
                  example: culpa
                type:
                  type: string
                  description: ''
                  example: email
                  enum:
                    - email
                    - email_domain
                    - disposable_email
                    - discord_id
                    - country_code
                    - city
                    - ip
                    - ip_range
                    - isp
                    - asn
                    - vpn
                    - tor
                    - user_agent
                match_type:
                  type: string
                  description: ''
                  example: exact
                  enum:
                    - exact
                    - regex
                reason:
                  type: string
                  description: ''
                  example: culpa
                message:
                  type: string
                  description: ''
                  example: culpa
                payment_method_ids:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                enabled:
                  type: boolean
                  description: ''
                  example: false
                active_from:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                active_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>active_from</code>. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
              required:
                - value
                - type
                - match_type
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blacklist/{blacklistId}':
    get:
      summary: 'Get Blacklist Entry'
      operationId: getBlacklistEntry
      description: 'Retrieves a specific blacklist entry.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  shop_id: 1
                  type: email
                  match_type: exact
                  value: blocked@sellauth.test
                  payment_method_ids: null
                  reason: 'Example entry'
                  message: null
                  enabled: true
                  active_from: null
                  active_to: null
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  deleted_at: null
                properties:
                  id:
                    type: integer
                    example: 1
                  shop_id:
                    type: integer
                    example: 1
                  type:
                    type: string
                    example: email
                  match_type:
                    type: string
                    example: exact
                  value:
                    type: string
                    example: blocked@sellauth.test
                  payment_method_ids:
                    type: string
                    example: null
                  reason:
                    type: string
                    example: 'Example entry'
                  message:
                    type: string
                    example: null
                  enabled:
                    type: boolean
                    example: true
                  active_from:
                    type: string
                    example: null
                  active_to:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  deleted_at:
                    type: string
                    example: null
      tags:
        - Blacklist
    delete:
      summary: 'Delete Blacklist Entry'
      operationId: deleteBlacklistEntry
      description: 'Deletes a specific blacklist entry.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Blacklist
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: blacklistId
        description: 'The blacklist entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blacklist/{blacklistId}/update':
    put:
      summary: 'Update Blacklist Entry'
      operationId: updateBlacklistEntry
      description: 'Updates a specific blacklist entry.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Blacklist
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: integer
                  description: ''
                  example: 12
                value:
                  type: string
                  description: ''
                  example: culpa
                type:
                  type: string
                  description: ''
                  example: email
                  enum:
                    - email
                    - email_domain
                    - disposable_email
                    - discord_id
                    - country_code
                    - city
                    - ip
                    - ip_range
                    - isp
                    - asn
                    - vpn
                    - tor
                    - user_agent
                match_type:
                  type: string
                  description: ''
                  example: exact
                  enum:
                    - exact
                    - regex
                reason:
                  type: string
                  description: ''
                  example: culpa
                message:
                  type: string
                  description: ''
                  example: culpa
                payment_method_ids:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                enabled:
                  type: boolean
                  description: ''
                  example: false
                active_from:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                active_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>active_from</code>. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
              required:
                - id
                - value
                - type
                - match_type
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: blacklistId
        description: 'The blacklist entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blacklist/{blacklistId}/toggle':
    post:
      summary: 'Toggle Blacklist Entry Status'
      operationId: toggleBlacklistEntryStatus
      description: 'Toggles the active status of a specific blacklist entry.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Blacklist
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: blacklistId
        description: 'The blacklist entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/blacklist-logs':
    get:
      summary: 'Get Blacklist Logs'
      operationId: getBlacklistLogs
      description: 'Retrieves the blacklist logs.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      value: blocked@sellauth.test
                      decision: block
                      rule_id: 1
                      rule_type: blacklist
                      invoice_id: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      rule:
                        id: 1
                        value: blocked@sellauth.test
                        type: email
                      invoice: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/blacklist-logs?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/blacklist-logs?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/blacklist-logs?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/blacklist-logs'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        value: blocked@sellauth.test
                        decision: block
                        rule_id: 1
                        rule_type: blacklist
                        invoice_id: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        rule:
                          id: 1
                          value: blocked@sellauth.test
                          type: email
                        invoice: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        value:
                          type: string
                          example: blocked@sellauth.test
                        decision:
                          type: string
                          example: block
                        rule_id:
                          type: integer
                          example: 1
                        rule_type:
                          type: string
                          example: blacklist
                        invoice_id:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        rule:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            value:
                              type: string
                              example: blocked@sellauth.test
                            type:
                              type: string
                              example: email
                        invoice:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/blacklist-logs?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/blacklist-logs?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/blacklist-logs?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/blacklist-logs'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Blacklist
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - value
                    - decision
                    - rule_id
                    - rule_type
                    - invoice_id
                    - created_at
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                id:
                  type: integer
                  description: 'Filter by log ID.'
                  example: null
                value:
                  type: string
                  description: 'Filter by matched value.'
                  example: null
                decision:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - allow
                    - block
                rule_type:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - blacklist
                    - whitelist
                rule_id:
                  type: integer
                  description: 'Filter by rule ID.'
                  example: null
                created_at_start:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                created_at_end:
                  type: string
                  description: 'Must be a valid date. Must be a date after or equal to <code>created_at_start</code>.'
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/whitelist/export':
    get:
      summary: 'Export Whitelist'
      operationId: exportWhitelist
      description: 'Exports the whitelist entries to CSV. Accepts the same filters as Get Whitelist. Limited to 50000 rows.'
      parameters: []
      responses:
        200:
          description: 'CSV file download'
          content:
            text/plain:
              schema:
                type: string
                example: "ID,Type,Value,Reason,Enabled,Payment Method IDs,Active From,Active To,Created At,Updated At\n1,email,trusted@sellauth.test,Example entry,1,,,,2026-07-24 12:00:00,2026-07-24 12:00:00"
      tags:
        - Whitelist
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - value
                    - type
                    - reason
                    - enabled
                    - created_at
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                id:
                  type: string
                  description: 'Filter by entry ID.'
                  example: null
                types:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                value:
                  type: string
                  description: 'Filter by whitelisted value.'
                  example: null
                reason:
                  type: string
                  description: 'Filter by reason.'
                  example: null
                payment_method_ids:
                  type: object
                  description: 'Filter by payment method IDs.'
                  example: null
                  properties: {  }
                enabled:
                  type: boolean
                  description: 'Only enabled or disabled entries.'
                  example: null
                active_from:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                active_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>active_from</code>.'
                  example: null
                created_at_from:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                created_at_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>created_at_from</code>.'
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/whitelist':
    get:
      summary: 'Get Whitelist'
      operationId: getWhitelist
      description: 'Retrieves the whitelist entries.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      type: email
                      value: trusted@sellauth.test
                      payment_method_ids: null
                      reason: 'Example entry'
                      enabled: true
                      active_from: null
                      active_to: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/whitelist?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/whitelist?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/whitelist?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/whitelist'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        type: email
                        value: trusted@sellauth.test
                        payment_method_ids: null
                        reason: 'Example entry'
                        enabled: true
                        active_from: null
                        active_to: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        type:
                          type: string
                          example: email
                        value:
                          type: string
                          example: trusted@sellauth.test
                        payment_method_ids:
                          type: string
                          example: null
                        reason:
                          type: string
                          example: 'Example entry'
                        enabled:
                          type: boolean
                          example: true
                        active_from:
                          type: string
                          example: null
                        active_to:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        deleted_at:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/whitelist?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/whitelist?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/whitelist?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/whitelist'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Whitelist
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - value
                    - type
                    - reason
                    - enabled
                    - created_at
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                id:
                  type: string
                  description: 'Filter by entry ID.'
                  example: null
                types:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                value:
                  type: string
                  description: 'Filter by whitelisted value.'
                  example: null
                reason:
                  type: string
                  description: 'Filter by reason.'
                  example: null
                payment_method_ids:
                  type: object
                  description: 'Filter by payment method IDs.'
                  example: null
                  properties: {  }
                enabled:
                  type: boolean
                  description: 'Only enabled or disabled entries.'
                  example: null
                active_from:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                active_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>active_from</code>.'
                  example: null
                created_at_from:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                created_at_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>created_at_from</code>.'
                  example: null
    post:
      summary: 'Create Whitelist Entry'
      operationId: createWhitelistEntry
      description: 'Creates a new whitelist entry.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Whitelist
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                value:
                  type: string
                  description: ''
                  example: culpa
                type:
                  type: string
                  description: ''
                  example: isp
                  enum:
                    - email
                    - email_domain
                    - discord_id
                    - country_code
                    - city
                    - ip
                    - ip_range
                    - isp
                    - asn
                    - user_agent
                reason:
                  type: string
                  description: ''
                  example: culpa
                payment_method_ids:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                enabled:
                  type: boolean
                  description: ''
                  example: false
                active_from:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                active_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>active_from</code>. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
              required:
                - value
                - type
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/whitelist/{whitelistId}':
    get:
      summary: 'Get Whitelist Entry'
      operationId: getWhitelistEntry
      description: 'Retrieves a specific whitelist entry.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  shop_id: 1
                  type: email
                  value: trusted@sellauth.test
                  payment_method_ids: null
                  reason: 'Example entry'
                  enabled: true
                  active_from: null
                  active_to: null
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  deleted_at: null
                properties:
                  id:
                    type: integer
                    example: 1
                  shop_id:
                    type: integer
                    example: 1
                  type:
                    type: string
                    example: email
                  value:
                    type: string
                    example: trusted@sellauth.test
                  payment_method_ids:
                    type: string
                    example: null
                  reason:
                    type: string
                    example: 'Example entry'
                  enabled:
                    type: boolean
                    example: true
                  active_from:
                    type: string
                    example: null
                  active_to:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  deleted_at:
                    type: string
                    example: null
      tags:
        - Whitelist
    delete:
      summary: 'Delete Whitelist Entry'
      operationId: deleteWhitelistEntry
      description: 'Deletes a specific whitelist entry.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Whitelist
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: whitelistId
        description: 'The whitelist entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/whitelist/{whitelistId}/update':
    put:
      summary: 'Update Whitelist Entry'
      operationId: updateWhitelistEntry
      description: 'Updates a specific whitelist entry.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Whitelist
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: integer
                  description: ''
                  example: 12
                value:
                  type: string
                  description: ''
                  example: culpa
                type:
                  type: string
                  description: ''
                  example: isp
                  enum:
                    - email
                    - email_domain
                    - discord_id
                    - country_code
                    - city
                    - ip
                    - ip_range
                    - isp
                    - asn
                    - user_agent
                reason:
                  type: string
                  description: ''
                  example: culpa
                payment_method_ids:
                  type: array
                  description: ''
                  example: null
                  items:
                    type: string
                enabled:
                  type: boolean
                  description: ''
                  example: false
                active_from:
                  type: string
                  description: 'Must be a valid date. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
                active_to:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>active_from</code>. Must be a date before <code>2038-01-19</code>.'
                  example: '2020-08-22'
              required:
                - id
                - value
                - type
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: whitelistId
        description: 'The whitelist entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/whitelist/{whitelistId}/toggle':
    post:
      summary: 'Toggle Whitelist Entry Status'
      operationId: toggleWhitelistEntryStatus
      description: 'Toggles the active status of a specific whitelist entry.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Whitelist
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: whitelistId
        description: 'The whitelist entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/payment-methods':
    get:
      summary: 'Get Payment Methods'
      operationId: getPaymentMethods
      description: 'Retrieves the payment methods.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      type: stripe
                      name: Stripe
                      checkout_name: null
                      icon_image_id: null
                      percentage_fee: 0
                      fixed_fee: 0
                      min_amount: null
                      max_amount: null
                      currency_override: null
                      hide_powered_by: false
                      is_active: true
                      order: 0
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                      icon_image_url: null
                      icon_image: null
                    -
                      id: 2
                      shop_id: 1
                      type: CUSTOMERBALANCE
                      name: 'Customer Balance'
                      checkout_name: null
                      icon_image_id: null
                      percentage_fee: 0
                      fixed_fee: 0
                      min_amount: null
                      max_amount: null
                      currency_override: null
                      hide_powered_by: false
                      is_active: true
                      order: 0
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                      icon_image_url: null
                      icon_image: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/payment-methods?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/payment-methods?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/payment-methods?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/payment-methods'
                  per_page: 100
                  prev_page_url: null
                  to: 2
                  total: 2
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        type: stripe
                        name: Stripe
                        checkout_name: null
                        icon_image_id: null
                        percentage_fee: 0
                        fixed_fee: 0
                        min_amount: null
                        max_amount: null
                        currency_override: null
                        hide_powered_by: false
                        is_active: true
                        order: 0
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                        icon_image_url: null
                        icon_image: null
                      -
                        id: 2
                        shop_id: 1
                        type: CUSTOMERBALANCE
                        name: 'Customer Balance'
                        checkout_name: null
                        icon_image_id: null
                        percentage_fee: 0
                        fixed_fee: 0
                        min_amount: null
                        max_amount: null
                        currency_override: null
                        hide_powered_by: false
                        is_active: true
                        order: 0
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                        icon_image_url: null
                        icon_image: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        type:
                          type: string
                          example: stripe
                        name:
                          type: string
                          example: Stripe
                        checkout_name:
                          type: string
                          example: null
                        icon_image_id:
                          type: string
                          example: null
                        percentage_fee:
                          type: integer
                          example: 0
                        fixed_fee:
                          type: integer
                          example: 0
                        min_amount:
                          type: string
                          example: null
                        max_amount:
                          type: string
                          example: null
                        currency_override:
                          type: string
                          example: null
                        hide_powered_by:
                          type: boolean
                          example: false
                        is_active:
                          type: boolean
                          example: true
                        order:
                          type: integer
                          example: 0
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        deleted_at:
                          type: string
                          example: null
                        icon_image_url:
                          type: string
                          example: null
                        icon_image:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/payment-methods?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/payment-methods?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/payment-methods?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/payment-methods'
                  per_page:
                    type: integer
                    example: 100
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 2
                  total:
                    type: integer
                    example: 2
      tags:
        - 'Payment Methods'
    post:
      summary: 'Create Payment Method'
      operationId: createPaymentMethod
      description: 'Creates a new payment method.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Payment Methods'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                type:
                  type: string
                  description: ''
                  example: PAYPAL
                  enum:
                    - CUSTOMERBALANCE
                    - BTC
                    - LTC
                    - ETH
                    - ETH_USDT
                    - ETH_USDC
                    - SOL
                    - SOL_USDT
                    - SOL_USDC
                    - PAYPAL
                    - STRIPE
                    - SQUARE
                    - CASHAPP
                    - VENMO
                    - REWARBLE
                    - PAYPALFF
                    - AMAZONPS
                    - SUMUP
                    - MOLLIE
                    - SKRILL
                    - AUTHORIZENET
                    - REVOLUTBUSINESS
                    - LEMONSQUEEZY
                    - NMI
                    - OVERPAY
                    - MONEI
                    - RAZORPAY
                    - MERCADOPAGO
                    - PANDABASE
                    - VENPAYR
                    - MISTICPAY
                    - OVGC
                    - WHOP
                    - ADYEN
                    - SHOPIFY
                    - MANUAL
                name:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: asyzwszwtxpeqqi
                checkout_name:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: kymwkiinfowtzmi
                icon_image_id:
                  type: integer
                  description: ''
                  example: 12
                label:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: asyzwszwtxpeqqi
                fixed_fee:
                  type: number
                  description: 'Must be at least -100. Must not be greater than 100.'
                  example: 10
                percentage_fee:
                  type: number
                  description: 'Must be at least -50. Must not be greater than 50.'
                  example: 24
                min_amount:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 999999.'
                  example: 12
                max_amount:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 999999.'
                  example: 22
                currency_override:
                  type: string
                  description: 'Must not be greater than 3 characters.'
                  example: ki
                hide_powered_by:
                  type: boolean
                  description: ''
                  example: true
                is_active:
                  type: boolean
                  description: ''
                  example: true
                settings:
                  type: object
                  description: ''
                  example: null
                  properties: {  }
                password:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: Usi|L@vHT
                otp:
                  type: string
                  description: 'Must not be greater than 6 characters.'
                  example: lowy
                tfa_code:
                  type: string
                  description: 'Must not be greater than 8 characters.'
                  example: uffsz
                remember_mfa:
                  type: boolean
                  description: ''
                  example: false
              required:
                - type
                - name
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/payment-methods/{paymentMethodId}':
    get:
      summary: 'Get Payment Method'
      operationId: getPaymentMethod
      description: 'Retrieves a specific payment method.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  shop_id: 1
                  type: stripe
                  name: Stripe
                  checkout_name: null
                  icon_image_id: null
                  percentage_fee: 0
                  fixed_fee: 0
                  min_amount: null
                  max_amount: null
                  currency_override: null
                  hide_powered_by: false
                  is_active: true
                  order: 0
                  created_at: '2026-08-28T18:23:02.000000Z'
                  updated_at: '2026-08-28T18:23:02.000000Z'
                  deleted_at: null
                  icon_image_url: null
                  settings: []
                  icon_image: null
                properties:
                  id:
                    type: integer
                    example: 1
                  shop_id:
                    type: integer
                    example: 1
                  type:
                    type: string
                    example: stripe
                  name:
                    type: string
                    example: Stripe
                  checkout_name:
                    type: string
                    example: null
                  icon_image_id:
                    type: string
                    example: null
                  percentage_fee:
                    type: integer
                    example: 0
                  fixed_fee:
                    type: integer
                    example: 0
                  min_amount:
                    type: string
                    example: null
                  max_amount:
                    type: string
                    example: null
                  currency_override:
                    type: string
                    example: null
                  hide_powered_by:
                    type: boolean
                    example: false
                  is_active:
                    type: boolean
                    example: true
                  order:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-08-28T18:23:02.000000Z'
                  deleted_at:
                    type: string
                    example: null
                  icon_image_url:
                    type: string
                    example: null
                  settings:
                    type: array
                    example: []
                  icon_image:
                    type: string
                    example: null
      tags:
        - 'Payment Methods'
    put:
      summary: 'Update Payment Method'
      operationId: updatePaymentMethod
      description: 'Updates a payment method.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Payment Methods'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                type:
                  type: string
                  description: ''
                  example: PAYPAL
                  enum:
                    - CUSTOMERBALANCE
                    - BTC
                    - LTC
                    - ETH
                    - ETH_USDT
                    - ETH_USDC
                    - SOL
                    - SOL_USDT
                    - SOL_USDC
                    - PAYPAL
                    - STRIPE
                    - SQUARE
                    - CASHAPP
                    - VENMO
                    - REWARBLE
                    - PAYPALFF
                    - AMAZONPS
                    - SUMUP
                    - MOLLIE
                    - SKRILL
                    - AUTHORIZENET
                    - REVOLUTBUSINESS
                    - LEMONSQUEEZY
                    - NMI
                    - OVERPAY
                    - MONEI
                    - RAZORPAY
                    - MERCADOPAGO
                    - PANDABASE
                    - VENPAYR
                    - MISTICPAY
                    - OVGC
                    - WHOP
                    - ADYEN
                    - SHOPIFY
                    - MANUAL
                name:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: asyzwszwtxpeqqi
                checkout_name:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: kymwkiinfowtzmi
                icon_image_id:
                  type: integer
                  description: ''
                  example: 12
                label:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: asyzwszwtxpeqqi
                fixed_fee:
                  type: number
                  description: 'Must be at least -100. Must not be greater than 100.'
                  example: 10
                percentage_fee:
                  type: number
                  description: 'Must be at least -50. Must not be greater than 50.'
                  example: 24
                min_amount:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 999999.'
                  example: 12
                max_amount:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 999999.'
                  example: 22
                currency_override:
                  type: string
                  description: 'Must not be greater than 3 characters.'
                  example: ki
                hide_powered_by:
                  type: boolean
                  description: ''
                  example: true
                is_active:
                  type: boolean
                  description: ''
                  example: true
                settings:
                  type: object
                  description: ''
                  example: null
                  properties: {  }
                password:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: Usi|L@vHT
                otp:
                  type: string
                  description: 'Must not be greater than 6 characters.'
                  example: lowy
                tfa_code:
                  type: string
                  description: 'Must not be greater than 8 characters.'
                  example: uffsz
                remember_mfa:
                  type: boolean
                  description: ''
                  example: false
              required:
                - type
                - name
    delete:
      summary: 'Delete Payment Method'
      operationId: deletePaymentMethod
      description: 'Deletes a specific payment method.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Payment Methods'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: paymentMethodId
        description: 'The payment method ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/payment-methods/order':
    put:
      summary: 'Update Payment Method Order'
      operationId: updatePaymentMethodOrder
      description: 'Updates the order of payment methods.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Payment Methods'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                paymentMethods:
                  type: array
                  description: ''
                  example:
                    - culpa
                  items:
                    type: integer
              required:
                - paymentMethods
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/payment-methods/{paymentMethodId}/toggle':
    post:
      summary: 'Toggle Payment Method'
      operationId: togglePaymentMethod
      description: 'Toggles the active status of a payment method.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Payment Methods'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: paymentMethodId
        description: 'The payment method ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/payouts':
    get:
      summary: 'Get Payouts'
      operationId: getPayouts
      description: 'Retrieves the crypto wallets payout history.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      method: BTC
                      currency: BTC
                      amount: '0.00150000'
                      amount_usd: '100.00'
                      recipient: bc1qexampleaddressxxxxxxxxxxxxxxxxxxxxxx
                      transaction_id: 3c9a1de26f7b8e4a5d21c07b9ef83a64d15b2ce480f76a9b3e8d5c1f0a2b4d6e
                      status: 1
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      deleted_at: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/payouts?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/payouts?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/payouts?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/payouts'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        method: BTC
                        currency: BTC
                        amount: '0.00150000'
                        amount_usd: '100.00'
                        recipient: bc1qexampleaddressxxxxxxxxxxxxxxxxxxxxxx
                        transaction_id: 3c9a1de26f7b8e4a5d21c07b9ef83a64d15b2ce480f76a9b3e8d5c1f0a2b4d6e
                        status: 1
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        method:
                          type: string
                          example: BTC
                        currency:
                          type: string
                          example: BTC
                        amount:
                          type: string
                          example: '0.00150000'
                        amount_usd:
                          type: string
                          example: '100.00'
                        recipient:
                          type: string
                          example: bc1qexampleaddressxxxxxxxxxxxxxxxxxxxxxx
                        transaction_id:
                          type: string
                          example: 3c9a1de26f7b8e4a5d21c07b9ef83a64d15b2ce480f76a9b3e8d5c1f0a2b4d6e
                        status:
                          type: integer
                          example: 1
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        deleted_at:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/payouts?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/payouts?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/payouts?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/payouts'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - 'Crypto Wallet'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/payouts/balances':
    get:
      summary: 'Get Balances'
      operationId: getBalances
      description: 'Retreive the current balances of the crypto wallets.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  btc:
                    btc: 0
                    usd: null
                  ltc:
                    ltc: 0
                    usd: null
                  eth:
                    eth: null
                    usd: null
                  sol:
                    sol: null
                    usd: null
                  addresses:
                    btc: ''
                    ltc: ''
                    eth: ''
                    eth_usdt: ''
                    eth_usdc: ''
                    sol: ''
                    sol_usdt: ''
                    sol_usdc: ''
                  eth_usdt:
                    eth_usdt: '0'
                    usd: 0
                  eth_usdc:
                    eth_usdc: '0'
                    usd: 0
                  sol_usdt:
                    sol_usdt: '0'
                    usd: 0
                  sol_usdc:
                    sol_usdc: '0'
                    usd: 0
                properties:
                  btc:
                    type: object
                    properties:
                      btc:
                        type: integer
                        example: 0
                      usd:
                        type: string
                        example: null
                  ltc:
                    type: object
                    properties:
                      ltc:
                        type: integer
                        example: 0
                      usd:
                        type: string
                        example: null
                  eth:
                    type: object
                    properties:
                      eth:
                        type: string
                        example: null
                      usd:
                        type: string
                        example: null
                  sol:
                    type: object
                    properties:
                      sol:
                        type: string
                        example: null
                      usd:
                        type: string
                        example: null
                  addresses:
                    type: object
                    properties:
                      btc:
                        type: string
                        example: ''
                      ltc:
                        type: string
                        example: ''
                      eth:
                        type: string
                        example: ''
                      eth_usdt:
                        type: string
                        example: ''
                      eth_usdc:
                        type: string
                        example: ''
                      sol:
                        type: string
                        example: ''
                      sol_usdt:
                        type: string
                        example: ''
                      sol_usdc:
                        type: string
                        example: ''
                  eth_usdt:
                    type: object
                    properties:
                      eth_usdt:
                        type: string
                        example: '0'
                      usd:
                        type: integer
                        example: 0
                  eth_usdc:
                    type: object
                    properties:
                      eth_usdc:
                        type: string
                        example: '0'
                      usd:
                        type: integer
                        example: 0
                  sol_usdt:
                    type: object
                    properties:
                      sol_usdt:
                        type: string
                        example: '0'
                      usd:
                        type: integer
                        example: 0
                  sol_usdc:
                    type: object
                    properties:
                      sol_usdc:
                        type: string
                        example: '0'
                      usd:
                        type: integer
                        example: 0
      tags:
        - 'Crypto Wallet'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/payouts/jobs':
    get:
      summary: 'Get Payout Jobs'
      operationId: getPayoutJobs
      description: 'Retrieves the crypto payouts currently in progress.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  jobs: []
                properties:
                  jobs:
                    type: array
                    example: []
      tags:
        - 'Crypto Wallet'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/payouts/payout':
    post:
      summary: Payout
      operationId: payout
      description: 'Payout the crypto from the wallet.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Crypto Wallet'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                currency:
                  type: string
                  description: ''
                  example: ltc
                  enum:
                    - btc
                    - ltc
                    - eth
                    - sol
                address:
                  type: string
                  description: ''
                  example: culpa
                amount:
                  type: number
                  description: ''
                  example: 6.5279
                password:
                  type: string
                  description: 'Must not be greater than 255 characters.'
                  example: 'rc~qhvY2Z^@FxLpH>?R4'
                otp:
                  type: string
                  description: 'Must not be greater than 6 characters.'
                  example: owtz
                tfa_code:
                  type: string
                  description: 'Must not be greater than 8 characters.'
                  example: mixko
                remember_mfa:
                  type: boolean
                  description: ''
                  example: false
              required:
                - currency
                - address
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/payouts/transactions':
    get:
      summary: 'Get Transactions'
      operationId: getTransactions
      description: 'Retrieves the transaction history for the crypto wallets.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data: []
                  per_page: 10
                  total: -1
                properties:
                  data:
                    type: array
                    example: []
                  per_page:
                    type: integer
                    example: 10
                  total:
                    type: integer
                    example: -1
      tags:
        - 'Crypto Wallet'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/analytics':
    get:
      summary: 'Get Analytics'
      operationId: getAnalytics
      description: 'Retrieves revenue, orders, customers and estimated gross profit analytics in a given timeframe.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  revenue: 14.99
                  previousRevenue: 0
                  revenueChange: 1499
                  orders: 2
                  previousOrders: 0
                  ordersChange: 200
                  customers: 2
                  previousCustomers: 0
                  customersChange: 200
                  cogs: 9
                  profit: 5.99
                  previousProfit: 0
                  profitChange: 599
                  costCoverage: 100
                  hasCosts: true
                properties:
                  revenue:
                    type: number
                    example: 14.99
                  previousRevenue:
                    type: integer
                    example: 0
                  revenueChange:
                    type: integer
                    example: 1499
                  orders:
                    type: integer
                    example: 2
                  previousOrders:
                    type: integer
                    example: 0
                  ordersChange:
                    type: integer
                    example: 200
                  customers:
                    type: integer
                    example: 2
                  previousCustomers:
                    type: integer
                    example: 0
                  customersChange:
                    type: integer
                    example: 200
                  cogs:
                    type: integer
                    example: 9
                  profit:
                    type: number
                    example: 5.99
                  previousProfit:
                    type: integer
                    example: 0
                  profitChange:
                    type: integer
                    example: 599
                  costCoverage:
                    type: integer
                    example: 100
                  hasCosts:
                    type: boolean
                    example: true
      tags:
        - Analytics
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/analytics/top-products':
    get:
      summary: 'Get Top Products'
      operationId: getTopProducts
      description: 'Retrieves the top 10 products by revenue.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    product_id: 1
                    variant_id: 1
                    product_name: 'License Keys'
                    variant_name: Standard
                    total_revenue_usd: 29.98
                    total_profit_usd: 20.98
                    total_orders: 2
                    images: []
      tags:
        - Analytics
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/analytics/top-customers':
    get:
      summary: 'Get Top Customers'
      operationId: getTopCustomers
      description: 'Retrieves the top 10 customers by revenue.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    id: 1
                    email: customer@sellauth.test
                    discord_id: null
                    discord_username: null
                    last_completed_at: null
                    newsletter_at: null
                    total_spent_usd: '14.99'
                    total_completed: 1
                  -
                    id: 3
                    email: reseller@sellauth.test
                    discord_id: null
                    discord_username: null
                    last_completed_at: null
                    newsletter_at: null
                    total_spent_usd: '0.00'
                    total_completed: 1
      tags:
        - Analytics
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/analytics/top-payment-methods':
    get:
      summary: 'Get Top Payment Methods'
      operationId: getTopPaymentMethods
      description: 'Retrieves the top 10 payment methods by revenue.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    id: 1
                    type: stripe
                    name: Stripe
                    icon: null
                    total_orders: 1
                    total_revenue_usd: 14.99
      tags:
        - Analytics
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/analytics/traffic/stats':
    get:
      summary: 'Get Traffic Stats'
      operationId: getTrafficStats
      description: 'Retrieves pageview, visitor, visit and bounce totals for a given timeframe.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  pageviews: 0
                  visitors: 0
                  visits: 0
                  bounces: 0
                  totaltime: 0
                  comparison:
                    pageviews: 0
                    visitors: 0
                    visits: 0
                    bounces: 0
                    totaltime: 0
                properties:
                  pageviews:
                    type: integer
                    example: 0
                  visitors:
                    type: integer
                    example: 0
                  visits:
                    type: integer
                    example: 0
                  bounces:
                    type: integer
                    example: 0
                  totaltime:
                    type: integer
                    example: 0
                  comparison:
                    type: object
                    properties:
                      pageviews:
                        type: integer
                        example: 0
                      visitors:
                        type: integer
                        example: 0
                      visits:
                        type: integer
                        example: 0
                      bounces:
                        type: integer
                        example: 0
                      totaltime:
                        type: integer
                        example: 0
      tags:
        - Analytics
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/analytics/traffic/active':
    get:
      summary: 'Get Active Visitors'
      operationId: getActiveVisitors
      description: 'Retrieves the number of visitors currently active on the shop.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  visitors: 0
                properties:
                  visitors:
                    type: integer
                    example: 0
      tags:
        - Analytics
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/analytics/traffic/graph':
    get:
      summary: 'Get Traffic Graph'
      operationId: getTrafficGraph
      description: 'Retrieves time series visit and session data for a given timeframe.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  visitsData: []
                  sessionsData: []
                  dateData: []
                properties:
                  visitsData:
                    type: array
                    example: []
                  sessionsData:
                    type: array
                    example: []
                  dateData:
                    type: array
                    example: []
      tags:
        - Analytics
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/analytics/traffic/metrics':
    get:
      summary: 'Get Traffic Metrics'
      operationId: getTrafficMetrics
      description: 'Retrieves the top traffic metrics of a given type, such as path, referrer, country or device.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example: []
      tags:
        - Analytics
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/analytics/traffic/utm':
    get:
      summary: 'Get Traffic UTM Breakdown'
      operationId: getTrafficUTMBreakdown
      description: 'Retrieves traffic broken down by UTM source, medium, campaign, term and content.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  utm_source: []
                  utm_medium: []
                  utm_campaign: []
                  utm_term: []
                  utm_content: []
                properties:
                  utm_source:
                    type: array
                    example: []
                  utm_medium:
                    type: array
                    example: []
                  utm_campaign:
                    type: array
                    example: []
                  utm_term:
                    type: array
                    example: []
                  utm_content:
                    type: array
                    example: []
      tags:
        - Analytics
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/notifications/latest':
    get:
      summary: 'Get Latest Notifications'
      operationId: getLatestNotifications
      description: 'Retrieves the latest notifications.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  notifications:
                    -
                      id: d4c1f9e2-5b8a-4c3d-9e6f-2a7b8c9d0e1f
                      level: success
                      title: 'New Sale'
                      description: 'License Keys (Standard) has been sold for $14.99'
                      link: /invoices/1
                      created_at: '2026-08-28T18:23:02.000000Z'
                  unread_count: 1
                  urgent_unread: []
                properties:
                  notifications:
                    type: array
                    example:
                      -
                        id: d4c1f9e2-5b8a-4c3d-9e6f-2a7b8c9d0e1f
                        level: success
                        title: 'New Sale'
                        description: 'License Keys (Standard) has been sold for $14.99'
                        link: /invoices/1
                        created_at: '2026-08-28T18:23:02.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          example: d4c1f9e2-5b8a-4c3d-9e6f-2a7b8c9d0e1f
                        level:
                          type: string
                          example: success
                        title:
                          type: string
                          example: 'New Sale'
                        description:
                          type: string
                          example: 'License Keys (Standard) has been sold for $14.99'
                        link:
                          type: string
                          example: /invoices/1
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                  unread_count:
                    type: integer
                    example: 1
                  urgent_unread:
                    type: array
                    example: []
      tags:
        - Notifications
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/notifications/page':
    get:
      summary: 'Get Notifications Page'
      operationId: getNotificationsPage
      description: 'Retrieves a paginated list of notifications.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: d4c1f9e2-5b8a-4c3d-9e6f-2a7b8c9d0e1f
                      level: success
                      title: 'New Sale'
                      description: 'License Keys (Standard) has been sold for $14.99'
                      link: /invoices/1
                      created_at: '2026-08-28T18:23:02.000000Z'
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/notifications/page?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/notifications/page?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/notifications/page?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/notifications/page'
                  per_page: 10
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: d4c1f9e2-5b8a-4c3d-9e6f-2a7b8c9d0e1f
                        level: success
                        title: 'New Sale'
                        description: 'License Keys (Standard) has been sold for $14.99'
                        link: /invoices/1
                        created_at: '2026-08-28T18:23:02.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          example: d4c1f9e2-5b8a-4c3d-9e6f-2a7b8c9d0e1f
                        level:
                          type: string
                          example: success
                        title:
                          type: string
                          example: 'New Sale'
                        description:
                          type: string
                          example: 'License Keys (Standard) has been sold for $14.99'
                        link:
                          type: string
                          example: /invoices/1
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/notifications/page?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/notifications/page?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/notifications/page?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/notifications/page'
                  per_page:
                    type: integer
                    example: 10
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Notifications
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/notifications/mark-as-read':
    post:
      summary: 'Mark Notifications as Read'
      operationId: markNotificationsAsRead
      description: 'Marks all notifications as read.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Notifications
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/notifications/settings':
    get:
      summary: 'Get Notification Settings'
      operationId: getNotificationSettings
      description: 'Retrieves the notification settings and channel subscriptions.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    id: ShopInvoiceCreated
                    name: 'Order Created'
                    description: 'Get notified when a new order is created.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopInvoiceProcessed
                    name: 'Order Completed'
                    description: 'Get notified when an invoice has been processed.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopInvoiceConfirming
                    name: 'Manual Order Marked As Paid'
                    description: 'Get notified when an invoice gets marked as Confirming.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopInvoiceOutOfStock
                    name: 'Invoice Items Out of Stock'
                    description: 'Get notified when a product runs out of stock after a sale.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopProductOutOfStock
                    name: 'Product Variant Out of Stock'
                    description: 'Get notified when a product variant runs out of stock.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopFeedbackReceived
                    name: 'Feedback Created'
                    description: 'Get notified when a order feedback is submitted.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopFeedbackUpdated
                    name: 'Feedback Updated'
                    description: 'Get notified when a order feedback is edited.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopFeedbackDisputeAccepted
                    name: 'Feedback Dispute Accepted'
                    description: 'Get notified when a feedback dispute is accepted.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopFeedbackDisputeRejected
                    name: 'Feedback Dispute Rejected'
                    description: 'Get notified when a feedback dispute is rejected.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopTicketCreated
                    name: 'Ticket Created'
                    description: 'Get notified when a new support ticket is created.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopTicketMessage
                    name: 'Ticket Message'
                    description: 'Get notified when a new support ticket message is sent.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopSubscriptionEnding
                    name: 'Shop Subscription Ending'
                    description: 'Get notified when the subscription plan is expiring.'
                    channels:
                      -
                        name: mail
                        subscribed: true
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopPlanChanged
                    name: 'Shop Plan Changed'
                    description: 'Get notified when your shop subscription plan changes.'
                    channels:
                      -
                        name: mail
                        subscribed: true
                        parameters: null
                  -
                    id: ShopProductSubscriptionStarted
                    name: 'New Subscriber'
                    description: 'Get notified when a customer starts a product subscription.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopProductSubscriptionEnded
                    name: 'Subscription Ended'
                    description: 'Get notified when a product subscription is cancelled or expires. Use the webhook to revoke any access you granted.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopProductSubscriptionRenewalFailed
                    name: 'Subscription Renewal Failed'
                    description: 'Get notified when a subscription renewal payment fails or is overdue (the subscription is past due, not yet ended).'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopError
                    name: 'Shop Error'
                    description: 'Get notified when an error occurs on the shop.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopProductRestocked
                    name: 'Product Restocked'
                    description: 'Send a message when a variant is restocked from zero stock.'
                    channels:
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopInvoiceWithdrawalRequested
                    name: 'Withdrawal Requested'
                    description: 'Get notified when a customer requests a withdrawal on an order.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopInvoiceCustomFieldsSubmitted
                    name: 'Custom Fields Submitted'
                    description: 'Get notified when a customer fills in custom fields after paying.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopAffiliatePayoutRequested
                    name: 'Affiliate Payout Requested'
                    description: 'Get notified when an affiliate requests a payout of their affiliate balance.'
                    channels:
                      -
                        name: mail
                        subscribed: true
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopResellerApplicationReceived
                    name: 'Reseller Application Received'
                    description: 'Get notified when a customer applies to become a reseller.'
                    channels:
                      -
                        name: mail
                        subscribed: true
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopResellerMarketplaceApplicationReceived
                    name: 'Marketplace Access Request Received'
                    description: 'Get notified when someone requests reseller access through your marketplace listing.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopResellerMarketplaceListingApproved
                    name: 'Marketplace Listing Approved'
                    description: 'Get notified when your reseller marketplace listing (or an update to it) is approved.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopResellerMarketplaceListingRejected
                    name: 'Marketplace Listing Rejected'
                    description: 'Get notified when your reseller marketplace listing (or an update to it) is rejected.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopResellerMarketplaceListingRemoved
                    name: 'Marketplace Listing Removed'
                    description: 'Get notified when your reseller marketplace listing is removed by moderation.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
                  -
                    id: ShopResellerMarketplaceImportRemoved
                    name: 'Imported Product Removed'
                    description: 'Get notified when a product you imported from the reseller marketplace is removed by moderation.'
                    channels:
                      -
                        name: mail
                        subscribed: false
                        parameters: null
                      -
                        name: discord
                        subscribed: false
                        parameters: null
                      -
                        name: telegram
                        subscribed: false
                        parameters: null
                      -
                        name: webhook
                        subscribed: false
                        parameters: null
      tags:
        - Notifications
    post:
      summary: 'Update Notification Settings'
      operationId: updateNotificationSettings
      description: 'Updates the notification channel subscriptions and their parameters.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Notifications
    parameters:
      -
        in: path
        name: shopId
        description: 'The ID of the shop.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/webhook-logs':
    get:
      summary: 'Get Webhook Logs'
      operationId: getWebhookLogs
      description: 'Retrieves outgoing webhook and dynamic-delivery request logs for debugging.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      source: notification
                      event: NOTIFICATION.SHOP_INVOICE_PROCESSED
                      invoice_id: 1
                      invoice_item_id: null
                      url: 'https://example.com/webhook'
                      request_headers: null
                      request_body:
                        data:
                          invoice_id: 1
                        event: NOTIFICATION.SHOP_INVOICE_PROCESSED
                        shop_id: 1
                      response_status: 200
                      response_body: OK
                      success: true
                      error_type: null
                      error_message: null
                      duration_ms: 120
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/webhook-logs?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/webhook-logs?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/webhook-logs?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/webhook-logs'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        source: notification
                        event: NOTIFICATION.SHOP_INVOICE_PROCESSED
                        invoice_id: 1
                        invoice_item_id: null
                        url: 'https://example.com/webhook'
                        request_headers: null
                        request_body:
                          data:
                            invoice_id: 1
                          event: NOTIFICATION.SHOP_INVOICE_PROCESSED
                          shop_id: 1
                        response_status: 200
                        response_body: OK
                        success: true
                        error_type: null
                        error_message: null
                        duration_ms: 120
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        source:
                          type: string
                          example: notification
                        event:
                          type: string
                          example: NOTIFICATION.SHOP_INVOICE_PROCESSED
                        invoice_id:
                          type: integer
                          example: 1
                        invoice_item_id:
                          type: string
                          example: null
                        url:
                          type: string
                          example: 'https://example.com/webhook'
                        request_headers:
                          type: string
                          example: null
                        request_body:
                          type: object
                          properties:
                            data:
                              type: object
                              properties:
                                invoice_id:
                                  type: integer
                                  example: 1
                            event:
                              type: string
                              example: NOTIFICATION.SHOP_INVOICE_PROCESSED
                            shop_id:
                              type: integer
                              example: 1
                        response_status:
                          type: integer
                          example: 200
                        response_body:
                          type: string
                          example: OK
                        success:
                          type: boolean
                          example: true
                        error_type:
                          type: string
                          example: null
                        error_message:
                          type: string
                          example: null
                        duration_ms:
                          type: integer
                          example: 120
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/webhook-logs?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/webhook-logs?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/webhook-logs?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/webhook-logs'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - 'Webhook Logs'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - created_at
                    - response_status
                    - duration_ms
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
                source:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - notification
                    - dynamic_delivery
                event:
                  type: string
                  description: 'Filter by event name.'
                  example: null
                invoice_id:
                  type: string
                  description: 'Filter by invoice ID or unique ID.'
                  example: null
                invoice_item_id:
                  type: integer
                  description: 'Filter by invoice item ID.'
                  example: null
                success:
                  type: boolean
                  description: 'Only successful or failed deliveries.'
                  example: null
                response_status:
                  type: integer
                  description: 'Filter by HTTP response status.'
                  example: null
                error_type:
                  type: string
                  description: ''
                  example: null
                url:
                  type: string
                  description: 'Search by URL.'
                  example: null
                response_body:
                  type: string
                  description: 'Search in response bodies.'
                  example: null
                created_at_start:
                  type: string
                  description: 'Must be a valid date.'
                  example: null
                created_at_end:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>created_at_start</code>.'
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/activity-logs':
    get:
      summary: 'Get Activity Logs'
      operationId: getActivityLogs
      description: 'Retrieves the activity logs.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 55540001
                      type: updated
                      user_id: 1
                      user_email: demo@sellauth.test
                      subject_id: 1
                      subject_type: shop
                      properties:
                        old:
                          name: 'My Shop'
                        attributes:
                          name: 'Demo Shop'
                      created_at: '2026-08-28T18:23:02.000000Z'
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/activity-logs?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/activity-logs?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/activity-logs?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/activity-logs'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 55540001
                        type: updated
                        user_id: 1
                        user_email: demo@sellauth.test
                        subject_id: 1
                        subject_type: shop
                        properties:
                          old:
                            name: 'My Shop'
                          attributes:
                            name: 'Demo Shop'
                        created_at: '2026-08-28T18:23:02.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 55540001
                        type:
                          type: string
                          example: updated
                        user_id:
                          type: integer
                          example: 1
                        user_email:
                          type: string
                          example: demo@sellauth.test
                        subject_id:
                          type: integer
                          example: 1
                        subject_type:
                          type: string
                          example: shop
                        properties:
                          type: object
                          properties:
                            old:
                              type: object
                              properties:
                                name:
                                  type: string
                                  example: 'My Shop'
                            attributes:
                              type: object
                              properties:
                                name:
                                  type: string
                                  example: 'Demo Shop'
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/activity-logs?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/activity-logs?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/activity-logs?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/activity-logs'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - 'Activity Logs'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates':
    get:
      summary: 'List Affiliates'
      operationId: listAffiliates
      description: "Returns the shop's affiliates (customers with an affiliate code) with their stats."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      email: customer@sellauth.test
                      shop_id: 1
                      balance: '0.00'
                      affiliate_balance: '0.00'
                      affiliate_code: PARTNER10
                      affiliate_code_set_at: '2026-08-28 18:23:02'
                      affiliate_tier_id: null
                      affiliate_referrer_earnings: '0.00'
                      created_at: '2026-08-28T18:23:02.000000Z'
                      referrals_count: 0
                      affiliate_tier: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/affiliates?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/affiliates?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/affiliates?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/affiliates'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        email: customer@sellauth.test
                        shop_id: 1
                        balance: '0.00'
                        affiliate_balance: '0.00'
                        affiliate_code: PARTNER10
                        affiliate_code_set_at: '2026-08-28 18:23:02'
                        affiliate_tier_id: null
                        affiliate_referrer_earnings: '0.00'
                        created_at: '2026-08-28T18:23:02.000000Z'
                        referrals_count: 0
                        affiliate_tier: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        email:
                          type: string
                          example: customer@sellauth.test
                        shop_id:
                          type: integer
                          example: 1
                        balance:
                          type: string
                          example: '0.00'
                        affiliate_balance:
                          type: string
                          example: '0.00'
                        affiliate_code:
                          type: string
                          example: PARTNER10
                        affiliate_code_set_at:
                          type: string
                          example: '2026-08-28 18:23:02'
                        affiliate_tier_id:
                          type: string
                          example: null
                        affiliate_referrer_earnings:
                          type: string
                          example: '0.00'
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        referrals_count:
                          type: integer
                          example: 0
                        affiliate_tier:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/affiliates?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/affiliates?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/affiliates?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/affiliates'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Affiliates
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                page:
                  type: integer
                  description: 'Page number.'
                  example: 1
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                search:
                  type: string
                  description: 'Search by email or affiliate code. Must not be greater than 100 characters.'
                  example: null
                tier_id:
                  type: integer
                  description: 'Filter by affiliate tier ID.'
                  example: null
                status:
                  type: string
                  description: 'active (default), suspended, or all.'
                  example: null
                  enum:
                    - active
                    - suspended
                    - all
                segment:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - active
                    - inactive
                    - new
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - id
                    - email
                    - affiliate_code
                    - affiliate_referrer_earnings
                    - balance
                    - affiliate_balance
                    - affiliate_code_set_at
                    - referrals_count
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates/stats':
    get:
      summary: 'Affiliate Stats'
      operationId: affiliateStats
      description: "Aggregate stats for the shop's affiliate program, with 30-day deltas."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  total_affiliates: 1
                  active_affiliates: 0
                  inactive_affiliates: 1
                  new_affiliates: 1
                  new_affiliates_previous: 0
                  commissions_usd: 0
                  commissions_usd_previous: 0
                  commissions_usd_all_time: 0
                  attributed_revenue_usd: 0
                  attributed_revenue_usd_previous: 0
                  attributed_revenue_usd_all_time: 0
                  commissionable_revenue_usd: 0
                  commissionable_revenue_usd_previous: 0
                  commissionable_revenue_usd_all_time: 0
                  attributed_orders: 0
                  skipped_commissions: 0
                  skipped_commissions_by_reason: []
                  average_commission_rate: 0
                  top_earner_usd: 0
                  top_performers:
                    -
                      id: 1
                      email: customer@sellauth.test
                      shop_id: 1
                      balance: '0.00'
                      affiliate_balance: '0.00'
                      affiliate_code: PARTNER10
                      affiliate_code_set_at: '2026-08-28 18:23:02'
                      affiliate_tier_id: null
                      affiliate_referrer_earnings: '0.00'
                      created_at: '2026-08-28T18:23:02.000000Z'
                      referrals_count: 0
                      affiliate_tier: null
                  balance_mode: shared
                  pending_payout_requests: 1
                  window_days: 30
                properties:
                  total_affiliates:
                    type: integer
                    example: 1
                  active_affiliates:
                    type: integer
                    example: 0
                  inactive_affiliates:
                    type: integer
                    example: 1
                  new_affiliates:
                    type: integer
                    example: 1
                  new_affiliates_previous:
                    type: integer
                    example: 0
                  commissions_usd:
                    type: integer
                    example: 0
                  commissions_usd_previous:
                    type: integer
                    example: 0
                  commissions_usd_all_time:
                    type: integer
                    example: 0
                  attributed_revenue_usd:
                    type: integer
                    example: 0
                  attributed_revenue_usd_previous:
                    type: integer
                    example: 0
                  attributed_revenue_usd_all_time:
                    type: integer
                    example: 0
                  commissionable_revenue_usd:
                    type: integer
                    example: 0
                  commissionable_revenue_usd_previous:
                    type: integer
                    example: 0
                  commissionable_revenue_usd_all_time:
                    type: integer
                    example: 0
                  attributed_orders:
                    type: integer
                    example: 0
                  skipped_commissions:
                    type: integer
                    example: 0
                  skipped_commissions_by_reason:
                    type: array
                    example: []
                  average_commission_rate:
                    type: integer
                    example: 0
                  top_earner_usd:
                    type: integer
                    example: 0
                  top_performers:
                    type: array
                    example:
                      -
                        id: 1
                        email: customer@sellauth.test
                        shop_id: 1
                        balance: '0.00'
                        affiliate_balance: '0.00'
                        affiliate_code: PARTNER10
                        affiliate_code_set_at: '2026-08-28 18:23:02'
                        affiliate_tier_id: null
                        affiliate_referrer_earnings: '0.00'
                        created_at: '2026-08-28T18:23:02.000000Z'
                        referrals_count: 0
                        affiliate_tier: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        email:
                          type: string
                          example: customer@sellauth.test
                        shop_id:
                          type: integer
                          example: 1
                        balance:
                          type: string
                          example: '0.00'
                        affiliate_balance:
                          type: string
                          example: '0.00'
                        affiliate_code:
                          type: string
                          example: PARTNER10
                        affiliate_code_set_at:
                          type: string
                          example: '2026-08-28 18:23:02'
                        affiliate_tier_id:
                          type: string
                          example: null
                        affiliate_referrer_earnings:
                          type: string
                          example: '0.00'
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        referrals_count:
                          type: integer
                          example: 0
                        affiliate_tier:
                          type: string
                          example: null
                  balance_mode:
                    type: string
                    example: shared
                  pending_payout_requests:
                    type: integer
                    example: 1
                  window_days:
                    type: integer
                    example: 30
      tags:
        - Affiliates
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates/{customerId}':
    get:
      summary: 'Get Affiliate'
      operationId: getAffiliate
      description: 'Detail view: referrals, attributed orders, affiliate wallet ledger and payout requests.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  affiliate:
                    id: 1
                    email: customer@sellauth.test
                    shop_id: 1
                    balance: '0.00'
                    affiliate_balance: '0.00'
                    affiliate_code: PARTNER10
                    affiliate_code_set_at: '2026-08-28 18:23:02'
                    affiliate_tier_id: null
                    affiliate_referrer_earnings: '0.00'
                    created_at: '2026-08-28T18:23:02.000000Z'
                    referrals_count: 0
                    affiliate_tier: null
                  referrals: []
                  attributed_invoices: []
                  wallet_transactions: []
                  payout_requests:
                    -
                      id: 1
                      shop_id: 1
                      shop_customer_id: 1
                      amount: 25
                      status: pending
                      payout_details: 'PayPal: customer@sellauth.test'
                      seller_note: null
                      processed_by: null
                      processed_at: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                  balance_mode: shared
                properties:
                  affiliate:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      email:
                        type: string
                        example: customer@sellauth.test
                      shop_id:
                        type: integer
                        example: 1
                      balance:
                        type: string
                        example: '0.00'
                      affiliate_balance:
                        type: string
                        example: '0.00'
                      affiliate_code:
                        type: string
                        example: PARTNER10
                      affiliate_code_set_at:
                        type: string
                        example: '2026-08-28 18:23:02'
                      affiliate_tier_id:
                        type: string
                        example: null
                      affiliate_referrer_earnings:
                        type: string
                        example: '0.00'
                      created_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      referrals_count:
                        type: integer
                        example: 0
                      affiliate_tier:
                        type: string
                        example: null
                  referrals:
                    type: array
                    example: []
                  attributed_invoices:
                    type: array
                    example: []
                  wallet_transactions:
                    type: array
                    example: []
                  payout_requests:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        shop_customer_id: 1
                        amount: 25
                        status: pending
                        payout_details: 'PayPal: customer@sellauth.test'
                        seller_note: null
                        processed_by: null
                        processed_at: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        shop_customer_id:
                          type: integer
                          example: 1
                        amount:
                          type: integer
                          example: 25
                        status:
                          type: string
                          example: pending
                        payout_details:
                          type: string
                          example: 'PayPal: customer@sellauth.test'
                        seller_note:
                          type: string
                          example: null
                        processed_by:
                          type: string
                          example: null
                        processed_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                  balance_mode:
                    type: string
                    example: shared
      tags:
        - Affiliates
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates/{customerId}/tier':
    put:
      summary: 'Assign Tier'
      operationId: assignTier
      description: 'Assigns an affiliate to a tier.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Affiliates
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                tier_id:
                  type: integer
                  description: 'The tier ID. Required.'
                  example: 1
              required:
                - tier_id
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates/invite':
    post:
      summary: 'Invite Affiliate'
      operationId: inviteAffiliate
      description: 'Creates (or reuses) a customer by email and assigns them an affiliate code, making them an affiliate.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Affiliates
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: "The affiliate's email."
                  example: partner@example.com
                affiliate_code:
                  type: string
                  description: 'The code to assign.'
                  example: PARTNER10
                tier_id:
                  type: integer
                  description: 'The tier to place them in. Required.'
                  example: 1
                send_email:
                  type: boolean
                  description: 'Whether to email the affiliate their code and referral link. Defaults to true.'
                  example: null
              required:
                - email
                - affiliate_code
                - tier_id
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates/{customerId}/code':
    put:
      summary: 'Set Affiliate Code'
      operationId: setAffiliateCode
      description: 'Sets the affiliate code for a customer in a shop. Suspend the affiliate instead of clearing their code.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Affiliates
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                affiliate_code:
                  type: string
                  description: 'The code to assign.'
                  example: PARTNER10
              required:
                - affiliate_code
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates/bulk-tier':
    post:
      summary: 'Bulk Assign Tier'
      operationId: bulkAssignTier
      description: 'Moves several affiliates to a tier at once. IDs that are not affiliates of this shop are skipped.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Affiliates
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_ids:
                  type: array
                  description: 'The shop customer IDs to update.'
                  example:
                    - 1
                    - 2
                  items:
                    type: integer
                tier_id:
                  type: integer
                  description: 'The tier ID. Required.'
                  example: 1
              required:
                - customer_ids
                - tier_id
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates/bulk-suspend':
    post:
      summary: 'Bulk Suspend Affiliates'
      operationId: bulkSuspendAffiliates
      description: 'Suspends several affiliates at once. IDs that are not affiliates of this shop are skipped.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Affiliates
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_ids:
                  type: array
                  description: 'The shop customer IDs to suspend.'
                  example:
                    - 1
                    - 2
                  items:
                    type: integer
              required:
                - customer_ids
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates/bulk-restore':
    post:
      summary: 'Bulk Restore Affiliates'
      operationId: bulkRestoreAffiliates
      description: "Lifts the suspension on several affiliates at once. Stops once the plan's affiliate limit is reached."
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Affiliates
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_ids:
                  type: array
                  description: 'The shop customer IDs to restore.'
                  example:
                    - 1
                    - 2
                  items:
                    type: integer
              required:
                - customer_ids
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates/{customerId}/suspend':
    post:
      summary: 'Suspend Affiliate'
      operationId: suspendAffiliate
      description: 'Suspends an affiliate: they stop earning and their links stop attributing, but their code, tier, balance and history are kept. Reversible with restore.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Affiliates
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliates/{customerId}/restore':
    post:
      summary: 'Restore Affiliate'
      operationId: restoreAffiliate
      description: 'Lifts a suspension and puts the affiliate back to active on their existing code and tier.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Affiliates
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliate-tiers':
    get:
      summary: 'List Tiers'
      operationId: listTiers
      description: "Returns the shop's affiliate tiers with their product overrides and member counts."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    id: 1
                    shop_id: 1
                    name: Default
                    percentage: 10
                    discount_percentage: 0
                    is_default: true
                    is_public: true
                    sort_order: 0
                    created_at: '2026-08-28T18:23:02.000000Z'
                    updated_at: '2026-08-28T18:23:02.000000Z'
                    deleted_at: null
                    members_count: 0
                    products: []
      tags:
        - 'Affiliate Tiers'
    post:
      summary: 'Create Tier'
      operationId: createTier
      description: ''
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Affiliate Tiers'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The tier name.'
                  example: Gold
                percentage:
                  type: number
                  description: 'Commission percentage for the tier.'
                  example: 10
                discount_percentage:
                  type: number
                  description: 'Discount buyers get when using a code of this tier.'
                  example: 5
                is_public:
                  type: boolean
                  description: 'Public tiers are shown on the storefront affiliate page.'
                  example: null
                sort_order:
                  type: integer
                  description: 'Must be at least 0. Must not be greater than 1000.'
                  example: 12
              required:
                - name
                - percentage
                - discount_percentage
                - is_public
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliate-tiers/{tierId}':
    put:
      summary: 'Update Tier'
      operationId: updateTier
      description: ''
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Affiliate Tiers'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: pasyzwszwtxpeqq
                percentage:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 9
                discount_percentage:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 10
                is_public:
                  type: boolean
                  description: ''
                  example: false
                sort_order:
                  type: integer
                  description: 'Must be at least 0. Must not be greater than 1000.'
                  example: 12
              required:
                - name
                - percentage
                - discount_percentage
                - is_public
    delete:
      summary: 'Delete Tier'
      operationId: deleteTier
      description: 'Deletes a tier. Its members fall back to the default tier. The default tier cannot be deleted.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Affiliate Tiers'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: tierId
        description: 'The tier ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliate-tiers/{tierId}/products':
    put:
      summary: 'Set Tier Product Overrides'
      operationId: setTierProductOverrides
      description: "Replaces the tier's per-product percentage overrides. An override of 0 excludes the product for this tier."
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Affiliate Tiers'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                products:
                  type: array
                  description: 'The overrides.'
                  example:
                    -
                      product_id: 123
                      percentage: 0
                  items:
                    type: object
                    properties:
                      product_id:
                        type: integer
                        description: ''
                        example: 12
                      percentage:
                        type: number
                        description: 'Must be at least 0. Must not be greater than 100.'
                        example: 1
                    required:
                      - product_id
                      - percentage
              required:
                - products
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: tierId
        description: 'The tier ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliate-payouts':
    get:
      summary: 'List Payout Requests'
      operationId: listPayoutRequests
      description: "Returns the shop's affiliate payout requests, newest first."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 1
                      shop_id: 1
                      shop_customer_id: 1
                      amount: 25
                      status: pending
                      payout_details: 'PayPal: customer@sellauth.test'
                      seller_note: null
                      processed_by: null
                      processed_at: null
                      created_at: '2026-08-28T18:23:02.000000Z'
                      updated_at: '2026-08-28T18:23:02.000000Z'
                      shop_customer:
                        id: 1
                        email: customer@sellauth.test
                        affiliate_code: PARTNER10
                        affiliate_balance: '0.00'
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/affiliate-payouts?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/affiliate-payouts?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/affiliate-payouts?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/affiliate-payouts'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 1
                        shop_id: 1
                        shop_customer_id: 1
                        amount: 25
                        status: pending
                        payout_details: 'PayPal: customer@sellauth.test'
                        seller_note: null
                        processed_by: null
                        processed_at: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        shop_customer:
                          id: 1
                          email: customer@sellauth.test
                          affiliate_code: PARTNER10
                          affiliate_balance: '0.00'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        shop_id:
                          type: integer
                          example: 1
                        shop_customer_id:
                          type: integer
                          example: 1
                        amount:
                          type: integer
                          example: 25
                        status:
                          type: string
                          example: pending
                        payout_details:
                          type: string
                          example: 'PayPal: customer@sellauth.test'
                        seller_note:
                          type: string
                          example: null
                        processed_by:
                          type: string
                          example: null
                        processed_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        shop_customer:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            email:
                              type: string
                              example: customer@sellauth.test
                            affiliate_code:
                              type: string
                              example: PARTNER10
                            affiliate_balance:
                              type: string
                              example: '0.00'
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/affiliate-payouts?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/affiliate-payouts?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/affiliate-payouts?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/affiliate-payouts'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - 'Affiliate Payouts'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - pending
                    - paid
                    - rejected
                    - cancelled
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliate-payouts/{payoutRequestId}/pay':
    post:
      summary: 'Pay Payout Request'
      operationId: payPayoutRequest
      description: 'Marks a pending payout request as paid. The seller pays the affiliate outside of SellAuth (per the payout details) and confirms here.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Affiliate Payouts'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: payoutRequestId
        description: 'The payout request ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/affiliate-payouts/{payoutRequestId}/reject':
    post:
      summary: 'Reject Payout Request'
      operationId: rejectPayoutRequest
      description: 'Rejects a pending payout request and refunds the amount to the affiliate balance.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Affiliate Payouts'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                seller_note:
                  type: string
                  description: 'Optional note shown to the affiliate.'
                  example: culpa
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: payoutRequestId
        description: 'The payout request ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers':
    get:
      summary: 'List Resellers'
      operationId: listResellers
      description: "Returns the shop's resellers (customers with a reseller status) with their stats."
      parameters:
        -
          in: query
          name: status
          description: 'Filter by status: applied, approved or rejected.'
          example: null
          required: false
          schema:
            type: string
            description: 'Filter by status: applied, approved or rejected.'
            example: null
        -
          in: query
          name: search
          description: 'Search by email.'
          example: null
          required: false
          schema:
            type: string
            description: 'Search by email.'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data:
                    -
                      id: 3
                      email: reseller@sellauth.test
                      shop_id: 1
                      balance: '100.00'
                      reseller_status: approved
                      reseller_tier_id: null
                      reseller_applied_at: null
                      reseller_approved_at: '2026-08-28 18:23:02'
                      reseller_total_spent_usd: 0
                      reseller_total_completed: 0
                      created_at: '2026-08-28T18:23:02.000000Z'
                      reseller_tier: null
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/resellers?page=1'
                  from: 1
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/resellers?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/resellers?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/resellers'
                  per_page: 20
                  prev_page_url: null
                  to: 1
                  total: 1
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example:
                      -
                        id: 3
                        email: reseller@sellauth.test
                        shop_id: 1
                        balance: '100.00'
                        reseller_status: approved
                        reseller_tier_id: null
                        reseller_applied_at: null
                        reseller_approved_at: '2026-08-28 18:23:02'
                        reseller_total_spent_usd: 0
                        reseller_total_completed: 0
                        created_at: '2026-08-28T18:23:02.000000Z'
                        reseller_tier: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        email:
                          type: string
                          example: reseller@sellauth.test
                        shop_id:
                          type: integer
                          example: 1
                        balance:
                          type: string
                          example: '100.00'
                        reseller_status:
                          type: string
                          example: approved
                        reseller_tier_id:
                          type: string
                          example: null
                        reseller_applied_at:
                          type: string
                          example: null
                        reseller_approved_at:
                          type: string
                          example: '2026-08-28 18:23:02'
                        reseller_total_spent_usd:
                          type: integer
                          example: 0
                        reseller_total_completed:
                          type: integer
                          example: 0
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        reseller_tier:
                          type: string
                          example: null
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/resellers?page=1'
                  from:
                    type: integer
                    example: 1
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/resellers?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/resellers?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/resellers'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: integer
                    example: 1
                  total:
                    type: integer
                    example: 1
      tags:
        - Resellers
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - applied
                    - approved
                    - rejected
                    - suspended
                search:
                  type: string
                  description: 'Search by email. Must not be greater than 255 characters.'
                  example: null
                tier_id:
                  type: integer
                  description: 'Filter by reseller tier ID.'
                  example: null
                segment:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - active
                    - inactive
                    - new
                perPage:
                  type: integer
                  description: 'Items per page, 1-100. Must be at least 1. Must not be greater than 100.'
                  example: null
                orderColumn:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - email
                    - reseller_total_spent_usd
                    - reseller_total_completed
                    - reseller_applied_at
                    - reseller_approved_at
                    - balance
                orderDirection:
                  type: string
                  description: ''
                  example: null
                  enum:
                    - asc
                    - desc
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/stats':
    get:
      summary: 'Reseller Stats'
      operationId: resellerStats
      description: "Aggregate stats for the shop's reseller program, with 30-day deltas."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  total_resellers: 1
                  active_resellers: 1
                  inactive_resellers: 0
                  new_resellers: 1
                  pending_applications: 0
                  revenue_usd: 0
                  revenue_usd_previous: 0
                  revenue_usd_all_time: 0
                  orders_all_time: 1
                  top_performers:
                    -
                      id: 3
                      email: reseller@sellauth.test
                      shop_id: 1
                      balance: '100.00'
                      reseller_status: approved
                      reseller_tier_id: null
                      reseller_applied_at: null
                      reseller_approved_at: '2026-08-28 18:23:02'
                      reseller_total_spent_usd: 0
                      reseller_total_completed: 0
                      created_at: '2026-08-28T18:23:02.000000Z'
                      reseller_tier: null
                  window_days: 30
                properties:
                  total_resellers:
                    type: integer
                    example: 1
                  active_resellers:
                    type: integer
                    example: 1
                  inactive_resellers:
                    type: integer
                    example: 0
                  new_resellers:
                    type: integer
                    example: 1
                  pending_applications:
                    type: integer
                    example: 0
                  revenue_usd:
                    type: integer
                    example: 0
                  revenue_usd_previous:
                    type: integer
                    example: 0
                  revenue_usd_all_time:
                    type: integer
                    example: 0
                  orders_all_time:
                    type: integer
                    example: 1
                  top_performers:
                    type: array
                    example:
                      -
                        id: 3
                        email: reseller@sellauth.test
                        shop_id: 1
                        balance: '100.00'
                        reseller_status: approved
                        reseller_tier_id: null
                        reseller_applied_at: null
                        reseller_approved_at: '2026-08-28 18:23:02'
                        reseller_total_spent_usd: 0
                        reseller_total_completed: 0
                        created_at: '2026-08-28T18:23:02.000000Z'
                        reseller_tier: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        email:
                          type: string
                          example: reseller@sellauth.test
                        shop_id:
                          type: integer
                          example: 1
                        balance:
                          type: string
                          example: '100.00'
                        reseller_status:
                          type: string
                          example: approved
                        reseller_tier_id:
                          type: string
                          example: null
                        reseller_applied_at:
                          type: string
                          example: null
                        reseller_approved_at:
                          type: string
                          example: '2026-08-28 18:23:02'
                        reseller_total_spent_usd:
                          type: integer
                          example: 0
                        reseller_total_completed:
                          type: integer
                          example: 0
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        reseller_tier:
                          type: string
                          example: null
                  window_days:
                    type: integer
                    example: 30
      tags:
        - Resellers
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/{customerId}':
    get:
      summary: 'Get Reseller'
      operationId: getReseller
      description: 'Detail view: reseller profile, recent reseller orders and balance ledger.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  reseller:
                    id: 3
                    email: reseller@sellauth.test
                    shop_id: 1
                    balance: '100.00'
                    reseller_status: approved
                    reseller_tier_id: null
                    reseller_applied_at: null
                    reseller_approved_at: '2026-08-28 18:23:02'
                    reseller_total_spent_usd: 0
                    reseller_total_completed: 0
                    created_at: '2026-08-28T18:23:02.000000Z'
                    reseller_application_answer: null
                    reseller_dd_enabled: false
                    reseller_tier: null
                  orders:
                    -
                      id: 2
                      email: reseller@sellauth.test
                      status: completed
                      price_usd: null
                      reseller_tier_id: null
                      reseller_source: 1
                      completed_at: '2026-08-28T18:23:02.000000Z'
                      created_at: '2026-08-28T18:23:02.000000Z'
                      unique_id: '-0000000000002'
                  balance_transactions: []
                properties:
                  reseller:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 3
                      email:
                        type: string
                        example: reseller@sellauth.test
                      shop_id:
                        type: integer
                        example: 1
                      balance:
                        type: string
                        example: '100.00'
                      reseller_status:
                        type: string
                        example: approved
                      reseller_tier_id:
                        type: string
                        example: null
                      reseller_applied_at:
                        type: string
                        example: null
                      reseller_approved_at:
                        type: string
                        example: '2026-08-28 18:23:02'
                      reseller_total_spent_usd:
                        type: integer
                        example: 0
                      reseller_total_completed:
                        type: integer
                        example: 0
                      created_at:
                        type: string
                        example: '2026-08-28T18:23:02.000000Z'
                      reseller_application_answer:
                        type: string
                        example: null
                      reseller_dd_enabled:
                        type: boolean
                        example: false
                      reseller_tier:
                        type: string
                        example: null
                  orders:
                    type: array
                    example:
                      -
                        id: 2
                        email: reseller@sellauth.test
                        status: completed
                        price_usd: null
                        reseller_tier_id: null
                        reseller_source: 1
                        completed_at: '2026-08-28T18:23:02.000000Z'
                        created_at: '2026-08-28T18:23:02.000000Z'
                        unique_id: '-0000000000002'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 2
                        email:
                          type: string
                          example: reseller@sellauth.test
                        status:
                          type: string
                          example: completed
                        price_usd:
                          type: string
                          example: null
                        reseller_tier_id:
                          type: string
                          example: null
                        reseller_source:
                          type: integer
                          example: 1
                        completed_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        created_at:
                          type: string
                          example: '2026-08-28T18:23:02.000000Z'
                        unique_id:
                          type: string
                          example: '-0000000000002'
                  balance_transactions:
                    type: array
                    example: []
      tags:
        - Resellers
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 3
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/invite':
    post:
      summary: 'Invite Reseller'
      operationId: inviteReseller
      description: 'Creates (or reuses) a customer by email and approves them as a reseller immediately.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: "The reseller's email."
                  example: partner@example.com
                tier_id:
                  type: integer
                  description: 'The tier to place them in. Required.'
                  example: 1
                send_email:
                  type: boolean
                  description: 'Whether to send the customer an invite email. Defaults to true.'
                  example: null
              required:
                - email
                - tier_id
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/{customerId}/approve':
    post:
      summary: 'Approve Application'
      operationId: approveApplication
      description: 'Approves a pending reseller application and notifies the customer.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                tier_id:
                  type: integer
                  description: 'The tier to place them in. Required.'
                  example: 1
              required:
                - tier_id
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 3
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/{customerId}/reject':
    post:
      summary: 'Reject Application'
      operationId: rejectApplication
      description: 'Rejects a pending reseller application and notifies the customer.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 3
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/{customerId}/tier':
    put:
      summary: 'Assign Tier'
      operationId: assignTier
      description: 'Assigns a reseller to a tier.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                tier_id:
                  type: integer
                  description: 'The tier ID. Required.'
                  example: 1
              required:
                - tier_id
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 3
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/{customerId}/dynamic-delivery':
    put:
      summary: 'Update Dynamic Delivery'
      operationId: updateDynamicDelivery
      description: "Enables or disables the reseller's dynamic delivery endpoint (seller-side kill switch)."
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                enabled:
                  type: boolean
                  description: "Whether the reseller's dynamic delivery endpoint is active."
                  example: null
              required:
                - enabled
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 3
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/bulk-tier':
    post:
      summary: 'Bulk Assign Tier'
      operationId: bulkAssignTier
      description: 'Moves several resellers to a tier at once. IDs that are not resellers of this shop are skipped.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_ids:
                  type: array
                  description: 'The shop customer IDs to update.'
                  example:
                    - 3
                    - 4
                  items:
                    type: integer
                tier_id:
                  type: integer
                  description: 'The tier ID. Required.'
                  example: 1
              required:
                - customer_ids
                - tier_id
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/bulk-approve':
    post:
      summary: 'Bulk Approve Applications'
      operationId: bulkApproveApplications
      description: "Approves several pending reseller applications and notifies the customers. Stops once the plan's reseller limit is reached; the remainder is reported as limit_blocked."
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_ids:
                  type: array
                  description: 'The shop customer IDs to approve.'
                  example:
                    - 3
                    - 4
                  items:
                    type: integer
                tier_id:
                  type: integer
                  description: 'The tier to place them in. Required.'
                  example: 1
              required:
                - customer_ids
                - tier_id
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/bulk-reject':
    post:
      summary: 'Bulk Reject Applications'
      operationId: bulkRejectApplications
      description: 'Rejects several pending reseller applications and notifies the customers. IDs without a pending application are skipped.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_ids:
                  type: array
                  description: 'The shop customer IDs to reject.'
                  example:
                    - 3
                    - 4
                  items:
                    type: integer
              required:
                - customer_ids
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/bulk-suspend':
    post:
      summary: 'Bulk Suspend Resellers'
      operationId: bulkSuspendResellers
      description: 'Suspends several resellers at once. IDs that are not approved resellers of this shop are skipped.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_ids:
                  type: array
                  description: 'The shop customer IDs to suspend.'
                  example:
                    - 3
                    - 4
                  items:
                    type: integer
              required:
                - customer_ids
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/bulk-restore':
    post:
      summary: 'Bulk Restore Resellers'
      operationId: bulkRestoreResellers
      description: "Lifts the suspension on several resellers at once. Stops once the plan's reseller limit is reached."
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                customer_ids:
                  type: array
                  description: 'The shop customer IDs to restore.'
                  example:
                    - 3
                    - 4
                  items:
                    type: integer
              required:
                - customer_ids
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/{customerId}/suspend':
    post:
      summary: 'Suspend Reseller'
      operationId: suspendReseller
      description: 'Suspends a reseller: their API keys and dynamic delivery stop working and they cannot order, but their tier, balance and history are kept. Reversible with restore.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 3
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/resellers/{customerId}/restore':
    post:
      summary: 'Restore Reseller'
      operationId: restoreReseller
      description: 'Lifts a suspension and puts the reseller back to approved on their existing tier and credentials.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - Resellers
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: customerId
        description: 'The shop customer ID.'
        example: 3
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/reseller-tiers':
    get:
      summary: 'List Tiers'
      operationId: listTiers
      description: "Returns the shop's reseller tiers with their overrides and member counts."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    id: 1
                    shop_id: 1
                    name: Default
                    discount_percentage: 10
                    is_default: true
                    is_public: true
                    sort_order: 0
                    image_id: null
                    min_spent_usd: null
                    min_sales_count: null
                    created_at: '2026-08-28T18:23:02.000000Z'
                    updated_at: '2026-08-28T18:23:02.000000Z'
                    deleted_at: null
                    members_count: 0
                    image: null
                    overrides: []
      tags:
        - 'Reseller Tiers'
    post:
      summary: 'Create Tier'
      operationId: createTier
      description: ''
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Reseller Tiers'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'The tier name.'
                  example: Gold
                discount_percentage:
                  type: number
                  description: 'Discount resellers on this tier get on reseller orders.'
                  example: 10
                is_public:
                  type: boolean
                  description: 'Public tiers are shown on the storefront reseller page.'
                  example: null
                sort_order:
                  type: integer
                  description: 'Must be at least 0. Must not be greater than 1000.'
                  example: 24
                min_spent_usd:
                  type: number
                  description: 'Auto-advancement threshold: lifetime reseller spend in USD. Null disables this threshold.'
                  example: 500
                min_sales_count:
                  type: integer
                  description: 'Auto-advancement threshold: lifetime completed reseller orders. Null disables this threshold.'
                  example: 50
                image_id:
                  type: integer
                  description: 'Optional image shown alongside the tier on the storefront.'
                  example: 1
              required:
                - name
                - discount_percentage
                - is_public
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/reseller-tiers/{tierId}':
    put:
      summary: 'Update Tier'
      operationId: updateTier
      description: ''
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Reseller Tiers'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: pasyzwszwtxpeqq
                discount_percentage:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 100.'
                  example: 9
                is_public:
                  type: boolean
                  description: ''
                  example: true
                sort_order:
                  type: integer
                  description: 'Must be at least 0. Must not be greater than 1000.'
                  example: 24
                min_spent_usd:
                  type: number
                  description: 'Must be at least 0. Must not be greater than 99999999.'
                  example: 12
                min_sales_count:
                  type: integer
                  description: 'Must be at least 0. Must not be greater than 100000000.'
                  example: 22
                image_id:
                  type: string
                  description: ''
                  example: null
              required:
                - name
                - discount_percentage
                - is_public
    delete:
      summary: 'Delete Tier'
      operationId: deleteTier
      description: 'Deletes a tier. Its members fall back to the default tier. The default tier cannot be deleted.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Reseller Tiers'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: tierId
        description: 'The tier ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/reseller-tiers/{tierId}/overrides':
    put:
      summary: 'Set Tier Overrides'
      operationId: setTierOverrides
      description: "Replaces the tier's per-product/per-variant discount overrides. A variant-level override wins over the product-level one. An override of 0 disables the discount."
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Reseller Tiers'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                overrides:
                  type: array
                  description: 'The overrides. Omit variant_id (or pass null) for a product-level override.'
                  example:
                    -
                      product_id: 123
                      variant_id: null
                      discount_percentage: 15
                  items:
                    type: object
                    properties:
                      product_id:
                        type: integer
                        description: ''
                        example: 12
                      variant_id:
                        type: integer
                        description: ''
                        example: 12
                      discount_percentage:
                        type: number
                        description: 'Must be at least 0. Must not be greater than 100.'
                        example: 1
                    required:
                      - product_id
                      - discount_percentage
              required:
                - overrides
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: tierId
        description: 'The tier ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/reseller-products':
    get:
      summary: 'List Products'
      operationId: listProducts
      description: "Returns the shop's products with their reseller enrollment flags."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example:
                  -
                    id: 1
                    name: 'License Keys'
                    type: variant
                    visibility: public
                    currency: USD
                    reseller_enabled: 1
                    reseller_disable_volume_discount: 0
                    stock_count: 3
                    images:
                      -
                        id: 1
                        cloudflare_image_id: null
                        created_at: '2026-08-28T18:23:02.000000Z'
                        updated_at: '2026-08-28T18:23:02.000000Z'
                        deleted_at: null
                        shop_id: 1
                        url: 'http://static.mysellauth.test/storage/images/1.webp'
                        pivot:
                          product_id: 1
                          image_id: 1
                          order: 0
                    variants:
                      -
                        id: 1
                        product_id: 1
                        name: Standard
                        price: '14.99'
      tags:
        - 'Reseller Products'
    put:
      summary: 'Update Products'
      operationId: updateProducts
      description: "Bulk-updates reseller enrollment flags for the shop's products."
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Reseller Products'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                products:
                  type: array
                  description: 'The products to update.'
                  example:
                    -
                      id: 123
                      reseller_enabled: true
                      reseller_disable_volume_discount: false
                  items:
                    type: object
                    properties:
                      id:
                        type: integer
                        description: ''
                        example: 12
                      reseller_enabled:
                        type: boolean
                        description: ''
                        example: false
                      reseller_disable_volume_discount:
                        type: boolean
                        description: ''
                        example: true
                    required:
                      - id
                      - reseller_enabled
              required:
                - products
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/automations':
    get:
      summary: 'Get Automations'
      operationId: getAutomations
      description: 'Retrieves the email automations.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data: []
                properties:
                  data:
                    type: array
                    example: []
      tags:
        - 'Email Marketing - Automations'
    post:
      summary: 'Create Automation'
      operationId: createAutomation
      description: 'Creates an email automation.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Automations'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/automations/{automationId}':
    get:
      summary: 'Get Automation'
      operationId: getAutomation
      description: 'Retrieves an email automation.'
      parameters: []
      responses:
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  error: 'EmailAutomation not found'
                  message: 'EmailAutomation not found'
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: 'EmailAutomation not found'
                  message:
                    type: string
                    example: 'EmailAutomation not found'
      tags:
        - 'Email Marketing - Automations'
    put:
      summary: 'Update Automation'
      operationId: updateAutomation
      description: 'Updates an email automation.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Automations'
    delete:
      summary: 'Delete Automation'
      operationId: deleteAutomation
      description: 'Deletes an email automation and cancels its pending runs.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Automations'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: automationId
        description: 'The automation ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/automations/{automationId}/runs':
    get:
      summary: 'Get Automation Runs'
      operationId: getAutomationRuns
      description: 'Retrieves the run log of an automation.'
      parameters: []
      responses:
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  error: 'EmailAutomation not found'
                  message: 'EmailAutomation not found'
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: 'EmailAutomation not found'
                  message:
                    type: string
                    example: 'EmailAutomation not found'
      tags:
        - 'Email Marketing - Automations'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: automationId
        description: 'The automation ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/campaigns':
    get:
      summary: 'Get Campaigns'
      operationId: getCampaigns
      description: 'Retrieves the email campaigns.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data: []
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/email-marketing/campaigns?page=1'
                  from: null
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/email-marketing/campaigns?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/email-marketing/campaigns?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/email-marketing/campaigns'
                  per_page: 20
                  prev_page_url: null
                  to: null
                  total: 0
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example: []
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/email-marketing/campaigns?page=1'
                  from:
                    type: string
                    example: null
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/email-marketing/campaigns?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/email-marketing/campaigns?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/email-marketing/campaigns'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: string
                    example: null
                  total:
                    type: integer
                    example: 0
      tags:
        - 'Email Marketing - Campaigns'
    post:
      summary: 'Create Campaign'
      operationId: createCampaign
      description: 'Creates a draft email campaign.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Campaigns'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/campaigns/{campaignId}':
    get:
      summary: 'Get Campaign'
      operationId: getCampaign
      description: 'Retrieves an email campaign.'
      parameters: []
      responses:
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  error: 'EmailCampaign not found'
                  message: 'EmailCampaign not found'
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: 'EmailCampaign not found'
                  message:
                    type: string
                    example: 'EmailCampaign not found'
      tags:
        - 'Email Marketing - Campaigns'
    put:
      summary: 'Update Campaign'
      operationId: updateCampaign
      description: 'Updates a draft or scheduled email campaign.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Campaigns'
    delete:
      summary: 'Delete Campaign'
      operationId: deleteCampaign
      description: 'Deletes an email campaign.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Campaigns'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: campaignId
        description: 'The campaign ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/campaigns/{campaignId}/duplicate':
    post:
      summary: 'Duplicate Campaign'
      operationId: duplicateCampaign
      description: 'Duplicates a campaign as a new draft.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Campaigns'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: campaignId
        description: 'The campaign ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/campaigns/{campaignId}/pause':
    post:
      summary: 'Pause Campaign'
      operationId: pauseCampaign
      description: 'Pauses a sending campaign.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Campaigns'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: campaignId
        description: 'The campaign ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/campaigns/{campaignId}/resume':
    post:
      summary: 'Resume Campaign'
      operationId: resumeCampaign
      description: 'Resumes a paused campaign.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Campaigns'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: campaignId
        description: 'The campaign ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/campaigns/{campaignId}/cancel':
    post:
      summary: 'Cancel Campaign'
      operationId: cancelCampaign
      description: 'Cancels a scheduled, sending, or paused campaign.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Campaigns'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: campaignId
        description: 'The campaign ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/campaigns/{campaignId}/stats':
    get:
      summary: 'Get Campaign Stats'
      operationId: getCampaignStats
      description: 'Retrieves aggregate stats for a campaign.'
      parameters: []
      responses:
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  error: 'EmailCampaign not found'
                  message: 'EmailCampaign not found'
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: 'EmailCampaign not found'
                  message:
                    type: string
                    example: 'EmailCampaign not found'
      tags:
        - 'Email Marketing - Campaigns'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: campaignId
        description: 'The campaign ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/campaigns/{campaignId}/recipients':
    get:
      summary: 'Get Campaign Recipients'
      operationId: getCampaignRecipients
      description: 'Retrieves the per-recipient send log of a campaign.'
      parameters: []
      responses:
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  error: 'EmailCampaign not found'
                  message: 'EmailCampaign not found'
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: 'EmailCampaign not found'
                  message:
                    type: string
                    example: 'EmailCampaign not found'
      tags:
        - 'Email Marketing - Campaigns'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: campaignId
        description: 'The campaign ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/campaigns/{campaignId}/send':
    post:
      summary: 'Send Campaign'
      operationId: sendCampaign
      description: 'Queues a campaign for immediate or scheduled sending.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Campaigns'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                scheduled_at:
                  type: string
                  description: 'Must be a valid date. Must be a date after <code>now</code>.'
                  example: '2084-08-07'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: campaignId
        description: 'The campaign ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/campaigns/{campaignId}/test-send':
    post:
      summary: 'Test Send Campaign'
      operationId: testSendCampaign
      description: 'Sends a test email of the campaign to the given address.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Campaigns'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: ''
                  example: null
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: campaignId
        description: 'The campaign ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/contacts':
    get:
      summary: 'Get Contacts'
      operationId: getContacts
      description: 'Retrieves the shop contact pool (manually added and imported contacts).'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data: []
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/email-marketing/contacts?page=1'
                  from: null
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/email-marketing/contacts?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/email-marketing/contacts?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/email-marketing/contacts'
                  per_page: 20
                  prev_page_url: null
                  to: null
                  total: 0
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example: []
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/email-marketing/contacts?page=1'
                  from:
                    type: string
                    example: null
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/email-marketing/contacts?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/email-marketing/contacts?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/email-marketing/contacts'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: string
                    example: null
                  total:
                    type: integer
                    example: 0
      tags:
        - 'Email Marketing - Contacts'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/contacts/{contactId}':
    delete:
      summary: 'Delete Contact'
      operationId: deleteContact
      description: 'Deletes a contact from the shop pool (and all its lists).'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Contacts'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: contactId
        description: 'The contact ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/lists':
    get:
      summary: 'Get Email Lists'
      operationId: getEmailLists
      description: 'Retrieves the email lists.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data: []
                properties:
                  data:
                    type: array
                    example: []
      tags:
        - 'Email Marketing - Lists'
    post:
      summary: 'Create Email List'
      operationId: createEmailList
      description: 'Creates an email list.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Lists'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/lists/segment-preview':
    post:
      summary: 'Preview Segment'
      operationId: previewSegment
      description: 'Returns the number of customers matching segment filters.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Lists'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/lists/{listId}':
    get:
      summary: 'Get Email List'
      operationId: getEmailList
      description: 'Retrieves an email list.'
      parameters: []
      responses:
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  error: 'EmailList not found'
                  message: 'EmailList not found'
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: 'EmailList not found'
                  message:
                    type: string
                    example: 'EmailList not found'
      tags:
        - 'Email Marketing - Lists'
    put:
      summary: 'Update Email List'
      operationId: updateEmailList
      description: 'Updates an email list.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Lists'
    delete:
      summary: 'Delete Email List'
      operationId: deleteEmailList
      description: 'Deletes an email list. Contacts remain in the shop contact pool.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Lists'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: listId
        description: 'The list ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/lists/{listId}/contacts':
    get:
      summary: 'Get List Contacts'
      operationId: getListContacts
      description: 'Retrieves the contacts of a manual email list.'
      parameters: []
      responses:
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  error: 'EmailList not found'
                  message: 'EmailList not found'
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: 'EmailList not found'
                  message:
                    type: string
                    example: 'EmailList not found'
      tags:
        - 'Email Marketing - Lists'
    post:
      summary: 'Add List Contacts'
      operationId: addListContacts
      description: 'Adds contacts (new or existing) to a manual email list.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Lists'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                contacts:
                  type: array
                  description: 'Must have at least 1 items. Must not have more than 100 items.'
                  example: pasyzwszwtxpeqq
                  items:
                    type: string
                consent_confirmed:
                  type: boolean
                  description: 'Must be accepted.'
                  example: true
              required:
                - contacts
                - consent_confirmed
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: listId
        description: 'The list ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/lists/{listId}/contacts/{contactId}':
    delete:
      summary: 'Remove List Contact'
      operationId: removeListContact
      description: 'Removes a contact from a manual email list.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Lists'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: listId
        description: 'The list ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: contactId
        description: 'The contact ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/lists/{listId}/import':
    post:
      summary: 'Import List Contacts'
      operationId: importListContacts
      description: 'Imports contacts into a manual list from a CSV file (email[,name]).'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Lists'
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                  description: 'Must be a file. Must not be greater than 2048 kilobytes.'
                consent_confirmed:
                  type: boolean
                  description: 'Must be accepted.'
                  example: true
              required:
                - file
                - consent_confirmed
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: listId
        description: 'The list ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/stats':
    get:
      summary: 'Get Email Marketing Stats'
      operationId: getEmailMarketingStats
      description: 'Retrieves shop-level email marketing stats and usage.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  monthly_limit: 50000
                  monthly_sent: 0
                  monthly_remaining: 50000
                  campaigns_count: 0
                  campaigns_sending: 0
                  lists_count: 0
                  contacts_count: 0
                  templates_count: 0
                  automations_count: 0
                  unsubscribes_count: 0
                properties:
                  monthly_limit:
                    type: integer
                    example: 50000
                  monthly_sent:
                    type: integer
                    example: 0
                  monthly_remaining:
                    type: integer
                    example: 50000
                  campaigns_count:
                    type: integer
                    example: 0
                  campaigns_sending:
                    type: integer
                    example: 0
                  lists_count:
                    type: integer
                    example: 0
                  contacts_count:
                    type: integer
                    example: 0
                  templates_count:
                    type: integer
                    example: 0
                  automations_count:
                    type: integer
                    example: 0
                  unsubscribes_count:
                    type: integer
                    example: 0
      tags:
        - 'Email Marketing - Stats'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/unsubscribes':
    get:
      summary: 'Get Unsubscribes'
      operationId: getUnsubscribes
      description: "Retrieves the recipients who unsubscribed from this shop's emails."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  current_page: 1
                  data: []
                  first_page_url: 'http://api.sellauth.test/v1/shops/1/email-marketing/unsubscribes?page=1'
                  from: null
                  last_page: 1
                  last_page_url: 'http://api.sellauth.test/v1/shops/1/email-marketing/unsubscribes?page=1'
                  links:
                    -
                      url: null
                      label: '&laquo; Previous'
                      active: false
                    -
                      url: 'http://api.sellauth.test/v1/shops/1/email-marketing/unsubscribes?page=1'
                      label: '1'
                      active: true
                    -
                      url: null
                      label: 'Next &raquo;'
                      active: false
                  next_page_url: null
                  path: 'http://api.sellauth.test/v1/shops/1/email-marketing/unsubscribes'
                  per_page: 20
                  prev_page_url: null
                  to: null
                  total: 0
                properties:
                  current_page:
                    type: integer
                    example: 1
                  data:
                    type: array
                    example: []
                  first_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/email-marketing/unsubscribes?page=1'
                  from:
                    type: string
                    example: null
                  last_page:
                    type: integer
                    example: 1
                  last_page_url:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/email-marketing/unsubscribes?page=1'
                  links:
                    type: array
                    example:
                      -
                        url: null
                        label: '&laquo; Previous'
                        active: false
                      -
                        url: 'http://api.sellauth.test/v1/shops/1/email-marketing/unsubscribes?page=1'
                        label: '1'
                        active: true
                      -
                        url: null
                        label: 'Next &raquo;'
                        active: false
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          example: null
                        label:
                          type: string
                          example: '&laquo; Previous'
                        active:
                          type: boolean
                          example: false
                  next_page_url:
                    type: string
                    example: null
                  path:
                    type: string
                    example: 'http://api.sellauth.test/v1/shops/1/email-marketing/unsubscribes'
                  per_page:
                    type: integer
                    example: 20
                  prev_page_url:
                    type: string
                    example: null
                  to:
                    type: string
                    example: null
                  total:
                    type: integer
                    example: 0
      tags:
        - 'Email Marketing - Stats'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/templates':
    get:
      summary: 'Get Marketing Templates'
      operationId: getMarketingTemplates
      description: 'Retrieves the marketing email templates.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data: []
                properties:
                  data:
                    type: array
                    example: []
      tags:
        - 'Email Marketing - Templates'
    post:
      summary: 'Create Marketing Template'
      operationId: createMarketingTemplate
      description: 'Creates a marketing email template.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Templates'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: pasyzwszwtxpeqq
                content:
                  type: string
                  description: 'Must not be greater than 1048576 characters.'
                  example: ikymwkiinfowtzm
              required:
                - name
                - content
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/templates/presets':
    get:
      summary: 'Get Marketing Template Presets'
      operationId: getMarketingTemplatePresets
      description: 'Retrieves the platform preset templates.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  data:
                    -
                      id: announcement
                      name: Announcement
                      description: 'A general announcement or update for your customers.'
                      content: eyUgYmxvY2sgc3ViamVjdCAlfQogIE5ld3MgZnJvbSB7eyBzaG9wLm5hbWUgfX0KeyUgZW5kYmxvY2sgJX0KCnslIGJsb2NrIGNvbnRlbnQgJX0KICA8aDE+V2UgaGF2ZSBuZXdzIGZvciB5b3U8L2gxPgogIDxwPkhpeyUgaWYgY29udGFjdC5uYW1lICV9IHt7IGNvbnRhY3QubmFtZSB9fXslIGVuZGlmICV9LDwvcD4KICA8cD5Xcml0ZSB5b3VyIGFubm91bmNlbWVudCBoZXJlLiBUZWxsIHlvdXIgY3VzdG9tZXJzIHdoYXQgY2hhbmdlZCwgd2hhdCBpcyBuZXcsIG9yIHdoYXQgaXMgY29taW5nIG5leHQgYXQgPHN0cm9uZz57eyBzaG9wLm5hbWUgfX08L3N0cm9uZz4uPC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIj4KICAgIDx0cj4KICAgICAgPHRkIGNsYXNzPSJidXR0b24tY29udGFpbmVyIiBzdHlsZT0icGFkZGluZzogNnB4IDAgMThweCAwOyI+CiAgICAgICAgPGEgaHJlZj0ie3sgc2hvcC51cmwgfX0iIHJlbD0ibm9vcGVuZXIiIGNsYXNzPSJidXR0b24iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzY1NzFmZjsgYm9yZGVyLXJhZGl1czogMTBweDsgY29sb3I6ICNmZmZmZmY7IGRpc3BsYXk6IGJsb2NrOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiAxMDAlOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGxldHRlci1zcGFjaW5nOiAwLjAxZW07IHBhZGRpbmc6IDEzcHggMjJweDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+CiAgICAgICAgICBWaXNpdCB7eyBzaG9wLm5hbWUgfX0KICAgICAgICA8L2E+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CnslIGVuZGJsb2NrICV9
                    -
                      id: sale-promo
                      name: 'Sale / Promo'
                      description: 'Promote a sale with a coupon code and call to action.'
                      content: eyUgYmxvY2sgc3ViamVjdCAlfQogIEEgc3BlY2lhbCBvZmZlciBmcm9tIHt7IHNob3AubmFtZSB9fQp7JSBlbmRibG9jayAlfQoKeyUgYmxvY2sgY29udGVudCAlfQogIDxoMT5MaW1pdGVkIHRpbWUgb2ZmZXI8L2gxPgogIDxwPkhpeyUgaWYgY29udGFjdC5uYW1lICV9IHt7IGNvbnRhY3QubmFtZSB9fXslIGVuZGlmICV9LDwvcD4KICA8cD5XZSBhcmUgcnVubmluZyBhIHNhbGUgYXQgPHN0cm9uZz57eyBzaG9wLm5hbWUgfX08L3N0cm9uZz4gYW5kIHdhbnRlZCB5b3UgdG8gaGVhciBhYm91dCBpdCBmaXJzdC48L3A+CgogIDxkaXYgY2xhc3M9ImNvdXBvbi1ibG9jayIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYmEoMTAxLDExMywyNTUsMC4wNCk7IGJvcmRlcjogMS41cHggZGFzaGVkIHJnYmEoMTAxLDExMywyNTUsMC4zKTsgYm9yZGVyLXJhZGl1czogMTBweDsgbWFyZ2luOiAwIDAgMjBweCAwOyBwYWRkaW5nOiAxOHB4IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsiPgogICAgPHAgc3R5bGU9ImNvbG9yOiAjNzE3MTdhOyBmb250LXNpemU6IDEzcHg7IG1hcmdpbjogMCAwIDEwcHggMDsiPlVzZSB0aGlzIGNvZGUgYXQgY2hlY2tvdXQ8L3A+CiAgICA8c3BhbiBjbGFzcz0iY291cG9uLWNvZGUiIHN0eWxlPSJjb2xvcjogIzE4MTgxYjsgZm9udC1mYW1pbHk6ICdHZWlzdCBNb25vJywgJ1NGIE1vbm8nLCAnRmlyYSBDb2RlJywgdWktbW9ub3NwYWNlLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMjJweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMTRlbTsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogMCAwIDhweCAwOyI+WU9VUkNPREU8L3NwYW4+CiAgICA8cCBjbGFzcz0iY291cG9uLW1ldGEiIHN0eWxlPSJjb2xvcjogIzcxNzE3YTsgZm9udC1zaXplOiAxM3B4OyBtYXJnaW46IDA7Ij4xMCUgb2ZmIHlvdXIgbmV4dCBvcmRlcjwvcD4KICA8L2Rpdj4KCiAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHJvbGU9InByZXNlbnRhdGlvbiI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0iYnV0dG9uLWNvbnRhaW5lciIgc3R5bGU9InBhZGRpbmc6IDZweCAwIDE4cHggMDsiPgogICAgICAgIDxhIGhyZWY9Int7IHNob3AudXJsIH19IiByZWw9Im5vb3BlbmVyIiBjbGFzcz0iYnV0dG9uIiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM2NTcxZmY7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGNvbG9yOiAjZmZmZmZmOyBkaXNwbGF5OiBibG9jazsgdGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogMTAwJTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNjAwOyBsZXR0ZXItc3BhY2luZzogMC4wMWVtOyBwYWRkaW5nOiAxM3B4IDIycHg7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsiPgogICAgICAgICAgU2hvcCBOb3cKICAgICAgICA8L2E+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CnslIGVuZGJsb2NrICV9
                    -
                      id: new-product
                      name: 'New Product'
                      description: 'Introduce a new product to your customers.'
                      content: eyUgYmxvY2sgc3ViamVjdCAlfQogIE5ldyBhdCB7eyBzaG9wLm5hbWUgfX0KeyUgZW5kYmxvY2sgJX0KCnslIGJsb2NrIGNvbnRlbnQgJX0KICA8aDE+U29tZXRoaW5nIG5ldyBqdXN0IGRyb3BwZWQ8L2gxPgogIDxwPkhpeyUgaWYgY29udGFjdC5uYW1lICV9IHt7IGNvbnRhY3QubmFtZSB9fXslIGVuZGlmICV9LDwvcD4KICA8cD5XZSBqdXN0IGFkZGVkIGEgbmV3IHByb2R1Y3QgYXQgPHN0cm9uZz57eyBzaG9wLm5hbWUgfX08L3N0cm9uZz4uIERlc2NyaWJlIGl0IGhlcmUg4oCUIHdoYXQgaXQgaXMsIHdoYXQgaXQgZG9lcywgYW5kIHdoeSB5b3VyIGN1c3RvbWVycyB3aWxsIHdhbnQgaXQuPC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIj4KICAgIDx0cj4KICAgICAgPHRkIGNsYXNzPSJidXR0b24tY29udGFpbmVyIiBzdHlsZT0icGFkZGluZzogNnB4IDAgMThweCAwOyI+CiAgICAgICAgPGEgaHJlZj0ie3sgc2hvcC51cmwgfX0iIHJlbD0ibm9vcGVuZXIiIGNsYXNzPSJidXR0b24iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzY1NzFmZjsgYm9yZGVyLXJhZGl1czogMTBweDsgY29sb3I6ICNmZmZmZmY7IGRpc3BsYXk6IGJsb2NrOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiAxMDAlOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGxldHRlci1zcGFjaW5nOiAwLjAxZW07IHBhZGRpbmc6IDEzcHggMjJweDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+CiAgICAgICAgICBDaGVjayBJdCBPdXQKICAgICAgICA8L2E+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CnslIGVuZGJsb2NrICV9
                    -
                      id: winback
                      name: Win-back
                      description: 'Re-engage customers who have not purchased in a while.'
                      content: eyUgYmxvY2sgc3ViamVjdCAlfQogIFdlIG1pc3MgeW91IGF0IHt7IHNob3AubmFtZSB9fQp7JSBlbmRibG9jayAlfQoKeyUgYmxvY2sgY29udGVudCAlfQogIDxoMT5JdCZhcG9zO3MgYmVlbiBhIHdoaWxlPC9oMT4KICA8cD5IaXslIGlmIGNvbnRhY3QubmFtZSAlfSB7eyBjb250YWN0Lm5hbWUgfX17JSBlbmRpZiAlfSw8L3A+CiAgPHA+V2Ugbm90aWNlZCB5b3UgaGF2ZW4mYXBvczt0IGJlZW4gYXJvdW5kIDxzdHJvbmc+e3sgc2hvcC5uYW1lIH19PC9zdHJvbmc+IGxhdGVseS4gSGVyZSZhcG9zO3MgYSByZWFzb24gdG8gY29tZSBiYWNrIOKAlCBhZGQgYSBjb3Vwb24gY29kZSBvciBoaWdobGlnaHQgd2hhdCZhcG9zO3MgbmV3IHNpbmNlIHlvdXIgbGFzdCB2aXNpdC48L3A+CgogIDx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iPgogICAgPHRyPgogICAgICA8dGQgY2xhc3M9ImJ1dHRvbi1jb250YWluZXIiIHN0eWxlPSJwYWRkaW5nOiA2cHggMCAxOHB4IDA7Ij4KICAgICAgICA8YSBocmVmPSJ7eyBzaG9wLnVybCB9fSIgcmVsPSJub29wZW5lciIgY2xhc3M9ImJ1dHRvbiIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjNjU3MWZmOyBib3JkZXItcmFkaXVzOiAxMHB4OyBjb2xvcjogI2ZmZmZmZjsgZGlzcGxheTogYmxvY2s7IHRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDEwMCU7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDYwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsgcGFkZGluZzogMTNweCAyMnB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ij4KICAgICAgICAgIENvbWUgQmFjayB0byB7eyBzaG9wLm5hbWUgfX0KICAgICAgICA8L2E+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CnslIGVuZGJsb2NrICV9
                    -
                      id: newsletter-basic
                      name: 'Basic Newsletter'
                      description: 'A simple newsletter layout with a few content sections.'
                      content: eyUgYmxvY2sgc3ViamVjdCAlfQogIHt7IHNob3AubmFtZSB9fSBuZXdzbGV0dGVyCnslIGVuZGJsb2NrICV9Cgp7JSBibG9jayBjb250ZW50ICV9CiAgPGgxPlRoaXMgbW9udGggYXQge3sgc2hvcC5uYW1lIH19PC9oMT4KICA8cD5IaXslIGlmIGNvbnRhY3QubmFtZSAlfSB7eyBjb250YWN0Lm5hbWUgfX17JSBlbmRpZiAlfSw8L3A+CgogIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDIwcHggMCA4cHggMDsiPlNlY3Rpb24gb25lPC9oMj4KICA8cD5Zb3VyIGZpcnN0IHVwZGF0ZSBnb2VzIGhlcmUuPC9wPgoKICA8aDIgc3R5bGU9ImZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAyMHB4IDAgOHB4IDA7Ij5TZWN0aW9uIHR3bzwvaDI+CiAgPHA+WW91ciBzZWNvbmQgdXBkYXRlIGdvZXMgaGVyZS48L3A+CgogIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDIwcHggMCA4cHggMDsiPlNlY3Rpb24gdGhyZWU8L2gyPgogIDxwPllvdXIgdGhpcmQgdXBkYXRlIGdvZXMgaGVyZS48L3A+CgogIDx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iPgogICAgPHRyPgogICAgICA8dGQgY2xhc3M9ImJ1dHRvbi1jb250YWluZXIiIHN0eWxlPSJwYWRkaW5nOiA2cHggMCAxOHB4IDA7Ij4KICAgICAgICA8YSBocmVmPSJ7eyBzaG9wLnVybCB9fSIgcmVsPSJub29wZW5lciIgY2xhc3M9ImJ1dHRvbiIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjNjU3MWZmOyBib3JkZXItcmFkaXVzOiAxMHB4OyBjb2xvcjogI2ZmZmZmZjsgZGlzcGxheTogYmxvY2s7IHRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDEwMCU7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDYwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsgcGFkZGluZzogMTNweCAyMnB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ij4KICAgICAgICAgIFZpc2l0IHt7IHNob3AubmFtZSB9fQogICAgICAgIDwvYT4KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KeyUgZW5kYmxvY2sgJX0=
                properties:
                  data:
                    type: array
                    example:
                      -
                        id: announcement
                        name: Announcement
                        description: 'A general announcement or update for your customers.'
                        content: eyUgYmxvY2sgc3ViamVjdCAlfQogIE5ld3MgZnJvbSB7eyBzaG9wLm5hbWUgfX0KeyUgZW5kYmxvY2sgJX0KCnslIGJsb2NrIGNvbnRlbnQgJX0KICA8aDE+V2UgaGF2ZSBuZXdzIGZvciB5b3U8L2gxPgogIDxwPkhpeyUgaWYgY29udGFjdC5uYW1lICV9IHt7IGNvbnRhY3QubmFtZSB9fXslIGVuZGlmICV9LDwvcD4KICA8cD5Xcml0ZSB5b3VyIGFubm91bmNlbWVudCBoZXJlLiBUZWxsIHlvdXIgY3VzdG9tZXJzIHdoYXQgY2hhbmdlZCwgd2hhdCBpcyBuZXcsIG9yIHdoYXQgaXMgY29taW5nIG5leHQgYXQgPHN0cm9uZz57eyBzaG9wLm5hbWUgfX08L3N0cm9uZz4uPC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIj4KICAgIDx0cj4KICAgICAgPHRkIGNsYXNzPSJidXR0b24tY29udGFpbmVyIiBzdHlsZT0icGFkZGluZzogNnB4IDAgMThweCAwOyI+CiAgICAgICAgPGEgaHJlZj0ie3sgc2hvcC51cmwgfX0iIHJlbD0ibm9vcGVuZXIiIGNsYXNzPSJidXR0b24iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzY1NzFmZjsgYm9yZGVyLXJhZGl1czogMTBweDsgY29sb3I6ICNmZmZmZmY7IGRpc3BsYXk6IGJsb2NrOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiAxMDAlOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGxldHRlci1zcGFjaW5nOiAwLjAxZW07IHBhZGRpbmc6IDEzcHggMjJweDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+CiAgICAgICAgICBWaXNpdCB7eyBzaG9wLm5hbWUgfX0KICAgICAgICA8L2E+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CnslIGVuZGJsb2NrICV9
                      -
                        id: sale-promo
                        name: 'Sale / Promo'
                        description: 'Promote a sale with a coupon code and call to action.'
                        content: eyUgYmxvY2sgc3ViamVjdCAlfQogIEEgc3BlY2lhbCBvZmZlciBmcm9tIHt7IHNob3AubmFtZSB9fQp7JSBlbmRibG9jayAlfQoKeyUgYmxvY2sgY29udGVudCAlfQogIDxoMT5MaW1pdGVkIHRpbWUgb2ZmZXI8L2gxPgogIDxwPkhpeyUgaWYgY29udGFjdC5uYW1lICV9IHt7IGNvbnRhY3QubmFtZSB9fXslIGVuZGlmICV9LDwvcD4KICA8cD5XZSBhcmUgcnVubmluZyBhIHNhbGUgYXQgPHN0cm9uZz57eyBzaG9wLm5hbWUgfX08L3N0cm9uZz4gYW5kIHdhbnRlZCB5b3UgdG8gaGVhciBhYm91dCBpdCBmaXJzdC48L3A+CgogIDxkaXYgY2xhc3M9ImNvdXBvbi1ibG9jayIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHJnYmEoMTAxLDExMywyNTUsMC4wNCk7IGJvcmRlcjogMS41cHggZGFzaGVkIHJnYmEoMTAxLDExMywyNTUsMC4zKTsgYm9yZGVyLXJhZGl1czogMTBweDsgbWFyZ2luOiAwIDAgMjBweCAwOyBwYWRkaW5nOiAxOHB4IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsiPgogICAgPHAgc3R5bGU9ImNvbG9yOiAjNzE3MTdhOyBmb250LXNpemU6IDEzcHg7IG1hcmdpbjogMCAwIDEwcHggMDsiPlVzZSB0aGlzIGNvZGUgYXQgY2hlY2tvdXQ8L3A+CiAgICA8c3BhbiBjbGFzcz0iY291cG9uLWNvZGUiIHN0eWxlPSJjb2xvcjogIzE4MTgxYjsgZm9udC1mYW1pbHk6ICdHZWlzdCBNb25vJywgJ1NGIE1vbm8nLCAnRmlyYSBDb2RlJywgdWktbW9ub3NwYWNlLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMjJweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMTRlbTsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogMCAwIDhweCAwOyI+WU9VUkNPREU8L3NwYW4+CiAgICA8cCBjbGFzcz0iY291cG9uLW1ldGEiIHN0eWxlPSJjb2xvcjogIzcxNzE3YTsgZm9udC1zaXplOiAxM3B4OyBtYXJnaW46IDA7Ij4xMCUgb2ZmIHlvdXIgbmV4dCBvcmRlcjwvcD4KICA8L2Rpdj4KCiAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHJvbGU9InByZXNlbnRhdGlvbiI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0iYnV0dG9uLWNvbnRhaW5lciIgc3R5bGU9InBhZGRpbmc6IDZweCAwIDE4cHggMDsiPgogICAgICAgIDxhIGhyZWY9Int7IHNob3AudXJsIH19IiByZWw9Im5vb3BlbmVyIiBjbGFzcz0iYnV0dG9uIiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM2NTcxZmY7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGNvbG9yOiAjZmZmZmZmOyBkaXNwbGF5OiBibG9jazsgdGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogMTAwJTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNjAwOyBsZXR0ZXItc3BhY2luZzogMC4wMWVtOyBwYWRkaW5nOiAxM3B4IDIycHg7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsiPgogICAgICAgICAgU2hvcCBOb3cKICAgICAgICA8L2E+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CnslIGVuZGJsb2NrICV9
                      -
                        id: new-product
                        name: 'New Product'
                        description: 'Introduce a new product to your customers.'
                        content: eyUgYmxvY2sgc3ViamVjdCAlfQogIE5ldyBhdCB7eyBzaG9wLm5hbWUgfX0KeyUgZW5kYmxvY2sgJX0KCnslIGJsb2NrIGNvbnRlbnQgJX0KICA8aDE+U29tZXRoaW5nIG5ldyBqdXN0IGRyb3BwZWQ8L2gxPgogIDxwPkhpeyUgaWYgY29udGFjdC5uYW1lICV9IHt7IGNvbnRhY3QubmFtZSB9fXslIGVuZGlmICV9LDwvcD4KICA8cD5XZSBqdXN0IGFkZGVkIGEgbmV3IHByb2R1Y3QgYXQgPHN0cm9uZz57eyBzaG9wLm5hbWUgfX08L3N0cm9uZz4uIERlc2NyaWJlIGl0IGhlcmUg4oCUIHdoYXQgaXQgaXMsIHdoYXQgaXQgZG9lcywgYW5kIHdoeSB5b3VyIGN1c3RvbWVycyB3aWxsIHdhbnQgaXQuPC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIj4KICAgIDx0cj4KICAgICAgPHRkIGNsYXNzPSJidXR0b24tY29udGFpbmVyIiBzdHlsZT0icGFkZGluZzogNnB4IDAgMThweCAwOyI+CiAgICAgICAgPGEgaHJlZj0ie3sgc2hvcC51cmwgfX0iIHJlbD0ibm9vcGVuZXIiIGNsYXNzPSJidXR0b24iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzY1NzFmZjsgYm9yZGVyLXJhZGl1czogMTBweDsgY29sb3I6ICNmZmZmZmY7IGRpc3BsYXk6IGJsb2NrOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiAxMDAlOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGxldHRlci1zcGFjaW5nOiAwLjAxZW07IHBhZGRpbmc6IDEzcHggMjJweDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+CiAgICAgICAgICBDaGVjayBJdCBPdXQKICAgICAgICA8L2E+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CnslIGVuZGJsb2NrICV9
                      -
                        id: winback
                        name: Win-back
                        description: 'Re-engage customers who have not purchased in a while.'
                        content: eyUgYmxvY2sgc3ViamVjdCAlfQogIFdlIG1pc3MgeW91IGF0IHt7IHNob3AubmFtZSB9fQp7JSBlbmRibG9jayAlfQoKeyUgYmxvY2sgY29udGVudCAlfQogIDxoMT5JdCZhcG9zO3MgYmVlbiBhIHdoaWxlPC9oMT4KICA8cD5IaXslIGlmIGNvbnRhY3QubmFtZSAlfSB7eyBjb250YWN0Lm5hbWUgfX17JSBlbmRpZiAlfSw8L3A+CiAgPHA+V2Ugbm90aWNlZCB5b3UgaGF2ZW4mYXBvczt0IGJlZW4gYXJvdW5kIDxzdHJvbmc+e3sgc2hvcC5uYW1lIH19PC9zdHJvbmc+IGxhdGVseS4gSGVyZSZhcG9zO3MgYSByZWFzb24gdG8gY29tZSBiYWNrIOKAlCBhZGQgYSBjb3Vwb24gY29kZSBvciBoaWdobGlnaHQgd2hhdCZhcG9zO3MgbmV3IHNpbmNlIHlvdXIgbGFzdCB2aXNpdC48L3A+CgogIDx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iPgogICAgPHRyPgogICAgICA8dGQgY2xhc3M9ImJ1dHRvbi1jb250YWluZXIiIHN0eWxlPSJwYWRkaW5nOiA2cHggMCAxOHB4IDA7Ij4KICAgICAgICA8YSBocmVmPSJ7eyBzaG9wLnVybCB9fSIgcmVsPSJub29wZW5lciIgY2xhc3M9ImJ1dHRvbiIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjNjU3MWZmOyBib3JkZXItcmFkaXVzOiAxMHB4OyBjb2xvcjogI2ZmZmZmZjsgZGlzcGxheTogYmxvY2s7IHRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDEwMCU7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDYwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsgcGFkZGluZzogMTNweCAyMnB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ij4KICAgICAgICAgIENvbWUgQmFjayB0byB7eyBzaG9wLm5hbWUgfX0KICAgICAgICA8L2E+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CnslIGVuZGJsb2NrICV9
                      -
                        id: newsletter-basic
                        name: 'Basic Newsletter'
                        description: 'A simple newsletter layout with a few content sections.'
                        content: eyUgYmxvY2sgc3ViamVjdCAlfQogIHt7IHNob3AubmFtZSB9fSBuZXdzbGV0dGVyCnslIGVuZGJsb2NrICV9Cgp7JSBibG9jayBjb250ZW50ICV9CiAgPGgxPlRoaXMgbW9udGggYXQge3sgc2hvcC5uYW1lIH19PC9oMT4KICA8cD5IaXslIGlmIGNvbnRhY3QubmFtZSAlfSB7eyBjb250YWN0Lm5hbWUgfX17JSBlbmRpZiAlfSw8L3A+CgogIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDIwcHggMCA4cHggMDsiPlNlY3Rpb24gb25lPC9oMj4KICA8cD5Zb3VyIGZpcnN0IHVwZGF0ZSBnb2VzIGhlcmUuPC9wPgoKICA8aDIgc3R5bGU9ImZvbnQtc2l6ZTogMTZweDsgbWFyZ2luOiAyMHB4IDAgOHB4IDA7Ij5TZWN0aW9uIHR3bzwvaDI+CiAgPHA+WW91ciBzZWNvbmQgdXBkYXRlIGdvZXMgaGVyZS48L3A+CgogIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxNnB4OyBtYXJnaW46IDIwcHggMCA4cHggMDsiPlNlY3Rpb24gdGhyZWU8L2gyPgogIDxwPllvdXIgdGhpcmQgdXBkYXRlIGdvZXMgaGVyZS48L3A+CgogIDx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iPgogICAgPHRyPgogICAgICA8dGQgY2xhc3M9ImJ1dHRvbi1jb250YWluZXIiIHN0eWxlPSJwYWRkaW5nOiA2cHggMCAxOHB4IDA7Ij4KICAgICAgICA8YSBocmVmPSJ7eyBzaG9wLnVybCB9fSIgcmVsPSJub29wZW5lciIgY2xhc3M9ImJ1dHRvbiIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjNjU3MWZmOyBib3JkZXItcmFkaXVzOiAxMHB4OyBjb2xvcjogI2ZmZmZmZjsgZGlzcGxheTogYmxvY2s7IHRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDEwMCU7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDYwMDsgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsgcGFkZGluZzogMTNweCAyMnB4OyB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ij4KICAgICAgICAgIFZpc2l0IHt7IHNob3AubmFtZSB9fQogICAgICAgIDwvYT4KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgPC90YWJsZT4KeyUgZW5kYmxvY2sgJX0=
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          example: announcement
                        name:
                          type: string
                          example: Announcement
                        description:
                          type: string
                          example: 'A general announcement or update for your customers.'
                        content:
                          type: string
                          example: eyUgYmxvY2sgc3ViamVjdCAlfQogIE5ld3MgZnJvbSB7eyBzaG9wLm5hbWUgfX0KeyUgZW5kYmxvY2sgJX0KCnslIGJsb2NrIGNvbnRlbnQgJX0KICA8aDE+V2UgaGF2ZSBuZXdzIGZvciB5b3U8L2gxPgogIDxwPkhpeyUgaWYgY29udGFjdC5uYW1lICV9IHt7IGNvbnRhY3QubmFtZSB9fXslIGVuZGlmICV9LDwvcD4KICA8cD5Xcml0ZSB5b3VyIGFubm91bmNlbWVudCBoZXJlLiBUZWxsIHlvdXIgY3VzdG9tZXJzIHdoYXQgY2hhbmdlZCwgd2hhdCBpcyBuZXcsIG9yIHdoYXQgaXMgY29taW5nIG5leHQgYXQgPHN0cm9uZz57eyBzaG9wLm5hbWUgfX08L3N0cm9uZz4uPC9wPgoKICA8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIj4KICAgIDx0cj4KICAgICAgPHRkIGNsYXNzPSJidXR0b24tY29udGFpbmVyIiBzdHlsZT0icGFkZGluZzogNnB4IDAgMThweCAwOyI+CiAgICAgICAgPGEgaHJlZj0ie3sgc2hvcC51cmwgfX0iIHJlbD0ibm9vcGVuZXIiIGNsYXNzPSJidXR0b24iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzY1NzFmZjsgYm9yZGVyLXJhZGl1czogMTBweDsgY29sb3I6ICNmZmZmZmY7IGRpc3BsYXk6IGJsb2NrOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiAxMDAlOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGxldHRlci1zcGFjaW5nOiAwLjAxZW07IHBhZGRpbmc6IDEzcHggMjJweDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+CiAgICAgICAgICBWaXNpdCB7eyBzaG9wLm5hbWUgfX0KICAgICAgICA8L2E+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CnslIGVuZGJsb2NrICV9
      tags:
        - 'Email Marketing - Templates'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/templates/presets/{presetId}/clone':
    post:
      summary: 'Clone Marketing Template Preset'
      operationId: cloneMarketingTemplatePreset
      description: 'Clones a preset into a shop marketing template.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Templates'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: presetId
        description: 'The preset ID.'
        example: announcement
        required: true
        schema:
          type: string
  '/v1/shops/{shopId}/email-marketing/templates/{templateId}':
    get:
      summary: 'Get Marketing Template'
      operationId: getMarketingTemplate
      description: 'Retrieves a marketing email template with its njk content.'
      parameters: []
      responses:
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  error: 'EmailMarketingTemplate not found'
                  message: 'EmailMarketingTemplate not found'
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: 'EmailMarketingTemplate not found'
                  message:
                    type: string
                    example: 'EmailMarketingTemplate not found'
      tags:
        - 'Email Marketing - Templates'
    put:
      summary: 'Update Marketing Template'
      operationId: updateMarketingTemplate
      description: 'Updates a marketing email template.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Templates'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: pasyzwszwtxpeqq
                content:
                  type: string
                  description: 'Must not be greater than 1048576 characters.'
                  example: ikymwkiinfowtzm
              required:
                - name
                - content
    delete:
      summary: 'Delete Marketing Template'
      operationId: deleteMarketingTemplate
      description: 'Deletes a marketing email template.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Email Marketing - Templates'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: templateId
        description: 'The template ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/email-marketing/templates/{templateId}/preview':
    get:
      summary: 'Preview Marketing Template'
      operationId: previewMarketingTemplate
      description: 'Renders a marketing template with sample data.'
      parameters: []
      responses:
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  error: 'EmailMarketingTemplate not found'
                  message: 'EmailMarketingTemplate not found'
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: 'EmailMarketingTemplate not found'
                  message:
                    type: string
                    example: 'EmailMarketingTemplate not found'
      tags:
        - 'Email Marketing - Templates'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: templateId
        description: 'The template ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/reseller-connections':
    get:
      summary: 'List Supplier Connections'
      operationId: listSupplierConnections
      description: 'Connections where this shop is the reseller side: which suppliers its stock draws from.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example: []
      tags:
        - 'Reseller Connect'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/v1/shops/{shopId}/reseller-connections/{connectionId}':
    delete:
      summary: 'Disconnect Supplier'
      operationId: disconnectSupplier
      description: 'Removes the connection. Imported products stay but stop syncing; dynamic delivery falls back to a manually configured webhook secret, if any.'
      parameters: []
      responses:
        200:
          description: ''
      tags:
        - 'Reseller Connect'
    parameters:
      -
        in: path
        name: shopId
        description: 'The shop ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: connectionId
        description: 'The connection ID.'
        example: 1
        required: true
        schema:
          type: integer
tags:
  -
    name: User
    description: ''
  -
    name: Shops
    description: ''
  -
    name: Domains
    description: ''
  -
    name: 'Blog Posts'
    description: ''
  -
    name: Products
    description: ''
  -
    name: Groups
    description: ''
  -
    name: Categories
    description: ''
  -
    name: Images
    description: ''
  -
    name: 'Downloadable Files'
    description: ''
  -
    name: 'Custom Fields'
    description: ''
  -
    name: 'Quantity Deals'
    description: ''
  -
    name: 'Bundle Offers'
    description: ''
  -
    name: Coupons
    description: ''
  -
    name: 'Shipping Zones'
    description: ''
  -
    name: Checkout
    description: 'Checkout Endpoints allow you to create checkout sessions for your shop. Business Plan Subscription is required to create checkout sessions.'
  -
    name: Invoices
    description: ''
  -
    name: Subscriptions
    description: ''
  -
    name: 'Abandoned Checkouts'
    description: ''
  -
    name: Customers
    description: ''
  -
    name: Tickets
    description: ''
  -
    name: Feedbacks
    description: ''
  -
    name: Blacklist
    description: ''
  -
    name: Whitelist
    description: ''
  -
    name: 'Payment Methods'
    description: ''
  -
    name: 'Crypto Wallet'
    description: ''
  -
    name: Analytics
    description: ''
  -
    name: Notifications
    description: ''
  -
    name: 'Webhook Logs'
    description: ''
  -
    name: 'Activity Logs'
    description: ''
  -
    name: Affiliates
    description: ''
  -
    name: 'Affiliate Tiers'
    description: ''
  -
    name: 'Affiliate Payouts'
    description: ''
  -
    name: Resellers
    description: ''
  -
    name: 'Reseller Tiers'
    description: ''
  -
    name: 'Reseller Products'
    description: ''
  -
    name: 'Email Marketing - Automations'
    description: ''
  -
    name: 'Email Marketing - Campaigns'
    description: ''
  -
    name: 'Email Marketing - Contacts'
    description: ''
  -
    name: 'Email Marketing - Lists'
    description: ''
  -
    name: 'Email Marketing - Stats'
    description: ''
  -
    name: 'Email Marketing - Templates'
    description: ''
  -
    name: 'Reseller Connect'
    description: ''
components:
  securitySchemes:
    default:
      type: http
      scheme: bearer
      description: 'You can retrieve your API key from your dashboard under <a href="https://dash.sellauth.com/api"><b>Account > Developers</b></a>.'
security:
  -
    default: []
