Health Check
Is the API running? Hit one of these.
SignalR (Video Hub)
Connect to the real-time Video hub. You’ll see events when videos are uploaded, location groups updated, or videos deleted. Login required.
Hub URL: /hubs/videos. Connect with your current token, then upload or delete a video in the Videos section to see events here.
—
🔧 Azure SignalR REST — Test POST /api/v1/hubs/:hubName//:send
Paste the Azure SignalR connection string. The JWT is built in-browser (same logic as the Worker). This tests whether the Azure SignalR endpoint accepts the publish call.
—
Infra trace (SignalR · Redis · Service Bus)
Hub events in a sortable log. Development API only: inspect live-stream Redis keys and recent Service Bus publishes from this app (see Redis / Service Bus tabs).
Uses the same hub connection as Realtime. Connect once (either tab), then delete or upload a video to see VideoDeleted vs other events.
| Time | Kind | Event / line | Summary | Payload |
|---|
Health: GET /api/infra/runtime-health. Live stream Redis snapshot (Development): GET /api/infra/live-stream-redis/{sessionId} — session hash, viewers, activity, stream:meta, counters.
—
Recent messages published by this API (Development): GET /api/infra/live-stream-servicebus-recent?sessionId=…. Worker consumption → Azure Portal or Workers console.
—
Live monitor (Development API): GET /api/infra/live-monitor — active streams, Redis viewers (global), join/leave on this API node. Connect SignalR for real-time LiveStreamViewerCountUpdated. Multi-instance: open Test-UI against each pod URL.
Active live streams
| Session | Channel | DB viewers | Redis viewers | Redis user ids |
|---|
Join / leave on this API node
| Time | Action | User | Stream | Source | Count |
|---|
Last health summary
Live Stream Testing
Host and audience tokens, go-live, RTC preview, event-linked streams, request live, and report testing.
Normal user — What happens with Live & Report? (tap to collapse)
Without Report: Host Go Live → followers notify. Request live → receiver gets SignalR RequestLive (+ bell). Receiver Start = accept → requesters get “is now live”.
Report (live): 1 report → stream auto-stops for moderation, then admin can Approve or Reject.
Admin is not in normal go-live — only after reports (see Admin tab).
Login required. Flow: Event (optional) → Host token → Start → Join/End. Two accounts for request live: target must Connect hub (Realtime tab) for RequestLive.
Active live streams
All currently live sessions from GET /api/videos/my-videos/grouped-by-location. Connect Realtime → SignalR for instant viewer join/leave updates.
Live activity log (join / leave / SignalR)
Follow & go-live requests
source on go-live request.
(Pending requests JSON appears here.)
Event + live stream
The API attaches your stream to an event when coordinates match: ~30 m of a venue in Redis events:geo, or inside the geofence polygon when available.
Leave Event ID empty to let the backend pick the nearest match. Fill Event ID to force that event — you must still be within its area or you get a validation error.
eventId when a link was created. That value is summarized here for quick testing.
1) Token
2) Start stream
2.5) RTC publish/playback (Laptop cam)
3) Join / End
3a) Participant Test Console
Use this panel to test the full Host → Viewer join → Viewer leave → Host end flow and watch the
LiveStreamParticipantsUpdated SignalR event in real-time.
Connect SignalR (Realtime tab) first, then use these controls.
Host count is always 1 — host is included in participant count.
Calls RegisterLiveViewerSession on hub — triggers a LiveStreamParticipantsUpdated event.
Plain REST call — also triggers LiveStreamParticipantsUpdated for users inside the stream.
Emits final LiveStreamParticipantsUpdated with changeType: "end".
- No snapshot received yet. Connect SignalR & join/leave to see live updates.
LiveStreamParticipantsUpdated events…3b) Report live stream (viewer)
Join as viewer (another account), paste Live stream ID above (ls_…). Reports via unified POST /api/videos/{id}/report (same reasons as videos). 1st distinct report: reporter-only banner; 2nd distinct report (default threshold): stream auto-stops for moderation.
4) Feed check
(Grouped feed result will appear here.)
Sentry Test
Trigger a test exception to verify Sentry is capturing errors.
This calls GET /api/SentryTest/throw which throws an exception. You should see a 500 response here and the error in your Sentry dashboard.
Apple IAP config diagnostics (Admin only). Calls GET /api/Credits/debug/apple-config.
Day-wise Logs
List backend rolling logs, view latest lines, and download by day.
Reads all files from backend Logs folder. View opens full file content and download saves full file.
(Select a log file to view.)
Welcome
Sign in to access the tester dashboard.
Step 1 sends OTP to email. Enter it in Step 2, then set password in Step 3.
Docs
Module-wise documentation viewer (Markdown).
Profile
Get or update your profile: name, email (read-only), gender, dashcam type, profile picture. Login required.
Change password
Set a new password (requires current password). Login required.
Videos
Test video upload modes: Direct-to-Azure (recommended) and Legacy API modes. Login required.
Chunked upload: use Direct-to-Azure (recommended) or Legacy API-proxied chunks (older POC). Thumbnail is optional on complete for these chunked flows.
Load my videos = everyone's videos. My Feed = only your videos (with views, shares, average rating). Use Play (MP4) to play immediately; Play (HLS) appears after background encoding (refresh after 1–2 min). Validation uses 1/2/5 tiers, and in rating-batch mode you send 4 previous IDs while current URL video is the 5th.
Home map search
Calls GET /api/map/search?query=.... It returns both metadata search matches and Google location-based matches, including isGoogleLocationResult and fallback lat/lng when no nearby video is found.
(Map search results will appear here.)
ML manual bearer token (optional)
If provided, this token is used for GET /api/videos/nearby and POST /api/webhooks/video-analysis. If empty, UI uses your login token.
Nearby analysis lookup
Calls GET /api/videos/nearby with latitude, longitude, timestamp, radius and time_range to verify ML analysis records.
(Nearby analysis results will appear here.)
AI/ML callback webhook tester
Calls POST /api/webhooks/video-analysis with required Authorization: Bearer and X-Job-ID header.
Rate Testing
Rate-focused testing for milestone progress, owner visibility, and full validation payloads.
Use this tab to test rating flow quickly without scrolling the full Videos section.
(Candidate list with owner details will appear here.)
Valid Videos Rate
Only valid videos (not expired, not deleted) that you can rate. Rate directly from tile and verify confidence score update.
This uses GET /api/videos/videos-left-to-rate and shows confidence score, average rating, and per-user rating entries for each tile.
Notifications (v1)
Register device token, list notifications, unread count, mark read, and send admin test push.
1) Register Device
Calls POST /api/v1/devices. Login required.
2) List Notifications
Calls GET /api/v1/notifications. Use filters as needed.
(Notifications list will appear here.)
3) Mark as Read
4) Test Push (Admin)
Calls POST /api/v1/notifications/test-push. Admin JWT required.
5) Admin Simulation Helpers
Admin-only helper actions to quickly test the 2 enabled admin auto-notification flows.
6) Request Live — test bench (all results on this page)
Single window: log in as target → Use my user ID → Connect hub → Run full test. Two windows: target connects hub in window A; sender uses target Guid in window B.
Logged-in user: —
(Presence and send responses appear here.)
(Connect hub as the target user; events show here when delivery works.)
AI/ML Reprocess
Select videos and submit to AI/ML through backend so ML job id is persisted on video.
Loads your videos from backend and calls backend endpoint POST /api/videos/{id}/ml/submit for selected videos.
Credits & Buy Credits
View balance, packages, and create a Stripe payment intent to buy credits. Login required for overview and purchase.
Select a package and create a payment intent. Use the returned clientSecret with Stripe.js (or test with Stripe test card 4242 4242 4242 4242). After payment, webhook adds credits.
Verify IAP purchase (Apple / Google)
Login required. This calls POST /api/credits/verify-purchase.
Transaction history (last 30 days).
Subscriptions
Browse plans, activate via IAP, cancel, and re-subscribe after cancel. Admin: full plan management. Login required.
1) Browse Plans
Calls GET /api/subscriptions/plans with the platform selected above. Select a card to auto-fill the activation form below.
2) Activate / Re-subscribe (IAP)
Calls POST /api/subscriptions. Paste the receipt / purchase token from the device store. Plan ID and platform auto-fill when you select a plan card above.
After cancel: complete a new store purchase — do not reuse the old token. The backend expires the cancelled subscription when the new one activates.
iOS — synced from Store platform above
3) My Active Subscription
Calls GET /api/subscriptions/me. Returns active, past-due, or cancelled-pending-expiry subscription. 404 if none.
4) Cancel Subscription
Calls DELETE /api/subscriptions/{id}. Stops auto-renewal — status becomes cancelled and access stays until expiryDate. Tokens are NOT removed. You can re-subscribe immediately with a new IAP token (section 2).
5) Change Plan (Upgrade / Downgrade)
Calls PATCH /api/subscriptions/{id}. Upgrade = immediate, requires new IAP token. Downgrade = deferred to period end, no token needed. Click a plan card above to auto-fill New Plan ID.
iOS — synced from Store platform above
6) Payment History
Calls GET /api/subscriptions/payments?limit=&offset=. Returns paginated list of all payments. Click a row to auto-fill the Receipt ID below.
(Click "Load Payment History" to fetch.)
7) Payment Receipt
Calls GET /api/subscriptions/payments/{id}. Returns receipt details for a single payment. Auto-fills from the first result in Payment History above.
8) Subscription History
Calls GET /api/subscriptions/me/history. Returns all past and current subscription records for the logged-in user.
(Click "Load Subscription History" to fetch.)
Admin JWT required. All plan changes are audit-logged (before/after JSON). A plan with active subscribers cannot be deleted — deactivate it instead.
(Click "Load All Plans" to fetch.)
Create / Update Plan
Leave plan selector empty → Create. Select a plan → fields auto-fill for Update.
Phase 4 — Revenue Dashboard
Calls GET /api/admin/subscriptions/revenue. Returns all-time & monthly revenue totals plus per-plan breakdown.
(Click "Load Revenue" to fetch.)
Subscriber Analytics
Calls GET /api/admin/subscriptions/analytics. Returns subscriber counts, status breakdown, and plan distribution.
(Click "Load Analytics" to fetch.)
Phase 5 — Subscription Reconciliation
Calls POST /api/admin/subscriptions/reconcile. Finds Active subscriptions whose billing period elapsed without a renewal webhook and marks them PastDue. The reconciliation job also runs automatically every 6 hours.
Account Lifecycle Hooks
Suspend / Resume / Delete lifecycle hooks. These are typically triggered by the user management system, not called directly, but can be tested here.
Admin – Credits
For Admin users only. Manage base price per credit and credit packages.
You must be logged in as an Admin (UserRole.Admin) for these calls to succeed.
Base price per credit
Packages
(Packages will appear here.)
Create or update a package below, then click the corresponding button.
Admin — What can report review do? (tap to expand)
Video: Allow = content OK. Remove = take down (+ optional block user).
Live: 1 report auto-ends stream → admin reviews. Approve = short playback (~48h). Reject = remove. Force stop = end while still live.
List: GET /api/admin/reported-content (video + live).
Reported content (video + live)
Click any tile → POST /api/admin/video-reports/by-ids (uses session/video GUID; report id optional for live).
All: — | Pending: — | Allowed: — | Removed: —
Admin - Users
For Admin users only. List users sorted by active first and newest created.
Calls /api/admin/users with paging/search. Use checkboxes for bulk activate/deactivate via PATCH /api/admin/users/status.
(Users will appear here.)
Refresh Token
Get new tokens (uses saved refresh token).
Logout
Sign out (uses current token).
Scan Mode
Test POST /api/v1/heartbeat and GET /api/scanmode/online-users. Login required. Presence TTL is 6 minutes — send heartbeat every 5 min to stay online.
Two-device test: open this tab on two browsers with different users, same coordinates. Always await heartbeat before Get online users (or use the combined button).
1) Heartbeat
Type latitude, longitude, and altitude manually below, then send. Browser GPS is optional — it only fills these fields (you can edit before send).
Manual coordinates
2) Online users (500 m)
Calls GET /api/scanmode/online-users. Returns nearby online users except you. Empty [] is valid when nobody else is within 500 m.
(Nearby online users will appear here.)
Quests — Treasure Hunt
Create, activate, find, and manage treasure-hunt quests. Login required for all endpoints.
1) Create Quest — Free & Premium
POST /api/v1/quests · sent as multipart/form-data — Server derives tier, reward tokens and premium cost from the chosen icon. FREE Standard icons cost nothing. PREMIUM icons deduct PremiumCostTokens from your balance when the quest goes Active (drain order: Daily → Earned → QuestEarned → Purchased). Click Load Icons from API first.
questImage multipart file part.
AR / positioning fields (optional)
2) Quest Actions (uses Quest ID above)
All three use the Quest ID field at the top of this section. Activate a Premium quest deducts its PremiumCostTokens from your balance (drain order: Daily → Earned → QuestEarned → Purchased); returns 402 if you can't afford it. Cancel fails with 409 once any finder has collected.
(Quest detail will appear here.)
3) Find (Collect) Quest
POST /api/v1/quests/{id}/find — Server haversine proximity check. Your coordinates must be within CollectionRadiusMeters of the quest. Rewards tokens to finder and writes a QuestFinding + UserTreasure record.
Tip: set your coords very close to the quest coords above to pass the proximity check in testing.
4) Participant Management
Track an active play session for the quest in the Quest ID field above. A user can only be active in one quest at a time. Start is rejected if you are outside quest_participant_radius_meters (default 2 km). Send Heartbeat calls the unified POST /api/v1/heartbeat with questId — the separate participant heartbeat endpoint has been removed.
(Participants list will appear here.)
5) Discovery — Live Map
Map auto-fetches GET /api/v1/quests/viewport on every pan/zoom (debounced 600 ms). Click a marker to select it — fills the Quest ID above and shows details. Color: ● Standard ● Premium ● Inactive.
Random quest in viewport
Calls GET /api/v1/quests/viewport/random using the four bounding-box coordinates above. Returns a list containing 0 or 1 quest, excluding quests you created. Prefers a quest at least ~2 km from the viewport center (offset left/right / ahead/behind), not dead-center.
Nearby quests (radius search)
My quests & treasures
(My quests / treasures will appear here.)
Quests at an event
6) Puzzle State (v2 — not yet active)
GET /api/v1/quests/me/puzzle — Returns your current treasure-icon puzzle slots and completion status.
7) Generate Quest Near Me (UC-7)
POST /api/v1/quests/generate — System creates a Standard quest near your coordinates using AI-selected icon. Only 1 active generated quest per user at a time (409 if one already exists).
8) Admin — Batch Create Quests
POST /api/admin/quests/batch — Admin role required. Scatters quests randomly inside a venue / event geofence polygon and activates them immediately (system-funded).
(Batch create result will appear here.)
9) Admin — Auto-Generate Quests from City Place
POST /api/admin/quests/auto-generate-from-city-place — Admin role required. Uses Google Places API to find top POIs in a city and auto-generates quests at walkable street coordinates near each place.
(Auto-generate result will appear here.)
Promotions — Create & Discover
Create a promotion, pick location on the map, view nearby pins, and manage My Promotions. Login required.
Create Promotion
POST /api/v1/promotions · Click the map to set location (or use GPS). Image uploads via POST /api/v1/promotions/image-upload first.
Map — Location & Nearby
🔴 Red pin = your create location (click map or drag pin). 🟣 Purple markers = nearby promotions. Click a marker to view details.
Promotion Detail
(Promotion detail JSON will appear here.)
My Promotions
GET /api/v1/promotions/mine — Profile → My Promotions list with status badges.
Quest V1 Live Stream
Follow steps in order: location → viewport quests → participant → hub → live/join. Or use Run all steps.
Set lat/lng first — used for viewport quest search and Start Play radius check.
Calls GET /api/v1/quests/viewport using your Step 1 lat/lng + radius (not the Quests tab defaults). Click a card or dropdown.
API: —
GET /api/v1/quest-live-streams/discover — grouped by location → host → stream. No quest participation needed to join.
🔴 Map — live hosts appear as nodes. Pin moves when host sends heartbeat. Click node for details → Join / Leave.
POST …/participants/start — must be within 2km of the quest pin, not just your Step 1 location.
Select a quest — distance to quest pin will show here.
/hubs/quest-live-stream — real-time join/leave/end events.
SubscribeToQuest — receive QuestLiveStreamStarted on this quest.
POST …/live-streams — starts stream; you become host participant in stream.
Pick a stream from the map (Step 2) or list below, then Join / Leave.
- After join/start — click Refresh participants.
(Events appear after hub connect.)
Advanced — manual REST
Street Locations
Preview real walkable street coordinates near any point. Calls GET /api/admin/quests/street-locations via Google Roads API and pins each result on the map.
Enter a centre coordinate, choose a search radius (up to 5 km) and how many points to return (1–50). Click Fetch Locations — markers appear on the map below. Click any marker for its coordinates and Place ID.
Ticketmaster Events World Map
Load normalized events from /api/events/search, plot by lat/long, view details, and inspect venue polygon + center point.
All available events first, then filter by real data
The map auto-loads available events, keeps the view smooth, and shows clean event points for every lat/long.
Event cards
Raw response
Chat (Agora)
Interactive DM chat — conversations, send/receive, typing indicator. Auto-connects after login.
⚙️ API Tools — Token, Raw Search, Peer Profile
Chat Tokens from Login
Populated automatically after login. Used by Connect above.
GET /api/chat/token
Returns a fresh Agora Chat token. Login required.
POST /api/chat/token/refresh
Issues a new token (SDK expiry callback path). Login required.
GET /api/users/search
Optional q (min 3 chars if set; blank = all users). Paginated via page / pageSize (max 50). Response data.users + totalCount, currentPage, totalPages. Use agoraChatUserId for Agora.
GET /api/users/{id}/chat-profile
Returns isActive — used to show the deactivated banner.
Or paste a Google ID token:
Paste Firebase ID token after Apple sign-in via Firebase Auth.
Paste a Firebase ID token from your app (e.g.
user.getIdToken()).