User Subscriptions API
Get the current user's subscriptions and membership information.
GET /api/sdk/user/subscriptions
Returns the authenticated user's subscriptions from their Firebase token.
Headers
| Header | Required | Description |
|--------|----------|-------------|
| X-Fig1-API-Key | Yes | Your API key |
| Authorization | No | Bearer token (Firebase ID token) |
Example Request
curl -X GET https://app.fig1.ai/api/sdk/user/subscriptions \
-H "X-Fig1-API-Key: fig1_sdk_abc123" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..."
Response (Authenticated)
When a valid Firebase token is provided:
{
"success": true,
"isAuthenticated": true,
"user": {
"uid": "firebase-user-id",
"email": "user@example.com",
"displayName": "John Doe"
},
"subscriptions": ["boxing_fundamentals", "premium_content"],
"membershipTier": "premium",
"membershipExpiry": "2025-12-31T00:00:00Z",
"availableSubscriptions": [
{
"slug": "boxing_fundamentals",
"name": "Boxing Fundamentals"
},
{
"slug": "premium_content",
"name": "Premium Content"
},
{
"slug": "all_access",
"name": "All Access Pass"
}
]
}
Response (Not Authenticated)
When no Firebase token or invalid token:
{
"success": true,
"isAuthenticated": false,
"subscriptions": [],
"membershipExpiry": null,
"availableSubscriptions": [
{
"slug": "boxing_fundamentals",
"name": "Boxing Fundamentals"
}
],
"message": "User not authenticated. Include Authorization: Bearer <firebase_token> header."
}
Response Fields
| Field | Type | Description |
|-------|------|-------------|
| success | boolean | Whether the request succeeded |
| isAuthenticated | boolean | Whether user is authenticated |
| user | object | User info (only if authenticated) |
| user.uid | string | Firebase user ID |
| user.email | string | User's email |
| user.displayName | string | User's display name |
| subscriptions | string[] | User's active subscriptions |
| membershipTier | string | User's membership tier |
| membershipExpiry | string | ISO date when membership expires |
| availableSubscriptions | array | All subscriptions available on this site |
TypeScript Example
interface UserSubscriptionsResponse {
success: boolean;
isAuthenticated: boolean;
user?: {
uid: string;
email?: string;
displayName?: string;
};
subscriptions: string[];
membershipTier?: string;
membershipExpiry?: string;
availableSubscriptions: Array<{
slug: string;
name: string;
description?: string;
}>;
}
async function getUserSubscriptions(firebaseToken: string): Promise<UserSubscriptionsResponse> {
const response = await fetch('https://app.fig1.ai/api/sdk/user/subscriptions', {
headers: {
'X-Fig1-API-Key': process.env.FIG1_API_KEY!,
'Authorization': `Bearer ${firebaseToken}`
}
});
return response.json();
}
React Hook Example
import { useState, useEffect } from 'react';
import { getAuth } from 'firebase/auth';
function useUserSubscriptions() {
const [subscriptions, setSubscriptions] = useState<string[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
async function fetchSubscriptions() {
const auth = getAuth();
const user = auth.currentUser;
if (!user) {
setSubscriptions([]);
setLoading(false);
return;
}
try {
const token = await user.getIdToken();
const response = await fetch('/api/user-subscriptions', {
headers: { 'Authorization': `Bearer ${token}` }
});
const data = await response.json();
setSubscriptions(data.subscriptions);
} catch (err) {
setError('Failed to load subscriptions');
} finally {
setLoading(false);
}
}
fetchSubscriptions();
}, []);
return { subscriptions, loading, error };
}
Checking Access to Content
async function canAccessContent(
firebaseToken: string,
requiredSubscriptions: string[]
): Promise<boolean> {
const { subscriptions } = await getUserSubscriptions(firebaseToken);
// User needs at least ONE of the required subscriptions
return requiredSubscriptions.some(required =>
subscriptions.includes(required)
);
}
Displaying Subscription Status
function SubscriptionBadge({ subscriptions }: { subscriptions: string[] }) {
if (subscriptions.length === 0) {
return <span className="badge badge-gray">Free</span>;
}
if (subscriptions.includes('all_access')) {
return <span className="badge badge-gold">All Access</span>;
}
return (
<div className="flex gap-1">
{subscriptions.map(sub => (
<span key={sub} className="badge badge-blue">{sub}</span>
))}
</div>
);
}
Error Responses
Invalid API Key (401)
{
"success": false,
"error": "Invalid API key"
}
Server Error (500)
{
"success": false,
"error": "Failed to get user subscriptions"
}
Related Endpoints
- Content API - Fetch content with access filtering
- Authentication - API key and Firebase setup
- Subscriptions Guide - Configure subscriptions