Overview
This guide explains how to use Snag’s social integration API to let your users connect their social accounts to their Snag profile. After creating a user in Snag (as explained in Managing User Accounts), you can use the social authentication endpoints to connect various social platforms to that user’s profile.Supported Social Platforms
Snag supports connecting the following social platforms:- Discord
- Telegram
- Epic Games
- Steam
- Tiktok
- Phone
Connecting a Social Account
Endpoint
{authType} is one of: twitter, discord, telegram, epic, steam , google , Reddit or tiktok.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| userId | UUID | Yes | The ID of the user received from the user creation endpoint. This must be obtained by creating a user first. |
| websiteId | UUID | No | The ID of the website (if applicable) |
| redirect | String | Yes | The URL where the user will be redirected after completing authentication |
| responseType | String | No | The type of response to return (redirect or json). Defaults to redirect |
Security Note regarding Redirect URIsTo simplify integration, we allow unvalidated
redirect URIs when using the API. This means you can set the redirect URL to any destination.Since this endpoint is protected by your API key, only authorized requests can initiate the flow with a custom redirect. However, because the redirect URL can be set to anything, it is your responsibility to ensure that you do not include sensitive data in the URL parameters.Example Request
Authentication Flow
- Call the
/api/{authType}/authendpoint with the required parameters - The API will return a URL that you should redirect your user to
- The user will authenticate with the social platform and grant permissions
- After successful authentication, the user will be redirected to the URL specified in the
redirectparameter - The social account is now connected to the user’s Snag profile
Connecting Email
Use this flow to associate and verify a user’s email with their Snag profile.Endpoint
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| emailAddress | String | Yes | The user’s email address to verify. |
| redirect | String | No | URL to redirect the user to after verification. We append status and, on failure, optional error. |
| userId | UUID | Conditional | Required when calling server-to-server with an API key to target a specific user. |
| walletAddress | String | Conditional | Alternative to userId when calling server-to-server with an API key; creates/links a user by wallet. |
| websiteId | UUID | No | Your website identifier if applicable. |
Headers
x-api-key: Required.
Flow
Initiate email verification
Call the endpoint with
emailAddress (and optional redirect). This stores the pending email on the user’s metadata and sends a verification email containing a secure link.User clicks verification link
The email contains a link to
GET /api/email/auth/connect?token=.... Snag validates the token and verifies the email.Handle the final redirect
After verification, the user is redirected to your
redirect URL (or a default verification page) with a status:status=SUCCESSon successstatus=EXPIREDif the link expiredstatus=INVALIDanderror=INVALID_CODEfor invalid tokens
https://your-app.com/email-verified?status=SUCCESSHandling Email Account Conflicts
If the email is already verified for another user on the same website, the user is redirected to yourredirect with error=MAXIMUM_ACCOUNT_LINKED. Handle this scenario the same way as described in Handling Social Account Conflicts.
Connecting Phone
Use this flow to associate and verify a user’s phone number with their Snag profile. Phone verification uses Twilio Verify to send an OTP code via SMS.Phone numbers must be in E.164 format (e.g.,
+14155552671). This is the international phone number format required by Twilio.Step 1: Send Verification Code
Endpoint
Headers
x-api-key: Required.Content-Type:application/json
Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| phoneNumber | String | Yes | The phone number to verify in E.164 format (e.g., +14155552671). |
| userId | UUID | Conditional | Required when calling server-to-server with an API key to target a specific user. |
| walletAddress | String | Conditional | Alternative to userId when calling server-to-server with an API key. |
| websiteId | UUID | No | Your website identifier if applicable. |
Step 2: Verify OTP Code
Endpoint
Headers
x-api-key: Required.Content-Type:application/json
Body Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| phoneNumber | String | Yes | The phone number being verified, in E.164 format. |
| code | String | Yes | The OTP code received via SMS. |
| userId | UUID | Conditional | Required when calling server-to-server with an API key to target a specific user. |
| walletAddress | String | Conditional | Alternative to userId when calling server-to-server with an API key. |
| websiteId | UUID | No | Your website identifier if applicable. |
Flow
Send verification code
Call
POST /api/phone/auth with the phone number. Snag sends an OTP code to the user via SMS using Twilio Verify.Disconnecting Phone
To disconnect a phone number from a user’s profile:Handling Phone Account Conflicts
If the phone number is already verified for another user on the same website, the verify endpoint returnserror: 'MAXIMUM_ACCOUNT_LINKED' in the response body:
Handling Social Account Conflicts
If the social account is already associated with a different user, the redirect URL will include two query parameters:error = 'MAXIMUM_ACCOUNT_LINKED'- Indicates that the account is already linked to another useraccountLinkData- A JWT verification token that contains the necessary information to process the account transfer
- Display a confirmation prompt to the user asking if they want to disconnect the account from the other user and link it to their current profile
- If the user confirms, make a POST request to
/api/users/verifywith the following payload:
- Disconnect the social account from the previous user
- Connect it to the current user’s profile
Google OAuth YouTube Channel Errors
When using Google OAuth, if the user’s YouTube channel does not exist, the API will return an error witherror = 'YOUTUBE_CHANNEL_NOT_FOUND'. This typically happens when:
- The user has never created a YouTube channel
- The YouTube channel was deleted or suspended
- The user’s Google account doesn’t have YouTube access
- Display a user-friendly message explaining that a YouTube channel is required
- Prompt the user to create a YouTube channel first
- Provide instructions on how to create a YouTube channel
- Allow the user to retry the Google OAuth flow after creating their channel
YouTube channels are automatically created when users upload their first video
or customize their channel. Users can also manually create a channel by
visiting youtube.com and following the setup prompts.
Google OAuth Requirements
When using Google OAuth integration, whether with Snag’s default OAuth application or your own custom OAuth application, you need to ensure the following permissions (scopes) are configured:https://www.googleapis.com/auth/youtube.readonly- Required to read YouTube channel informationhttps://www.googleapis.com/auth/userinfo.email- Required to access user email addresshttps://www.googleapis.com/auth/userinfo.profile- Required to access user profile information
Example Implementation with Conflict Handling
Example Tiktok Implementation
Example Reddit Implementation
Example Implementation
Response Handling
Success Response (200 OK)
url property contains the authentication URL that you should redirect your user to.
Custom OAuth Applications
Snag allows you to use your own OAuth applications for Twitter, Discord, Epic Games, Google, and Steam integrations. This enables you to maintain your brand identity throughout the authentication flow and have more control over the user experience. To configure your own OAuth credentials, navigate to the Integrations tab in your admin dashboard and enter your client ID and client secret for the desired platform. The changes take effect immediately for all new authentication requests. You will also need to add the following redirect URLs to your OAuth application:https://snag-render.com/api/twitter/auth/callbackhttps://snag-render.com/api/discord/auth/callbackhttps://snag-render.com/api/epic/auth/callbackhttps://snag-render.com/api/steam/auth/callbackhttps://snag-render.com/api/google/auth/callback
Google OAuth Application Setup
When configuring a custom Google OAuth application, ensure your OAuth consent screen includes the following required scopes:https://www.googleapis.com/auth/youtube.readonlyhttps://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/userinfo.profile
Troubleshooting
403 Forbidden Response
If you receive a403 Forbidden response when attempting to connect a social account, check the following:
Missing or invalid API key
Missing or invalid API key
Ensure you’re including the
x-api-key header in your request with a valid API key. The API key must be associated with your Snag account and have the necessary permissions.Invalid userId
Invalid userId
Verify that the
userId you’re using:- Was obtained from the user creation endpoint
- Uses the
userIdfield from the response, not theidfield - Is a valid UUID format
- Belongs to a user that exists in your Snag account
- Is associated with the same website/account as your API key
Insufficient permissions
Insufficient permissions
Your API key may not have the required permissions to connect social accounts. Contact the Snag team to verify your API key has the necessary scopes enabled.
Website ID mismatch
Website ID mismatch
If you’re using a
websiteId parameter, ensure it matches the website associated with your API key and the user’s account. Mismatched website IDs can result in 403 errors.