Spendora API (1.0.0)

Download OpenAPI specification:

Auth

Authentication

NextAuth.js authentication endpoints

Get sign-in page

Returns the sign-in page with available authentication providers

Responses

Sign in with credentials

Authenticate user with email/password or initiate OAuth flow

Request Body schema: application/x-www-form-urlencoded
required
email
string <email>
password
string
action
string
Enum: "login" "register"
firstName
string
lastName
string
callbackUrl
string
json
boolean

Responses

Response samples

Content type
application/json
{
  • "url": "/dashboard",
  • "ok": true
}

Sign out user

Sign out the current user and clear session

Request Body schema: application/x-www-form-urlencoded
callbackUrl
string
json
boolean

Responses

Response samples

Content type
application/json
{
  • "url": "/",
  • "ok": true
}

Get current session

Retrieve the current user session information

Responses

Response samples

Content type
application/json
Example
{
  • "user": {
    },
  • "expires": "2023-01-01T12:00:00Z"
}

Get CSRF token

Retrieve CSRF token for form submissions

Responses

Response samples

Content type
application/json
{
  • "csrfToken": "abc123def456"
}

Get available providers

List all available authentication providers

Responses

Response samples

Content type
application/json
{
  • "credentials": {
    },
  • "google": {
    },
  • "apple": {
    },
  • "email": {
    }
}

OAuth callback

Handle OAuth provider callback (Google, Apple)

path Parameters
provider
required
string
Enum: "google" "apple"
Example: google
query Parameters
code
string

Authorization code from OAuth provider

state
string

State parameter for CSRF protection

error
string

Error code if authentication failed

Responses

Response samples

Content type
application/json
{
  • "error": "Configuration",
  • "message": "There is a problem with the server configuration"
}

Email verification page

Display email verification request page

Responses

Authentication error page

Display authentication error page

query Parameters
error
string
Enum: "Configuration" "AccessDenied" "Verification" "Default"
Example: error=Configuration

Error type

Responses

Videos

Video management operations

Change video status (Moderator only)

Allows moderator to change the status of a video (approve, reject, etc.)

Authorizations:
bearerAuth
path Parameters
id
required
string <uuid>
Example: 123e4567-e89b-12d3-a456-426614174000

Video ID

query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
status
required
string
Enum: "approved" "rejected" "pending"

New status for the video

reason
string

Optional reason for status change

Responses

Request samples

Content type
application/json
{
  • "status": "approved",
  • "reason": "Content approved after review"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Get video details

Retrieves detailed information about a specific video including available quality URLs

path Parameters
id
required
string <uuid>
Example: 123e4567-e89b-12d3-a456-426614174000

Video ID

query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Responses

Response samples

Content type
application/json
{}

Donate coins to a video

Donate coins to a video creator (help seeker)

Authorizations:
bearerAuth
path Parameters
id
required
string <uuid>
Example: 123e4567-e89b-12d3-a456-426614174000

Video ID to donate to

query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
coins
required
integer >= 1

Number of coins to donate

message
string <= 500 characters

Optional donation message

Responses

Request samples

Content type
application/json
{
  • "coins": 50,
  • "message": "Hope this helps!"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Get swipable video feed (unseen videos only)

Retrieves paginated list of approved videos that the authenticated user hasn't seen yet

Authorizations:
bearerAuth
query Parameters
page
integer >= 1
Default: 1
Example: page=1

Page number for pagination

limit
integer [ 1 .. 50 ]
Default: 10
Example: limit=10

Number of videos per page

locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Get video feed

Retrieves a paginated list of approved videos sorted by approval date

query Parameters
page
integer >= 1
Default: 1
Example: page=1

Page number for pagination

limit
integer [ 1 .. 50 ]
Default: 20
Example: limit=20

Number of videos per page

locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Responses

Response samples

Content type
application/json
{}

Mark a video as viewed

Marks a video as viewed by the authenticated user

Authorizations:
bearerAuth
path Parameters
id
required
string <uuid>

Video ID

Responses

Get list of processed videos for moderator

Retrieves a paginated list of all videos that have been transcoded (processed) for moderator review

Authorizations:
bearerAuth
query Parameters
page
integer >= 1
Default: 1
Example: page=1

Page number for pagination

limit
integer [ 1 .. 50 ]
Default: 20
Example: limit=20

Number of videos per page

status
string
Enum: "pending" "approved" "rejected"
Example: status=pending

Filter by status

locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Video transcoding worker

Processes pending videos and transcodes them to low, medium, and high quality versions (9:16 format)

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Upload a video

Uploads a vertical video (9:16) for the platform. Each user can only have one video.

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: multipart/form-data
required
video
required
string <binary>

Video file (MP4, max 100MB)

title
required
string

Video title

description
string

Optional video description

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Wallet

Wallet and coin operations

Get wallet balance

Retrieves the current wallet balance including available and locked coins

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Coins

Coin package and purchase operations

Get available coin packages

Retrieves a list of available coin packages for purchase

query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Purchase coin package

Initiates a coin package purchase with payment provider

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
packageId
required
string <uuid>

ID of the coin package to purchase

provider
required
string
Enum: "stripe" "apple_pay" "google_pay"

Payment provider

platform
string
Enum: "ios" "android" "web"

Platform for in-app purchases

idempotencyKey
string

Idempotency key to prevent duplicate purchases

Responses

Request samples

Content type
application/json
{
  • "packageId": "123e4567-e89b-12d3-a456-426614174000",
  • "provider": "stripe",
  • "platform": "ios",
  • "idempotencyKey": "purchase-123-456"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Payouts

Payout request and history operations

Get payout history

Retrieves paginated payout history for the authenticated user

Authorizations:
bearerAuth
query Parameters
page
integer >= 1
Default: 1
Example: page=1

Page number for pagination

limit
integer [ 1 .. 50 ]
Default: 20
Example: limit=20

Number of payouts per page

locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Request a payout

Request a payout of coins to external payment method

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
amount
required
integer >= 100

Amount of coins to payout (minimum 100)

iban
required
string^[A-Z]{2}[0-9]{2}[A-Z0-9]+$

IBAN (International Bank Account Number)

bic
required
string^[A-Z]{6}[A-Z0-9]{2}([A-Z0-9]{3})?$

BIC (Bank Identifier Code)

bankName
required
string

Name of the credit institution

recipientName
required
string

Name of the payment recipient

Responses

Request samples

Content type
application/json
{
  • "amount": 1000,
  • "iban": "DE89370400440532013000",
  • "bic": "COBADEFFXXX",
  • "bankName": "Commerzbank AG",
  • "recipientName": "Max Mustermann"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Health

API Health Check

Returns API information and available endpoints

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Payments

Initiate Apple In-App Purchase

Prepares Apple In-App Purchase with product ID and validates package

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
packageId
required
string <uuid>

ID of the coin package to purchase

productId
required
string

Apple App Store product ID (e.g., com.spendora.coins.100)

idempotencyKey
string

Optional idempotency key for tracking purposes

Responses

Request samples

Content type
application/json
{
  • "packageId": "123e4567-e89b-12d3-a456-426614174000",
  • "productId": "com.spendora.coins.100",
  • "idempotencyKey": "payment-123-456"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Verify Apple In-App Purchase

Verifies Apple receipt and credits coins to user

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
receipt
required
string

Base64-encoded receipt data from App Store

packageId
required
string <uuid>

ID of the coin package purchased

sandbox
boolean
Default: false

Use sandbox environment for testing

Responses

Request samples

Content type
application/json
{
  • "receipt": "MIIBkAYJKoZIhvcNAQcCoIIBgTCCAX0CAQExCzAJBgUr...",
  • "packageId": "123e4567-e89b-12d3-a456-426614174000",
  • "sandbox": false
}

Initiate Google Play In-App Purchase

Prepares Google Play In-App Purchase with product ID and validates package

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
packageId
required
string <uuid>

ID of the coin package to purchase

productId
required
string

Google Play product ID (e.g., coins_100)

idempotencyKey
string

Optional idempotency key for tracking purposes

Responses

Request samples

Content type
application/json
{
  • "packageId": "123e4567-e89b-12d3-a456-426614174000",
  • "productId": "coins_100",
  • "idempotencyKey": "payment-123-456"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Verify Google Play In-App Purchase

Verifies Google Play purchase token and credits coins to user

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
purchaseToken
required
string

Purchase token from Google Play

productId
required
string

Google Play product ID

packageId
required
string <uuid>

ID of the coin package purchased

packageName
string

Android package name (defaults to env var)

Responses

Request samples

Content type
application/json
{
  • "purchaseToken": "opaque-token-up-to-1500-characters",
  • "productId": "coins_100",
  • "packageId": "123e4567-e89b-12d3-a456-426614174000",
  • "packageName": "com.spendora.app"
}

Initiate Stripe payment

Creates a Stripe Checkout Session for coin package purchase

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
packageId
required
string <uuid>

ID of the coin package to purchase

successUrl
required
string <uri>

URL to redirect after successful payment

cancelUrl
required
string <uri>

URL to redirect after cancelled payment

idempotencyKey
string

Optional idempotency key for Stripe API

Responses

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Stripe webhook handler

Handles Stripe webhook events for payment verification

Request Body schema: application/json
required
object

Responses

Request samples

Content type
application/json
{ }

Push

Register push token

Registers a push notification token for the authenticated user

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
token
required
string

Push notification token

platform
required
string
Enum: "ios" "android" "web"

Platform of the device

Responses

Request samples

Content type
application/json
{
  • "token": "fGhJkL123456...",
  • "platform": "ios"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Unregister push token

Unregisters a push notification token for the authenticated user

Authorizations:
bearerAuth
query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

token
string
Example: token=fGhJkL123456...

Token to unregister (optional, if not provided, unregisters all tokens for user)

platform
string
Enum: "ios" "android" "web"
Example: platform=ios

Platform filter (optional)

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

User

Get current user information

Retrieves the current authenticated user's information including preferences

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Update user locale preference

Updates the authenticated user's language preference

Authorizations:
bearerAuth
Request Body schema: application/json
required
locale
required
string
Enum: "de" "en"

Language preference

Responses

Request samples

Content type
application/json
{
  • "locale": "de"
}

Moderator

Change video status (Moderator only)

Allows moderator to change the status of a video (approve, reject, etc.)

Authorizations:
bearerAuth
path Parameters
id
required
string <uuid>
Example: 123e4567-e89b-12d3-a456-426614174000

Video ID

query Parameters
locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Request Body schema: application/json
required
status
required
string
Enum: "approved" "rejected" "pending"

New status for the video

reason
string

Optional reason for status change

Responses

Request samples

Content type
application/json
{
  • "status": "approved",
  • "reason": "Content approved after review"
}

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}

Get list of processed videos for moderator

Retrieves a paginated list of all videos that have been transcoded (processed) for moderator review

Authorizations:
bearerAuth
query Parameters
page
integer >= 1
Default: 1
Example: page=1

Page number for pagination

limit
integer [ 1 .. 50 ]
Default: 20
Example: limit=20

Number of videos per page

status
string
Enum: "pending" "approved" "rejected"
Example: status=pending

Filter by status

locale
string
Enum: "de" "en"
Example: locale=en

Language preference for error messages

Responses

Response samples

Content type
application/json
{
  • "success": true,
  • "data": {
    }
}