ComusThumbz REST API
External API Integration Guide
Version: 1.0.0
Created: 2026-02-03
Overview
The ComusThumbz Webcam Performer system aggregates live cam performers from up to 11 external platforms into a unified browsing experience. Performers are synced via cron jobs, stored in tblCamsPerformers (~400K+ records), and served through the internal REST API at /ct/api/v1/cams.
The system has two layers:
- External API - The CrakRevenue Performers Ext API (
performersext-api.pcvdaa.com) provides performer data from platforms like Streamate, Chaturbate, Stripchat, etc. - Internal API - ComusThumbz's own REST API (
/ct/api/v1/cams/) serves normalized performer data to the frontend with caching and filtering.
System Architecture
External Cam Platforms (Chaturbate, Streamate, Stripchat, etc.)
|
v
CrakRevenue Performers Ext API (performersext-api.pcvdaa.com)
|
v
Cron: cronupdatecams.php (every 5-10 min)
|
v
Site-Specific Handlers (ct/admin/apis/cams.php)
|
v
tblCamsPerformers (normalize & store ~400K records)
|
v
Cron: updatecamperformerstats.php (every 1-5 min)
|
v
tblCamsPerformersStatsCache (pre-calculated counts)
|
v
Internal REST API: WebcamController (/ct/api/v1/cams/)
| |-- APCu cache (30s TTL)
| |-- Stats cache for COUNT queries
| |-- Fast mode (skip COUNT entirely)
v
Frontend Pages (camperformers.php, camperformer.php, camfilter.php)
|
v
User clicks performer -> click.php (skim tracking) -> External chat room
External API: Performers Ext
The CrakRevenue Performers Ext API is the primary data source for cam performer data.
Base URL: https://performersext-api.pcvdaa.com/performers-ext
Method: GET /performers-ext
Authentication
Three authentication elements are required for every request:
Example Request:
curl --location 'https://performersext-api.pcvdaa.com/performers-ext/?token=<YOURTOKEN>&gender=f&live=true&page=1&size=10' \
--header 'x-api-key: <YOURAPIKEY>' \
--header 'User-Agent: ComusThumbz/1.0'
Query Parameters
Available Ethnicity Values:
caucasian,ebony,hispanic,asian,indian,arab,native american
Available Age Group Values:
gc1819,gc2029,gc3039,gc4049,gc50plus
Response Format
Success Response (200 OK):
{
"count": 213,
"performers": [
{
"nameClean": "misshornymiss",
"characteristic": {
"bodyTypes": ["Slender"],
"country": "CA",
"gender": "f",
"languages": ["English", "French"],
"bustSize": "DD/E",
"ethnicities": ["White"],
"genderCode": "f",
"eyeColor": "Green",
"hairColor": "Red",
"age": 47,
"height": "65",
"weight": "145",
"measurements": "34-27-36\" (86-69-91cm)",
"zodiac": "Scorpio",
"pubicHair": "Hairy",
"bodyMods": ["Tattoos"],
"fetishes": ["Feet", "Anal", "Roleplay", "Submissive", "Deepthroat"],
"bodyHairs": [],
"sexualPreferences": ["Bisexual"],
"theme": "Toys,Housewives"
},
"score": 5,
"live": true,
"iframeFeedURL": "https://hybridclient.naiadsystems.com/purecam?performer=misshornymiss&performerid=88333014&volumelevel=0&widescreen=true",
"roomUrl": "https://t.crjmpy.com/158626/6358?affsub4=AT0007&model=misshornymiss",
"i18n": {
"characteristic": { "country": "Canada", "gender": "Woman" },
"description": "Self-description text...",
"expertise": "Specialties text...",
"turnOns": "Preferences text..."
},
"updatedDate": "2025-05-07T18:37:27.019Z",
"customTags": ["langenglish", "langfrench", "gc4049", "gccanada"],
"totalVideos": 54,
"characteristicsTags": ["anal", "bisexual", "caucasian", "deepthroat"],
"autoTags": ["blowjob", "dirty talk", "feet", "housewife"],
"stars": 5,
"systemScore": 0.99631191,
"systemSource": "streamate",
"lastConnection": "2025-04-28T19:51:04.000Z",
"itemId": "streamate88333014",
"createdDate": "2022-09-03T05:14:07.506Z",
"name": "misshornymiss",
"thumbnailUrl": "https://imagetransform.icfcdn.com/avatar/misshornymiss.webp"
}
]
}
Performer Object Reference
Basic Information
Status & Metrics
Timestamps
Streaming
Characteristics Object
Tags
i18n (Internationalization)
Error Responses
Supported Brands
Pagination & Performance
Pagination Parameters:
Example - First page of 6 performers:
https://performersext-api.pcvdaa.com/performers-ext?token=<YOURTOKEN>&gender=f&live=true&lang=en&page=1&size=6
Example - Next page:
https://performersext-api.pcvdaa.com/performers-ext?token=<YOURTOKEN>&gender=f&live=true&lang=en&page=2&size=6
Caching: Performer data is cached server-side for 30 seconds.
Tags Reference
Available tag values for the tags query parameter:
anal, athletic, bbw, curvy, dancing, beautiful, black hair, blowjob, bdsm,
bondage, deepthroat, dirty talk, big ass, big tits, blond hair, brown hair,
dominant, findom, femdom, feet, housewife, kinky, milf, muscular, hairy,
masturbation, petite, red hair, skinny, sex toy, squirt, striptease,
submissive, tattoos
Fallback Strategy
The API can return empty results (count: 0, empty performers array). Implement a fallback:
- Send request with all desired filters (e.g.,
live=trueðnicities=caucasian&tags=anal,athletic,bbw) - If empty result, retry with fewer filters (e.g.,
live=trueðnicities=caucasian) - If still empty, retry with minimal filters (e.g.,
live=true)
Embedding Live Streams
To embed a live performer's stream feed in an iframe:
- Fetch a live performer from the API
- Use
iframeFeedURLfor the iframesrc - Use
roomUrlfor the click-through link
<a id="testLink" href="PERFORMEROBJECT.roomUrl" target="blank">
<iframe
id="testIframe"
src="PERFORMEROBJECT.iframeFeedURL"
frameborder="0"
allow="autoplay; encrypted-media"
sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox"
style="pointer-events: none; width: 100%; height: 100%; border: none;"
></iframe>
</a>
pointer-events: none so clicks pass through to the wrapping <a> tag, which opens the performer's room in a new tab with affiliate tracking.
Tracking URLs
Each performer's roomUrl contains affiliate tracking parameters. The URL format is:
https://{domain}/{affiliateid}/{path}?{trackingparams}&model={performerName}
Example with affiliate ID 1:
https://t.crjmpy.com/1/3?affsub1=documentation&model=misshornymiss
roomUrl for successful commission tracking. Missing affiliate IDs mean lost revenue.
ComusThumbz Integration: All external performer links are routed through click.php for skim tracking:
$clickurl = sprintf('click.php?url=%s&type=camperformer&id=%d',
urlencode($performer['chatroomurl']), $performer['performerid']);
CURL Request Examples
Fetch 10 female caucasian performers:
curl --location 'https://performersext-api.pcvdaa.com/performers-ext/?token=<YOURTOKEN>&gender=fðnicities=caucasian&page=1&size=10' \
--header 'x-api-key: <YOURAPIKEY>'
Fetch one live female performer:
curl --location 'https://performersext-api.pcvdaa.com/performers-ext/?gender=f&live=true&token=<YOURTOKEN>&size=1&page=1' \
--header 'x-api-key: <YOURAPIKEY>'
Fetch a specific performer (requires name AND brand):
curl --location 'https://performersext-api.pcvdaa.com/performers-ext/?name=misshornymiss&brands=streamate&token=<YOURTOKEN>&size=1&page=1' \
--header 'x-api-key: <YOURAPIKEY>'
Fetch performers by age group:
curl --location 'https://performersext-api.pcvdaa.com/performers-ext/?token=<YOURTOKEN>&ages=gc2029&size=6&page=1' \
--header 'x-api-key: <YOURAPIKEY>'
Internal API Endpoints
The internal ComusThumbz REST API normalizes external performer data and serves it to the frontend.
Base URL: https://{domain}/ct/api/v1
Controller: ct/api/v1/controllers/WebcamController.php
Model: ct/api/v1/models/WebcamModel.php
GET /cams
List all performers with filtering.
Example:
GET /ct/api/v1/cams?page=1&perpage=20&gender=f&isonline=1&sortby=viewers
GET /cams/online
Get only online performers. This is the primary endpoint used by camperformers.php.
Example:
GET /ct/api/v1/cams/online?page=1&perpage=24&gender=f&sortby=viewers&fast=1
GET /cams/featured
Get top/featured performers.
GET /cams/stats
Get global webcam statistics (no parameters). Returns counts from tblCamsPerformersStatsCache.
Response includes: total performers, online count, offline count, per-site counts, per-gender counts, HD count, etc.
GET /cams/sites
List all enabled cam sites from tblCamsSites. No parameters.
GET /cams/filters
Get all available filter options (races, hair colors, bust sizes, figures, etc.). No parameters. Used to populate filter dropdowns on the frontend.
GET /cams/races
Get all available race/ethnicity values. No parameters.
GET /cams/{id}
Get a performer by their performerid (primary key lookup).
GET /cams/{site}/{username}
Get a performer by site ID and username (composite index lookup).
GET /cams/{site}/{username}/status
Check if a specific performer is currently online. Returns {online: true/false}.
GET /cams/{id}/schedule
Get a performer's schedule/heatmap data showing when they're typically online.
Comments & Ratings
Favorites
Internal Response Format:
{
"success": true,
"data": {
"performers": [
{
"performerid": 12345,
"site": 1,
"username": "performername",
"gender": "f",
"age": 25,
"race": "asian",
"numusers": 150,
"status": 1,
"hd": 1,
"imageurl": "https://cdn.example.com/...",
"chatroomurl": "https://example.com/performer"
}
]
},
"pagination": {
"page": 1,
"perpage": 20,
"total": 45000,
"totalpages": 2250,
"hasmore": true
},
"message": "Performers retrieved successfully"
}
Admin Configuration
Cam Sites Settings
Navigate to Admin Panel -> Cam Settings (ct/admin/camssettings.php)
Features:
- Enable/disable individual cam sites
- Set API credentials (API key and token) per site
- Configure sync frequency
- View sync logs
- Toggle site availability on the frontend
Config Variables
Relevant settings in ct/dat/config.inc.php:
$domain = 'comusthumbzdemo.com';
$apibaseurl = "https://{$domain}/ct/api/v1";
Cam API credentials are stored per-site in tblCamsSites:
apiDatafield stores thex-api-keyvalueparametersfield stores thetokenvalue
Cron Jobs
The following cron jobs must be running for the cam system to function. Without them, performer data becomes stale and online status is incorrect.
Crontab Example:
/5 php /path/to/ct/admin/cronupdatecams.php
/2 php /path/to/ct/admin/cron/updatecamperformerstats.php
0 3 php /path/to/ct/admin/cron/maintenancecamperformers.php
Frontend Pages
camperformers.php - Browse Page
The main cam browsing page with infinite pagination and advanced filtering.
URL: https://{domain}/camperformers.php
Features:
Grid display of performer cards (24 or 48 per page)Advanced filters: gender, race, hair, bust, figure, site, HD, ageSort options: viewers, followers, newest, new models, favorited, experienced, age, HD first, alphabetical
- Search by username/displayname/tags
- Favorites support (logged-in users)
- Performance debug panel (
?debug=1) - Feature guard: requires
featurelivecamsto be enabled
JavaScript API calls:
GET /ct/api/v1/cams/online- Main content loadGET /ct/api/v1/cams/sites- Populate site filter dropdownGET /ct/api/v1/favorites(checkMultipleFavorites) - Batch load favorite statesPOST /ct/api/v1/favorites/{type}/{id}- Toggle favorites
camperformer.php - Detail Page
Individual performer profile page.
URL: https://{domain}/camperformer.php?id={performerid}
Features:
- Server-side SEO data loading (meta tags, Open Graph)
- Performer profile: image, bio, stats
- Online/offline status badge with viewer count
- HD badge when available
- External chat link (routed through
click.php) - Related performers (same tags/gender)
- Schedule/heatmap display
- Comments and ratings
camfilter.php - Filter Results
Filter-specific results page.
URL: https://{domain}/camfilter.php?type={filtertype}&value={filtervalue}
Supported filter types: tag, gender, race, hair, bust, figure, language, site, country, location, pubicarea, isnew, hd, model
Data Flow
External API to Database
1. Cron: cronupdatecams.php runs every 5-10 minutes
- For each enabled site in tblCamsSites:
a. Load site-specific handler (ct/admin/apis/cams{site}api.php)
b. For external API sites: PerformersExtApiClient calls performersext-api.pcvdaa.com
c. Parse response, normalize to standard format
d. INSERT/UPDATE tblCamsPerformers
e. Set status=1 for online performers, status=0 for offline
Cron: updatecamperformerstats.php updates tblCamsPerformersStatsCache
Database to Frontend
1. User visits camperformers.php
- JavaScript calls GET /ct/api/v1/cams/online with filter params
- WebcamController receives request
- WebcamModel checks APCu cache (30s TTL)
- Cache hit: return cached data
- Cache miss: query tblCamsPerformers with filters
For pagination totals: use tblCamsPerformersStatsCache (or skip with fast=1)Return JSON responseJavaScript renders performer cards
User clicks performer -> click.php -> external chat room
Site-Specific API Handlers
Located in ct/admin/apis/:
Performance & Caching
Three-Layer Caching Strategy
- APCu In-Memory Cache (30-second TTL)
- Used by
WebcamModel::getOnlinePerformers() - Cache key: MD5 hash of page + perPage + filters + fastMode
- Fastest layer - serves repeated identical requests instantly
- Database Stats Cache (
tblCamsPerformersStatsCache)
- Updated by cron every 1-5 minutes
- Avoids expensive
COUNT()queries on 400K+ rows - Estimates per-site and per-gender counts
- Fast Mode (
?fast=1)
Skips COUNT() entirelyReturns "unknown" as total count
- Frontend detects end-of-results when page returns fewer items than
perpage - Used for initial page loads
Query Optimization
-- Optimized online query (uses indexes, no COUNT)
SELECT performerid, username, imageurl, numusers, site, status
FROM tblCamsPerformers
WHERE status = 1
AND deleted = 0
AND enabled = 1
AND gender = 'f'
ORDER BY numusers DESC
LIMIT 24 OFFSET 0;
Testing with API Tester
The built-in API Tester (ct/admin/apitester.php) can be used to test cam endpoints:
Navigate to Admin Panel -> API TesterSet the method to GET
- Enter endpoint:
/cams/online?page=1&perpage=5&gender=f - Click Send Request
- View the JSON response with performer data
Useful test endpoints:
Troubleshooting
No performers appearing on the frontend
- Check cron jobs are running:
php ct/admin/cronupdatecams.php - Verify API credentials in Admin -> Cam Settings
- Check
tblCamsSitesfor enabled sites - Verify
featurelivecamsis enabled in feature toggles - Check logs:
ct/logs/cron-update.log
All performers showing as offline
- Run the cron update:
php ct/admin/cronupdatecams.php - Check if external API is responding (test with CURL)
- Verify API token hasn't expired
- Check
tblCamsPerformersforstatusvalues:SELECT COUNT(*) FROM tblCamsPerformers WHERE status=1
External API returning 403 Forbidden
- Verify
x-api-keyis set correctly intblCamsSites.apiData - Ensure
User-Agentheader is being sent - Check if API key has been revoked by CrakRevenue
External API returning 401 Unauthorized
- Verify
tokenis set correctly intblCamsSites.parameters - Check if requesting unauthorized brands
- Token may be domain-bound - verify it's for your domain
Slow page load for cam performers
Enable fast mode: ensure frontend uses
?fast=1Check APCu is installed and enabled: php -m | grep apcuVerify stats cache cron is running
- Reduce
perpageto 24 or less - Use debug mode (
?debug=1) to identify bottleneck
Clicks not being tracked / affiliate revenue missing
All external performer links MUST go through click.php:
$clickurl = sprintf('click.php?url=%s&type=camperformer&id=%d',
urlencode($externalurl), $performerid);
Direct links bypass tracking and result in 100% skim penalty.
AdminModeration
GET /api/v1/adminmoderation
Bulk approve POST /api/v1/admin/moderation/bulk/approve
- Auth Required:
PUBLIC
DELETE /api/v1/adminmoderation
Delete content (DMCA takedown) DELETE /api/v1/admin/moderation/{type}/{id}
- Auth Required:
PUBLIC
AdminUsers
GET /api/v1/adminusers
Get user activity log GET /api/v1/admin/users/{id}/activity
- Auth Required:
PUBLIC
PUT /api/v1/adminusers
Update user PUT /api/v1/admin/users/{id}
- Auth Required:
PUBLIC
Ads
GET /api/v1/ads
Get ad statistics (Admin) GET /api/v1/admin/ads/{id}/stats
- Auth Required:
PUBLIC
Analytics
GET /api/v1/analytics
Get traffic analytics GET /api/v1/analytics/traffic
- Auth Required:
PUBLIC
Auth
GET /api/v1/auth
Disable 2FA DELETE /api/v1/auth/2fa
- Auth Required:
PUBLIC
Banners
GET /api/v1/banners
Get banner statistics GET /api/v1/banners/{id}/stats
- Auth Required:
PUBLIC - Parameters:
bannerId(int): Banner ID
Categories
GET /api/v1/categories
Get galleries in category GET /api/v1/categories/{id}/galleries
- Auth Required:
PUBLIC - Parameters:
id(int): Category ID
POST /api/v1/categories
Create new category (admin only) POST /api/v1/categories
- Auth Required:
PUBLIC
PUT /api/v1/categories
Update category (admin only) PUT /api/v1/categories/{id}
- Auth Required:
PUBLIC - Parameters:
id(int): Category ID
DELETE /api/v1/categories
Delete category (admin only) DELETE /api/v1/categories/{id}
- Auth Required:
PUBLIC - Parameters:
id(int): Category ID
ClickTracking
GET /api/v1/clicktracking
GET /api/v1/stats/clicks/user/{userId} Get user's click history (User must be authenticated)
- Auth Required:
PUBLIC
Comments
GET /api/v1/comments
GET /api/v1/comments/flagged Get all flagged comments (admin only)
- Auth Required:
PUBLIC
POST /api/v1/comments
POST /api/v1/cams/{site}/{performer}/comments Add a comment to a webcam performer
- Auth Required:
PUBLIC
PUT /api/v1/comments
PUT /api/v1/comments/{id}/status Update comment status (admin only)
- Auth Required:
PUBLIC
DELETE /api/v1/comments
DELETE /api/v1/comments/{id}/like Remove like/dislike from a comment
- Auth Required:
PUBLIC
CreatorEarnings
GET /api/v1/creatorearnings
GET /creator/earnings/platform-settings - Get platform fee settings Returns global platform fee and creator's custom fee if applicable This endpoint is PUBLIC (no auth required) for display purposes
- Auth Required:
PUBLIC
CreatorProfiles
GET /api/v1/creatorprofiles
CreatorProfilesController - Creator profile management
- Auth Required:
PUBLIC
POST /api/v1/creatorprofiles
POST /creator/profile - Create new creator profile
- Auth Required:
PUBLIC
PUT /api/v1/creatorprofiles
PATCH /creator/profile/me - Update authenticated creator's profile
- Auth Required:
PUBLIC
Creators
GET /api/v1/creators
POST /api/v1/creators/me/cover Upload creator cover image
- Auth Required:
PUBLIC
PUT /api/v1/creators
PUT /api/v1/creators/me Update creator profile settings
- Auth Required:
PUBLIC
CreatorSubscriptions
GET /api/v1/creatorsubscriptions
DELETE /creators/{id}/packages/{packageid} - Creator disables a package
- Auth Required:
PUBLIC
Earnings
GET /api/v1/earnings
GET /api/v1/creator/earnings/by-source Get earnings breakdown by source (tips, subscriptions, PPV) Includes counts and totals
- Auth Required:
PUBLIC
Favorites
GET /api/v1/favorites
GET /favorites/counts Get user's favorites counts by type
- Auth Required:
PUBLIC
POST /api/v1/favorites
POST /favorites Add item to favorites Body: { "contenttype": "video|gallery|camperformer|model", "contentid": "123", "notes": "optional" }
- Auth Required:
PUBLIC
DELETE /api/v1/favorites
DELETE /favorites/{type}/{id} Remove from favorites
- Auth Required:
PUBLIC
Features
GET /api/v1/features
Get enabled cam sites GET /api/v1/features/cams
- Auth Required:
PUBLIC
Feed
GET /api/v1/feed
Get trending content GET /api/v1/feed/trending
- Auth Required:
PUBLIC
Friends
GET /api/v1/friends
Reject friend request PUT /api/v1/friends/{id}/reject
- Auth Required:
PUBLIC - Parameters:
id(int): Friendship ID
POST /api/v1/friends
Send friend request POST /api/v1/friends
- Auth Required:
PUBLIC
DELETE /api/v1/friends
Remove friend DELETE /api/v1/friends/{id}
- Auth Required:
PUBLIC - Parameters:
id(int): Friendship ID
Galleries
GET /api/v1/galleries
GET /galleries/{id}/related - Get related galleries
- Auth Required:
PUBLIC
POST /api/v1/galleries
POST /galleries - Create gallery (admin only)
- Auth Required:
PUBLIC
PUT /api/v1/galleries
PATCH /galleries/{id}/status - Update gallery status (admin only)
- Auth Required:
PUBLIC
DELETE /api/v1/galleries
DELETE /galleries/{id} - Delete gallery (admin only)
- Auth Required:
PUBLIC
ImpressionTracking
GET /api/v1/impressiontracking
GET /api/v1/impressions/trends/{type} Get performance trends over time
- Auth Required:
PUBLIC
LiveStream
GET /api/v1/livestream
GET /api/v1/live/{id}/per-minute/status Get current per-minute session status
- Auth Required:
PUBLIC
Media
GET /api/v1/media
Get storage URL for a specific video file
- Auth Required:
PUBLIC - Parameters:
videoId(int): Video IDfileType(string): File type (thumbnail, preview, poster, video, hls, etc.)- Returns: void - (returns download URL or error)
Messages
GET /api/v1/messages
Get list of blocked users GET /api/v1/messages/blocked
- Auth Required:
PUBLIC
DELETE /api/v1/messages
Delete a message DELETE /api/v1/messages/{id}
- Auth Required:
PUBLIC
Models
GET /api/v1/models
GET /api/v1/models/{id}/details Get unified model details Query params: - type: regular|cammodel (required)
- Auth Required:
PUBLIC
POST /api/v1/models
POST /api/v1/models Create new model (admin only)
- Auth Required:
PUBLIC
PUT /api/v1/models
PUT /api/v1/modelclasses/{id}/status Update model status (admin only)
- Auth Required:
PUBLIC
DELETE /api/v1/models
DELETE /api/v1/modelclasses/{id} Delete model (admin only)
- Auth Required:
PUBLIC
Notifications
GET /api/v1/notifications
Get notification preferences GET /api/v1/notifications/preferences
- Auth Required:
PUBLIC
PUT /api/v1/notifications
Update notification preferences PUT /api/v1/notifications/preferences
- Auth Required:
PUBLIC
DELETE /api/v1/notifications
Delete notification (soft delete) DELETE /api/v1/notifications/{id}
- Auth Required:
PUBLIC
Player
GET /api/v1/player
Player Controller Handles video player configuration and settings
- Auth Required:
PUBLIC
Playlists
GET /api/v1/playlists
PUT /playlists/{id}/items/reorder Reorder playlist items (owner only) Body: { "items": [ { "itemid": 1, "sortorder": 0 }, { "itemid": 2, "sortorder": 1 } ] }
- Auth Required:
PUBLIC
POST /api/v1/playlists
POST /playlists/{id}/items Add video to playlist (owner only) Body: { "videoid": 123, "sortorder": 1 }
- Auth Required:
PUBLIC
PUT /api/v1/playlists
PUT /playlists/{id} Update playlist (owner only)
- Auth Required:
PUBLIC
DELETE /api/v1/playlists
DELETE /playlists/{id}/items/{itemId} Remove video from playlist (owner only)
- Auth Required:
PUBLIC
Posts
GET /api/v1/posts
GET /api/v1/posts/{id}/poll Get poll data for a post
- Auth Required:
PUBLIC - Parameters:
postId(int): Post ID
POST /api/v1/posts
POST /api/v1/posts/with-product Create a post with product attachment Handles multipart/form-data with files
- Auth Required:
PUBLIC
PUT /api/v1/posts
PUT /api/v1/posts/{id}/poll Update poll data for a post
- Auth Required:
PUBLIC - Parameters:
postId(int): Post ID
DELETE /api/v1/posts
DELETE /comments/{id} Delete a comment (soft delete)
- Auth Required:
PUBLIC
Products
GET /api/v1/products
Refund a merchandise purchase (Option 2: Proportional Loss) - User gets full refund (100%) - Creator loses their portion (80%) - Platform absorbs their portion (20%)
- Auth Required:
PUBLIC
POST /api/v1/products
Products Controller Handles creator merchandise/product operations
- Auth Required:
AUTH
PUT /api/v1/products
Update order shipping status and tracking number
- Auth Required:
PUBLIC
Ratings
GET /api/v1/ratings
GET /api/v1/models/{id}/rating Get rating stats for a model
- Auth Required:
PUBLIC
Search
GET /api/v1/search
DELETE /search/history - Clear user's search history
- Auth Required:
PUBLIC
SecurityQuestions
GET /api/v1/securityquestions
Reset password using security question token POST /api/v1/auth/reset-password-with-token
- Auth Required:
PUBLIC
Settings
GET /api/v1/settings
Get video player settings GET /api/v1/settings/player
- Auth Required:
PUBLIC
PUT /api/v1/settings
Get all public settings (cached) This is the main method that builds the settings array / private function getPublicSettings(): array { global $conn;
- Auth Required:
PUBLIC
Sponsors
GET /api/v1/sponsors
Track sponsor click POST /api/v1/sponsors/{id}/click
- Auth Required:
PUBLIC
Styles
GET /api/v1/styles
Bulk save multiple styles at once POST /api/v1/styles/bulk
- Auth Required:
PUBLIC
DELETE /api/v1/styles
Delete a specific style override DELETE /api/v1/styles/{id}
- Auth Required:
PUBLIC - Parameters:
id(int): Style ID
Subscriptions
GET /api/v1/subscriptions
Upgrade subscription POST /api/v1/subscriptions/upgrade
- Auth Required:
PUBLIC
Tags
GET /api/v1/tags
Parse tag string and return tag IDs (creates tags if they don't exist) POST /api/v1/tags/parse
- Auth Required:
PUBLIC
POST /api/v1/tags
Create new tag (admin only) POST /api/v1/tags
- Auth Required:
PUBLIC
PUT /api/v1/tags
Update tag (admin only) PUT /api/v1/tags/{id}
- Auth Required:
PUBLIC - Parameters:
id(int): Tag ID
DELETE /api/v1/tags
Delete tag (admin only) DELETE /api/v1/tags/{id}
- Auth Required:
PUBLIC - Parameters:
id(int): Tag ID
Tips
GET /api/v1/tips
POST /api/v1/tips/{tipid}/refund Refund a tip (creator only) - Option 2: Proportional Loss User gets 100% back, creator loses their portion (80%), platform absorbs their portion (20%)
- Auth Required:
PUBLIC
UserPreferences
GET /api/v1/userpreferences
GET /user/preferences Get all user preferences (privacy, stream, email)
- Auth Required:
PUBLIC
PUT /api/v1/userpreferences
PUT /user/preferences/email Update user's email preferences
- Auth Required:
PUBLIC
Users
GET /api/v1/users
Get trusted devices for current user GET /api/v1/user/trusted-devices
- Auth Required:
PUBLIC
PUT /api/v1/users
Update profile privacy settings PUT /api/v1/users/me/privacy
- Auth Required:
PUBLIC
DELETE /api/v1/users
Remove a trusted device DELETE /api/v1/user/trusted-devices/{id}
- Auth Required:
PUBLIC
UserVerification
GET /api/v1/userverification
GET /admin/verification/stats Get verification statistics (admin only)
- Auth Required:
PUBLIC
PUT /api/v1/userverification
PUT /admin/verification/{userId}/status Update verification status (admin only)
- Auth Required:
PUBLIC
DELETE /api/v1/userverification
DELETE /user/verification/documents/{documentId} Delete a verification document
- Auth Required:
PUBLIC
VideoReports
GET /api/v1/videoreports
GET /video-reports/reasons - Get list of valid report reasons
- Auth Required:
PUBLIC
Videos
GET /api/v1/videos
Generate URL-friendly slug from title
- Auth Required:
PUBLIC - Parameters:
title(string):- Returns: string -
POST /api/v1/videos
POST /videos/{id}/tags - Add tag to video
- Auth Required:
PUBLIC
PUT /api/v1/videos
PATCH /videos/{id}/status - Update video status (admin only)
- Auth Required:
PUBLIC
DELETE /api/v1/videos
DELETE /videos/{id} - Delete video (owner or admin)
- Auth Required:
PUBLIC
WatchHistory
GET /api/v1/watchhistory
POST /content/{type}/{id}/track Track viewing of any content type (camperformer, gallery, model) Body: optional { "watchedduration": 1, "totalduration": 1 }
- Auth Required:
PUBLIC
PUT /api/v1/watchhistory
POST /videos/{id}/progress Update video watch progress Body: { "watchedduration": 120, "totalduration": 600, "lastposition": 120 }
- Auth Required:
PUBLIC
DELETE /api/v1/watchhistory
DELETE /history/{id} Remove specific history entry
- Auth Required:
PUBLIC
Webcam
GET /api/v1/webcam
GET /cams/{id}/schedule - Get performer's schedule/heatmap data
- Auth Required:
PUBLIC - Parameters:
performerId(int): Performer ID from tblCamsPerformers- Returns: array - Schedule data with metadata
Webhooks
GET /api/v1/webhooks
GET /api/v1/webhooks/status Get cloud encoding status (requires admin auth)
- Auth Required:
PUBLIC
Withdrawals
GET /api/v1/withdrawals
GET /api/v1/creator/withdrawals/my-requests Get withdrawal history for current user
- Auth Required:
PUBLIC