RoamTale — YouTube API Services Implementation Document

English implementation document for the YouTube API Services compliance review / quota increase request. This page satisfies the "implementation document" option of the review request (screencast (or) implementation document (or) demo video).

Application: RoamTale  ·  Production URL: https://app.roamtale.io
OAuth redirect URI: https://app.roamtale.io/auth/youtube
Privacy Policy: /Privacy  ·  Terms: /Terms
Scopes: youtube.readonly (read own channel stats & comments) · youtube.force-ssl (upload own videos & reply to comments on own videos)

What the app is: RoamTale is a multi-tenant SaaS application for travel and lifestyle content creators. Each creator signs up for their own isolated account ("tenant") and connects their own YouTube channel via Google OAuth. Every API call is performed exclusively on the authenticated user's own channel, at the user's explicit request. RoamTale never reads from or writes to any other user's channel, and never sells or shares user data. Each tenant's data is stored in a separate, isolated data area.

1. User login & OAuth process

Standard Google OAuth 2.0 Authorization Code flow with offline access (refresh tokens). Implementation: YouTubeOAuthService.cs; callback endpoint /auth/youtube; UI entry point: Personas → <persona> → Profile & Platforms → YouTube → "Connect with YouTube".

2. Uploading videos to the YouTube channel (youtube.force-ssl)

Implementation: YouTubePublisher.cs. The creator uploads one of their own generated videos to their own channel via videos.insert (multipart):

POST https://www.googleapis.com/upload/youtube/v3/videos?uploadType=multipart&part=snippet,status
Authorization: Bearer <access_token>
Content-Type: multipart/related
  part 1 (application/json):
    { "snippet": { "title": …, "description": …, "categoryId": "22" },
      "status":  { "privacyStatus": "public", "selfDeclaredMadeForKids": false } }
  part 2 (video/mp4): <the creator's own video bytes>

Short uploads append #Shorts so YouTube classifies the vertical (<60 s) clip as a Short. The API returns the new video id; the app builds the watch/Shorts URL and shows a success message. Quota/error responses (e.g. quotaExceeded) are surfaced to the creator verbatim (the quota ceiling is the reason for this quota-increase request).

3. Channel analytics displayed in the dashboard (youtube.readonly)

Implementation: Connectors.cs → YouTubeConnector.GetStatsAsync, pulled periodically by MetricsPullService and shown on the Dashboard (/). Read-only, own channel only:

The dashboard displays the connected channel's subscriber count, total views, total likes and video count — only on that creator's own private dashboard. No data from any other channel is read or displayed.

4. Replying to comments (read: youtube.readonly · write: youtube.force-ssl)

Implementation: Connectors.cs (YouTubeConnector) + SocialAutomationService.cs; UI: the Inbox page.

The app never reads or writes comments on videos that do not belong to the connected creator's own channel.

5. Data handling, storage & security

6. Where each item lives

RequirementScopeCodeUI
OAuth loginbothYouTubeOAuthService.cs, /auth/youtubePersonas → YouTube → "Connect"
Upload videosforce-sslYouTubePublisher.cs (videos.insert)Persona → "Upload as Short / video"
Channel analyticsreadonlyConnectors.cs YouTubeConnector (channels.list + videos.list)Dashboard /
Reply to commentsreadonly + force-sslConnectors.cs (commentThreads.list, comments.insert)Inbox
Disconnect / revokeYouTubeOAuthService.DisconnectAsync (oauth2/revoke)YouTube → "Disconnect"

A complementary English screencast/demo video of the live app can additionally be provided on request. Contact: admin@roamtale.io.