---
title: "Verify YouTube social link"
method: POST
path: "/v1/account/social/verify/youtube"
tags: ["verification"]
---

# Verify YouTube social link

`POST /v1/account/social/verify/youtube`

## Request

- Base URL: `https://api.grove.city` (the document declares no server; this is the origin it was published from)
- URL: `https://api.grove.city/v1/account/social/verify/youtube`
- Auth: none declared

Verify ownership of a YouTube social link using a Google OAuth 2.0 access token.

**Flow:**
1. Client obtains a Google OAuth 2.0 access token via PKCE flow (youtube.readonly scope)
2. Client sends the token to this endpoint
3. API validates the token against YouTube's `GET /v3/channels?mine=true` endpoint
4. If the returned channel matches the account's existing YouTube social link, it's marked as verified

**Prerequisites:**
- Account must have a YouTube social link already added (via `POST /v1/account/social-links`)
- Client must have a valid Google OAuth 2.0 access token with youtube.readonly scope

**Idempotent:** Calling this on an already-verified YouTube link returns success.

Authentication: `Authorization: Bearer <CLIENT_JWT>`

## Headers

- `authorization` string, nullable: Bearer JWT issued by Grove that identifies the account.

## Request body

- YouTubeVerifyRequest: Request model for POST /v1/account/social/verify/youtube. The client obtains a Google OAuth 2.0 access token via PKCE flow (with youtube.readonly scope), then sends it here for server-side validation against the YouTube Data API.
  - `access_token` string, required: Google OAuth 2.0 access token obtained via PKCE flow with youtube.readonly scope

## Response `200`

Successful Response

- YouTubeVerifyResponse: Response model for POST /v1/account/social/verify/youtube.
  - `verified` boolean, required: Whether the YouTube link is now verified
  - `platform` string: Platform that was verified
  - `channel_name` string, required: YouTube channel name that was verified
  - `verification_method` string, required: Method used for verification

## Other responses

- `400`: Invalid access token, no YouTube link on account, or channel mismatch
- `401`: Missing or invalid Grove JWT
- `422`: Validation Error
- `502`: YouTube API unavailable

---

[API](https://skmtc.dev/grove/apis/grove-api.md) - [All operations](https://skmtc.dev/grove/apis/grove-api/llms.txt) - [OpenAPI document](https://skmtc.dev/grove/apis/grove-api/revisions/f286b48a8105?raw)
