instagram-graph-api-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +200 -0
- package/README.md +279 -0
- package/dist/index.d.mts +2225 -0
- package/dist/index.d.ts +2225 -0
- package/dist/index.js +1745 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1696 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/endpoints.ts","../src/errors.ts","../src/http.ts","../src/api/auth.ts","../src/api/oauth.ts","../src/types/common.ts","../src/api/users.ts","../src/api/media.ts","../src/api/publishing.ts","../src/api/messaging.ts","../src/api/conversations.ts","../src/api/comments.ts","../src/api/hashtags.ts","../src/api/insights.ts","../src/api/welcomeFlows.ts","../src/api/messengerProfile.ts","../src/api/oembed.ts","../src/api/webhooks.ts","../src/client.ts","../src/utils/webhooks.ts","../src/types/user.ts","../src/types/media.ts","../src/types/comment.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Instagram Graph API Endpoints\n * \n * Centralized endpoint definitions for easy maintenance.\n * Update this file when Instagram API documentation changes.\n * \n * Base URL: https://graph.instagram.com\n * API Version: Configurable (default: v22.0)\n */\n\nexport const INSTAGRAM_BASE_URL = 'https://graph.instagram.com';\n\n/**\n * Build a full API URL with version\n */\nexport function buildUrl(version: string, path: string): string {\n return `${INSTAGRAM_BASE_URL}/${version}${path}`;\n}\n\n/**\n * User Endpoints\n */\nexport const USER_ENDPOINTS = {\n /** Get user profile: GET /{user-id} */\n PROFILE: (userId: string) => `/${userId}`,\n \n /** Get user media: GET /{user-id}/media */\n MEDIA: (userId: string) => `/${userId}/media`,\n \n /** Get user stories: GET /{user-id}/stories */\n STORIES: (userId: string) => `/${userId}/stories`,\n \n /** Get user insights: GET /{user-id}/insights */\n INSIGHTS: (userId: string) => `/${userId}/insights`,\n \n /** Get live media: GET /{user-id}/live_media */\n LIVE_MEDIA: (userId: string) => `/${userId}/live_media`,\n \n /** Get content publishing limit: GET /{user-id}/content_publishing_limit */\n CONTENT_PUBLISHING_LIMIT: (userId: string) => `/${userId}/content_publishing_limit`,\n \n /** Get business discovery: GET /{user-id}?fields=business_discovery.username(...) */\n BUSINESS_DISCOVERY: (userId: string) => `/${userId}`,\n \n /** Get mentioned media: GET /{user-id}/mentioned_media */\n MENTIONED_MEDIA: (userId: string) => `/${userId}/mentioned_media`,\n \n /** Get mentioned comment: GET /{user-id}/mentioned_comment */\n MENTIONED_COMMENT: (userId: string) => `/${userId}/mentioned_comment`,\n \n /** Get tags: GET /{user-id}/tags */\n TAGS: (userId: string) => `/${userId}/tags`,\n \n /** Get recently searched hashtags: GET /{user-id}/recently_searched_hashtags */\n RECENTLY_SEARCHED_HASHTAGS: (userId: string) => `/${userId}/recently_searched_hashtags`,\n \n /** Get available catalogs: GET /{user-id}/available_catalogs */\n AVAILABLE_CATALOGS: (userId: string) => `/${userId}/available_catalogs`,\n \n /** Search catalog products: GET /{user-id}/catalog_product_search */\n CATALOG_PRODUCT_SEARCH: (userId: string) => `/${userId}/catalog_product_search`,\n} as const;\n\n/**\n * Media Endpoints\n */\nexport const MEDIA_ENDPOINTS = {\n /** Get media by ID: GET /{media-id} */\n GET: (mediaId: string) => `/${mediaId}`,\n \n /** Get media children (carousel): GET /{media-id}/children */\n CHILDREN: (mediaId: string) => `/${mediaId}/children`,\n \n /** Get media comments: GET /{media-id}/comments */\n COMMENTS: (mediaId: string) => `/${mediaId}/comments`,\n \n /** Get media insights: GET /{media-id}/insights */\n INSIGHTS: (mediaId: string) => `/${mediaId}/insights`,\n \n /** Get media collaborators: GET /{media-id}/collaborators */\n COLLABORATORS: (mediaId: string) => `/${mediaId}/collaborators`,\n \n /** Get product tags: GET /{media-id}/product_tags */\n PRODUCT_TAGS: (mediaId: string) => `/${mediaId}/product_tags`,\n} as const;\n\n/**\n * Publishing Endpoints\n */\nexport const PUBLISHING_ENDPOINTS = {\n /** Create media container: POST /{user-id}/media */\n CREATE_CONTAINER: (userId: string) => `/${userId}/media`,\n \n /** Publish media: POST /{user-id}/media_publish */\n PUBLISH: (userId: string) => `/${userId}/media_publish`,\n \n /** Get container status: GET /{container-id} */\n CONTAINER_STATUS: (containerId: string) => `/${containerId}`,\n} as const;\n\n/**\n * Messaging Endpoints\n */\nexport const MESSAGING_ENDPOINTS = {\n /** Send message: POST /{user-id}/messages */\n SEND: (userId: string) => `/${userId}/messages`,\n \n /** Get conversations: GET /{user-id}/conversations */\n CONVERSATIONS: (userId: string) => `/${userId}/conversations`,\n \n /** Get conversation by ID: GET /{conversation-id} */\n CONVERSATION: (conversationId: string) => `/${conversationId}`,\n \n /** Get message by ID: GET /{message-id} */\n MESSAGE: (messageId: string) => `/${messageId}`,\n} as const;\n\n/**\n * Welcome Message Flow Endpoints\n */\nexport const WELCOME_FLOW_ENDPOINTS = {\n /** Get/Create/Update flows: /{user-id}/welcome_message_flows */\n FLOWS: (userId: string) => `/${userId}/welcome_message_flows`,\n} as const;\n\n/**\n * Messenger Profile Endpoints (Ice Breakers, Persistent Menu)\n */\nexport const MESSENGER_PROFILE_ENDPOINTS = {\n /** Get/Set/Delete profile: /{user-id}/messenger_profile */\n PROFILE: (userId: string) => `/${userId}/messenger_profile`,\n} as const;\n\n/**\n * Comment Endpoints\n */\nexport const COMMENT_ENDPOINTS = {\n /** Get comment: GET /{comment-id} */\n GET: (commentId: string) => `/${commentId}`,\n \n /** Get replies: GET /{comment-id}/replies */\n REPLIES: (commentId: string) => `/${commentId}/replies`,\n \n /** Reply to comment: POST /{comment-id}/replies */\n REPLY: (commentId: string) => `/${commentId}/replies`,\n \n /** Hide/Unhide comment: POST /{comment-id} */\n UPDATE: (commentId: string) => `/${commentId}`,\n \n /** Delete comment: DELETE /{comment-id} */\n DELETE: (commentId: string) => `/${commentId}`,\n} as const;\n\n/**\n * Hashtag Endpoints\n */\nexport const HASHTAG_ENDPOINTS = {\n /** Search hashtag: GET /ig_hashtag_search */\n SEARCH: '/ig_hashtag_search',\n \n /** Get hashtag: GET /{hashtag-id} */\n GET: (hashtagId: string) => `/${hashtagId}`,\n \n /** Get recent media: GET /{hashtag-id}/recent_media */\n RECENT_MEDIA: (hashtagId: string) => `/${hashtagId}/recent_media`,\n \n /** Get top media: GET /{hashtag-id}/top_media */\n TOP_MEDIA: (hashtagId: string) => `/${hashtagId}/top_media`,\n} as const;\n\n/**\n * Auth Endpoints (require access token)\n */\nexport const AUTH_ENDPOINTS = {\n /** Get current user: GET /me */\n ME: '/me',\n \n /** Refresh token: GET /refresh_access_token */\n REFRESH_TOKEN: '/refresh_access_token',\n \n /** Exchange token: GET /access_token */\n ACCESS_TOKEN: '/access_token',\n} as const;\n\n/**\n * OAuth Endpoints (for Instagram Business Login)\n * Note: These use different base URLs than the Graph API\n */\nexport const OAUTH_ENDPOINTS = {\n /** Authorization URL - redirect users here to start OAuth flow */\n AUTHORIZE: 'https://www.instagram.com/oauth/authorize',\n \n /** Short-lived token exchange: POST with form data */\n TOKEN: 'https://api.instagram.com/oauth/access_token',\n \n /** Long-lived token exchange: GET with query params */\n LONG_LIVED_TOKEN: 'https://graph.instagram.com/access_token',\n} as const;\n\n/**\n * oEmbed Endpoints\n */\nexport const OEMBED_ENDPOINTS = {\n /** Get oEmbed: GET /instagram_oembed */\n GET: '/instagram_oembed',\n} as const;\n","/**\n * Instagram API Error Classes\n * \n * Custom error classes for handling Instagram Graph API errors.\n */\n\n/**\n * Base error class for Instagram API errors\n */\nexport class InstagramAPIError extends Error {\n public readonly code: number;\n public readonly type: string;\n public readonly subcode?: number;\n public readonly fbTraceId?: string;\n\n constructor(\n message: string,\n code: number,\n type: string,\n subcode?: number,\n fbTraceId?: string\n ) {\n super(message);\n this.name = 'InstagramAPIError';\n this.code = code;\n this.type = type;\n this.subcode = subcode;\n this.fbTraceId = fbTraceId;\n \n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, InstagramAPIError);\n }\n }\n\n /**\n * Create an InstagramAPIError from an API response\n */\n static fromResponse(response: InstagramErrorResponse): InstagramAPIError {\n const { error } = response;\n \n // Check for specific error types\n if (error.code === 190) {\n return new AuthenticationError(error.message, error.code, error.fbtrace_id);\n }\n \n if (error.code === 4 || error.code === 17 || error.code === 32) {\n return new RateLimitError(error.message, error.code, error.fbtrace_id);\n }\n \n if (error.code === 100) {\n return new ValidationError(error.message, error.code, error.error_subcode, error.fbtrace_id);\n }\n \n return new InstagramAPIError(\n error.message,\n error.code,\n error.type,\n error.error_subcode,\n error.fbtrace_id\n );\n }\n}\n\n/**\n * Authentication error (invalid/expired tokens)\n */\nexport class AuthenticationError extends InstagramAPIError {\n constructor(message: string, code: number = 190, fbTraceId?: string) {\n super(message, code, 'OAuthException', undefined, fbTraceId);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Rate limit exceeded error\n */\nexport class RateLimitError extends InstagramAPIError {\n public readonly retryAfter?: number;\n\n constructor(message: string, code: number = 4, fbTraceId?: string, retryAfter?: number) {\n super(message, code, 'RateLimitException', undefined, fbTraceId);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Validation error (invalid parameters)\n */\nexport class ValidationError extends InstagramAPIError {\n constructor(message: string, code: number = 100, subcode?: number, fbTraceId?: string) {\n super(message, code, 'ValidationException', subcode, fbTraceId);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Network error (connection issues)\n */\nexport class NetworkError extends Error {\n public readonly originalError?: Error;\n\n constructor(message: string, originalError?: Error) {\n super(message);\n this.name = 'NetworkError';\n this.originalError = originalError;\n \n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, NetworkError);\n }\n }\n}\n\n/**\n * Instagram API error response structure\n */\nexport interface InstagramErrorResponse {\n error: {\n message: string;\n type: string;\n code: number;\n error_subcode?: number;\n fbtrace_id?: string;\n };\n}\n\n/**\n * Check if an error is an Instagram API error\n */\nexport function isInstagramAPIError(error: unknown): error is InstagramAPIError {\n return error instanceof InstagramAPIError;\n}\n\n/**\n * Check if an error is an authentication error\n */\nexport function isAuthenticationError(error: unknown): error is AuthenticationError {\n return error instanceof AuthenticationError;\n}\n\n/**\n * Check if an error is a rate limit error\n */\nexport function isRateLimitError(error: unknown): error is RateLimitError {\n return error instanceof RateLimitError;\n}\n\n/**\n * Check if an error is a validation error\n */\nexport function isValidationError(error: unknown): error is ValidationError {\n return error instanceof ValidationError;\n}\n","/**\n * HTTP Client for Instagram Graph API\n * \n * Axios-based HTTP client with interceptors for authentication,\n * error handling, and rate limiting.\n */\n\nimport axios, {\n AxiosInstance,\n AxiosRequestConfig,\n AxiosResponse,\n InternalAxiosRequestConfig,\n} from 'axios';\nimport { INSTAGRAM_BASE_URL } from './endpoints';\nimport {\n InstagramAPIError,\n InstagramErrorResponse,\n NetworkError,\n RateLimitError,\n} from './errors';\n\n/**\n * HTTP Client configuration options\n */\nexport interface HttpClientConfig {\n /** Instagram User access token */\n accessToken: string;\n /** API version (e.g., 'v22.0') */\n apiVersion: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * HTTP Client for making requests to Instagram Graph API\n */\nexport class HttpClient {\n private readonly client: AxiosInstance;\n private readonly config: HttpClientConfig;\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n\n this.client = axios.create({\n baseURL: `${INSTAGRAM_BASE_URL}/${config.apiVersion}`,\n timeout: config.timeout ?? 30000,\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n });\n\n this.setupInterceptors();\n }\n\n /**\n * Set up request and response interceptors\n */\n private setupInterceptors(): void {\n // Request interceptor - add access token\n this.client.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n // Add access token to all requests\n if (config.params) {\n config.params.access_token = this.config.accessToken;\n } else {\n config.params = { access_token: this.config.accessToken };\n }\n return config;\n },\n (error) => Promise.reject(error)\n );\n\n // Response interceptor - handle errors\n this.client.interceptors.response.use(\n (response: AxiosResponse) => response,\n (error) => {\n // Handle network errors\n if (!error.response) {\n throw new NetworkError(\n error.message || 'Network error occurred',\n error\n );\n }\n\n // Handle API errors\n const response = error.response;\n if (response.data?.error) {\n throw InstagramAPIError.fromResponse(response.data as InstagramErrorResponse);\n }\n\n // Handle rate limit headers\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers['retry-after'] || '60', 10);\n throw new RateLimitError(\n 'Rate limit exceeded',\n 4,\n response.headers['x-fb-trace-id'],\n retryAfter\n );\n }\n\n // Generic error\n throw new InstagramAPIError(\n response.data?.message || 'Unknown error occurred',\n response.status,\n 'UnknownError'\n );\n }\n );\n }\n\n /**\n * Update access token\n */\n public setAccessToken(accessToken: string): void {\n (this.config as { accessToken: string }).accessToken = accessToken;\n }\n\n /**\n * GET request\n */\n public async get<T>(\n path: string,\n params?: Record<string, unknown>,\n config?: AxiosRequestConfig\n ): Promise<T> {\n const response = await this.client.get<T>(path, {\n ...config,\n params: { ...params },\n });\n return response.data;\n }\n\n /**\n * POST request\n */\n public async post<T>(\n path: string,\n data?: Record<string, unknown>,\n params?: Record<string, unknown>,\n config?: AxiosRequestConfig\n ): Promise<T> {\n const response = await this.client.post<T>(path, data, {\n ...config,\n params: { ...params },\n });\n return response.data;\n }\n\n /**\n * DELETE request\n */\n public async delete<T>(\n path: string,\n params?: Record<string, unknown>,\n config?: AxiosRequestConfig\n ): Promise<T> {\n const response = await this.client.delete<T>(path, {\n ...config,\n params: { ...params },\n });\n return response.data;\n }\n\n /**\n * POST with form data (for file uploads)\n */\n public async postForm<T>(\n path: string,\n data: Record<string, unknown>,\n config?: AxiosRequestConfig\n ): Promise<T> {\n const formData = new URLSearchParams();\n Object.entries(data).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n formData.append(key, String(value));\n }\n });\n\n const response = await this.client.post<T>(path, formData, {\n ...config,\n headers: {\n ...config?.headers,\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n });\n return response.data;\n }\n}\n","/**\n * Auth API Module\n * \n * Handles authentication and token operations.\n */\n\nimport { HttpClient } from '../http';\nimport { AUTH_ENDPOINTS } from '../endpoints';\nimport { IGUser } from '../types/user';\n\n/**\n * Token response from Instagram API\n */\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n}\n\n/**\n * Long-lived token response\n */\nexport interface LongLivedTokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n}\n\n/**\n * Auth API class for Instagram authentication operations\n */\nexport class AuthApi {\n private readonly http: HttpClient;\n\n constructor(http: HttpClient) {\n this.http = http;\n }\n\n /**\n * Get current user information\n * @param fields - Fields to retrieve\n */\n async me(fields: string = 'id,username'): Promise<IGUser> {\n return this.http.get<IGUser>(AUTH_ENDPOINTS.ME, { fields });\n }\n\n /**\n * Refresh a long-lived token (Instagram Login)\n * Returns a new long-lived token with 60 days expiry\n */\n async refreshToken(): Promise<LongLivedTokenResponse> {\n return this.http.get<LongLivedTokenResponse>(\n AUTH_ENDPOINTS.REFRESH_TOKEN,\n { grant_type: 'ig_refresh_token' }\n );\n }\n\n /**\n * Exchange short-lived token for long-lived token (Instagram Login)\n * @param shortLivedToken - Short-lived access token (1 hour expiry)\n * @param appSecret - Instagram App Secret\n */\n async exchangeToken(\n shortLivedToken: string,\n appSecret: string\n ): Promise<LongLivedTokenResponse> {\n return this.http.get<LongLivedTokenResponse>(\n AUTH_ENDPOINTS.ACCESS_TOKEN,\n {\n grant_type: 'ig_exchange_token',\n client_secret: appSecret,\n access_token: shortLivedToken,\n }\n );\n }\n}\n","/**\n * Instagram OAuth Module\n * \n * Static methods for Instagram Business Login OAuth flow.\n * These methods don't require an access token.\n * \n * @example\n * ```typescript\n * import { InstagramOAuth } from 'instagram-graph-api-sdk';\n * \n * // 1. Build authorization URL\n * const authUrl = InstagramOAuth.buildAuthorizationUrl({\n * clientId: 'your-app-id',\n * redirectUri: 'https://your-app.com/callback',\n * scopes: ['instagram_business_basic', 'instagram_business_manage_messages'],\n * state: 'csrf-token',\n * });\n * \n * // 2. Redirect user to authUrl...\n * \n * // 3. In callback, exchange code for token\n * const tokens = await InstagramOAuth.exchangeCodeForToken({\n * clientId: 'your-app-id',\n * clientSecret: 'your-app-secret',\n * code: 'code-from-callback',\n * redirectUri: 'https://your-app.com/callback',\n * });\n * \n * console.log(tokens.access_token); // Long-lived token (60 days)\n * console.log(tokens.user_id); // Instagram User ID\n * ```\n */\n\nimport { OAUTH_ENDPOINTS } from '../endpoints';\nimport {\n AuthorizationUrlParams,\n ExchangeCodeParams,\n ShortLivedTokenResponse,\n LongLivedTokenResponse,\n OAuthTokenResponse,\n OAuthCallbackParams,\n InstagramScope,\n} from '../types/oauth';\n\n/**\n * Instagram OAuth - Static methods for authentication flow\n * \n * Use these methods for user onboarding (Instagram Business Login).\n * After obtaining a token, create an InstagramClient instance to make API calls.\n */\nexport class InstagramOAuth {\n /**\n * Build the Instagram authorization URL\n * \n * Direct users to this URL to start the OAuth flow.\n * They will be asked to grant permissions to your app.\n * \n * @param params - Authorization URL parameters\n * @returns Full authorization URL to redirect user to\n * \n * @example\n * ```typescript\n * const url = InstagramOAuth.buildAuthorizationUrl({\n * clientId: process.env.INSTAGRAM_APP_ID,\n * redirectUri: `${process.env.APP_URL}/api/instagram/callback`,\n * scopes: [\n * 'instagram_business_basic',\n * 'instagram_business_manage_messages',\n * ],\n * state: crypto.randomUUID(), // CSRF protection\n * });\n * \n * // Redirect user to url\n * ```\n */\n static buildAuthorizationUrl(params: AuthorizationUrlParams): string {\n const {\n clientId,\n redirectUri,\n scopes,\n state,\n responseType = 'code',\n forceReauth,\n } = params;\n\n const queryParams = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n scope: scopes.join(','),\n response_type: responseType,\n });\n\n if (state) {\n queryParams.set('state', state);\n }\n\n if (forceReauth) {\n queryParams.set('force_reauth', 'true');\n }\n\n return `${OAUTH_ENDPOINTS.AUTHORIZE}?${queryParams.toString()}`;\n }\n\n /**\n * Parse OAuth callback parameters from URL\n * \n * Use this to extract code, state, and error info from the callback URL.\n * \n * @param url - The callback URL (or just the search params)\n * @returns Parsed callback parameters\n * \n * @example\n * ```typescript\n * const params = InstagramOAuth.parseCallback(request.url);\n * \n * if (params.error) {\n * // User denied access\n * console.log(params.error_description);\n * } else {\n * // Exchange code for token\n * const tokens = await InstagramOAuth.exchangeCodeForToken({\n * code: params.code!,\n * ...\n * });\n * }\n * ```\n */\n static parseCallback(url: string): OAuthCallbackParams {\n const urlObj = new URL(url, 'https://placeholder.com');\n const params = urlObj.searchParams;\n\n let code = params.get('code') || undefined;\n \n // Strip #_ suffix that Instagram appends\n if (code) {\n code = code.replace(/#_$/, '');\n }\n\n return {\n code,\n state: params.get('state') || undefined,\n error: params.get('error') || undefined,\n error_reason: params.get('error_reason') || undefined,\n error_description: params.get('error_description') || undefined,\n };\n }\n\n /**\n * Exchange authorization code for tokens\n * \n * This is the recommended method - it handles the full flow:\n * 1. Exchange code for short-lived token (1 hour)\n * 2. Exchange short-lived for long-lived token (60 days)\n * \n * @param params - Exchange parameters\n * @returns Long-lived token response with user ID\n * @throws Error if exchange fails\n * \n * @example\n * ```typescript\n * const tokens = await InstagramOAuth.exchangeCodeForToken({\n * clientId: process.env.INSTAGRAM_APP_ID!,\n * clientSecret: process.env.INSTAGRAM_APP_SECRET!,\n * code: codeFromCallback,\n * redirectUri: `${process.env.APP_URL}/api/instagram/callback`,\n * });\n * \n * // Store tokens.access_token and tokens.user_id in your database\n * // Token expires in tokens.expires_in seconds (~60 days)\n * ```\n */\n static async exchangeCodeForToken(params: ExchangeCodeParams): Promise<OAuthTokenResponse> {\n // Step 1: Get short-lived token\n const shortLived = await this.getShortLivedToken(params);\n\n // Step 2: Exchange for long-lived token\n const longLived = await this.getLongLivedToken({\n clientSecret: params.clientSecret,\n accessToken: shortLived.access_token,\n });\n\n return {\n access_token: longLived.access_token,\n token_type: longLived.token_type,\n expires_in: longLived.expires_in,\n user_id: shortLived.user_id,\n };\n }\n\n /**\n * Get short-lived token from authorization code\n * \n * Use this if you need more control over the token exchange process.\n * The short-lived token is valid for 1 hour.\n * \n * @param params - Exchange parameters\n * @returns Short-lived token response\n * @throws Error if exchange fails\n */\n static async getShortLivedToken(params: ExchangeCodeParams): Promise<ShortLivedTokenResponse> {\n const { clientId, clientSecret, code, redirectUri } = params;\n\n // Clean the code - remove #_ suffix if present\n const cleanCode = code.replace(/#_$/, '');\n\n // POST with form data\n const formData = new FormData();\n formData.append('client_id', clientId);\n formData.append('client_secret', clientSecret);\n formData.append('grant_type', 'authorization_code');\n formData.append('redirect_uri', redirectUri);\n formData.append('code', cleanCode);\n\n const response = await fetch(OAUTH_ENDPOINTS.TOKEN, {\n method: 'POST',\n body: formData,\n });\n\n const responseText = await response.text();\n\n if (!response.ok) {\n let error: { error_message?: string; error?: { message?: string } };\n try {\n error = JSON.parse(responseText);\n } catch {\n error = { error_message: responseText };\n }\n throw new Error(\n error.error_message || \n error.error?.message || \n 'Failed to exchange authorization code for token'\n );\n }\n\n const data = JSON.parse(responseText);\n\n // Handle both response formats:\n // New format: { data: [{ access_token, user_id, permissions }] }\n // Legacy format: { access_token, user_id }\n if (data.data && Array.isArray(data.data) && data.data.length > 0) {\n return {\n access_token: data.data[0].access_token,\n user_id: data.data[0].user_id,\n permissions: data.data[0].permissions || '',\n };\n } else if (data.access_token) {\n return {\n access_token: data.access_token,\n user_id: data.user_id,\n permissions: data.permissions || '',\n };\n }\n\n throw new Error('Unexpected token response format');\n }\n\n /**\n * Exchange short-lived token for long-lived token\n * \n * Long-lived tokens are valid for 60 days and can be refreshed.\n * \n * @param params - Exchange parameters\n * @returns Long-lived token response\n * @throws Error if exchange fails\n */\n static async getLongLivedToken(params: {\n clientSecret: string;\n accessToken: string;\n }): Promise<LongLivedTokenResponse> {\n const { clientSecret, accessToken } = params;\n\n const queryParams = new URLSearchParams({\n grant_type: 'ig_exchange_token',\n client_secret: clientSecret,\n access_token: accessToken,\n });\n\n const response = await fetch(\n `${OAUTH_ENDPOINTS.LONG_LIVED_TOKEN}?${queryParams.toString()}`\n );\n\n const responseText = await response.text();\n\n if (!response.ok) {\n let error: { error?: { message?: string } };\n try {\n error = JSON.parse(responseText);\n } catch {\n error = { error: { message: responseText } };\n }\n throw new Error(\n error.error?.message || 'Failed to exchange for long-lived token'\n );\n }\n\n return JSON.parse(responseText);\n }\n\n /**\n * Get the default scopes for Instagram Business Login\n * \n * @returns Array of commonly used scopes\n */\n static getDefaultScopes(): InstagramScope[] {\n return [\n 'instagram_business_basic',\n 'instagram_business_manage_messages',\n 'instagram_business_manage_comments',\n 'instagram_business_content_publish',\n ];\n }\n\n /**\n * Get all available Instagram Business Login scopes\n * \n * @returns Array of all available scopes\n */\n static getAllScopes(): InstagramScope[] {\n return [\n 'instagram_business_basic',\n 'instagram_business_manage_messages',\n 'instagram_business_manage_comments',\n 'instagram_business_content_publish',\n 'instagram_business_manage_insights',\n ];\n }\n}\n\n// Re-export types for convenience\nexport type {\n AuthorizationUrlParams,\n ExchangeCodeParams,\n ShortLivedTokenResponse,\n LongLivedTokenResponse,\n OAuthTokenResponse,\n OAuthCallbackParams,\n OAuthConfig,\n InstagramScope,\n} from '../types/oauth';\n","/**\n * Common Types for Instagram Graph API SDK\n */\n\n/**\n * SDK Configuration options\n */\nexport interface InstagramClientConfig {\n /** Instagram User access token */\n accessToken: string;\n /** API version (default: 'v22.0') */\n apiVersion?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Pagination cursor for API responses\n */\nexport interface PagingCursors {\n before?: string;\n after?: string;\n}\n\n/**\n * Pagination info for list responses\n */\nexport interface Paging {\n cursors?: PagingCursors;\n next?: string;\n previous?: string;\n}\n\n/**\n * Generic paginated response\n */\nexport interface PaginatedResponse<T> {\n data: T[];\n paging?: Paging;\n}\n\n/**\n * Generic single item response\n */\nexport interface SingleResponse<T> {\n data: T;\n}\n\n/**\n * Success response for mutations\n */\nexport interface SuccessResponse {\n success: boolean;\n}\n\n/**\n * ID response for creates\n */\nexport interface IdResponse {\n id: string;\n}\n\n/**\n * Fields parameter type (comma-separated list)\n */\nexport type FieldsParam = string | string[];\n\n/**\n * Convert fields to comma-separated string\n */\nexport function formatFields(fields?: FieldsParam): string | undefined {\n if (!fields) return undefined;\n if (Array.isArray(fields)) return fields.join(',');\n return fields;\n}\n\n/**\n * Base options for list requests\n */\nexport interface ListOptions {\n /** Maximum number of items to return */\n limit?: number;\n /** Pagination cursor (after) */\n after?: string;\n /** Pagination cursor (before) */\n before?: string;\n}\n\n/**\n * Options with fields selection\n */\nexport interface FieldsOptions {\n /** Fields to include in response */\n fields?: FieldsParam;\n}\n\n/**\n * Combined list options with fields\n */\nexport interface ListWithFieldsOptions extends ListOptions, FieldsOptions {}\n\n/**\n * Time period for insights\n */\nexport type InsightsPeriod = 'day' | 'week' | 'days_28' | 'month' | 'lifetime';\n\n/**\n * Metric breakdown type\n */\nexport type MetricBreakdown = 'age' | 'city' | 'country' | 'gender';\n","/**\n * Users API Module\n * \n * Handles all user-related API operations.\n */\n\nimport { HttpClient } from '../http';\nimport { USER_ENDPOINTS } from '../endpoints';\nimport {\n IGUser,\n IGUserField,\n ContentPublishingLimit,\n BusinessDiscovery,\n RecentlySearchedHashtag,\n AvailableCatalog,\n CatalogProduct,\n GetUserProfileOptions,\n GetUserMediaOptions,\n BusinessDiscoveryOptions,\n} from '../types/user';\nimport { IGMedia } from '../types/media';\nimport { PaginatedResponse, formatFields } from '../types/common';\n\n/**\n * Users API class for Instagram user operations\n */\nexport class UsersApi {\n private readonly http: HttpClient;\n private readonly userId: string;\n\n constructor(http: HttpClient, userId: string) {\n this.http = http;\n this.userId = userId;\n }\n\n /**\n * Get user profile information\n * @param options - Fields to retrieve\n */\n async getProfile(options?: GetUserProfileOptions): Promise<IGUser> {\n const fields = options?.fields?.join(',') || 'id,username,account_type';\n return this.http.get<IGUser>(USER_ENDPOINTS.PROFILE(this.userId), { fields });\n }\n\n /**\n * Get user's media\n * @param options - Pagination and fields options\n */\n async getMedia(options?: GetUserMediaOptions): Promise<PaginatedResponse<IGMedia>> {\n return this.http.get<PaginatedResponse<IGMedia>>(\n USER_ENDPOINTS.MEDIA(this.userId),\n {\n fields: formatFields(options?.fields) || 'id,caption,media_type,media_url,permalink,timestamp',\n limit: options?.limit,\n after: options?.after,\n before: options?.before,\n }\n );\n }\n\n /**\n * Get user's stories\n */\n async getStories(): Promise<PaginatedResponse<IGMedia>> {\n return this.http.get<PaginatedResponse<IGMedia>>(\n USER_ENDPOINTS.STORIES(this.userId),\n { fields: 'id,media_type,media_url,timestamp' }\n );\n }\n\n /**\n * Get user's live media\n */\n async getLiveMedia(): Promise<PaginatedResponse<IGMedia>> {\n return this.http.get<PaginatedResponse<IGMedia>>(\n USER_ENDPOINTS.LIVE_MEDIA(this.userId),\n { fields: 'id,media_type,timestamp' }\n );\n }\n\n /**\n * Get content publishing limit (quota usage)\n */\n async getContentPublishingLimit(): Promise<ContentPublishingLimit> {\n return this.http.get<ContentPublishingLimit>(\n USER_ENDPOINTS.CONTENT_PUBLISHING_LIMIT(this.userId),\n { fields: 'quota_usage,config' }\n );\n }\n\n /**\n * Discover another business account by username\n * @param options - Username and fields to retrieve\n */\n async getBusinessDiscovery(options: BusinessDiscoveryOptions): Promise<BusinessDiscovery> {\n const fields = options.fields?.join(',') || 'id,username,followers_count,media_count';\n return this.http.get<BusinessDiscovery>(\n USER_ENDPOINTS.BUSINESS_DISCOVERY(this.userId),\n {\n fields: `business_discovery.username(${options.username}){${fields}}`,\n }\n );\n }\n\n /**\n * Get media where user is mentioned\n */\n async getMentionedMedia(): Promise<PaginatedResponse<IGMedia>> {\n return this.http.get<PaginatedResponse<IGMedia>>(\n USER_ENDPOINTS.MENTIONED_MEDIA(this.userId),\n { fields: 'id,caption,media_type,timestamp' }\n );\n }\n\n /**\n * Get comments where user is mentioned\n */\n async getMentionedComment(): Promise<PaginatedResponse<{ id: string; text?: string }>> {\n return this.http.get<PaginatedResponse<{ id: string; text?: string }>>(\n USER_ENDPOINTS.MENTIONED_COMMENT(this.userId),\n { fields: 'id,text,timestamp' }\n );\n }\n\n /**\n * Get media user is tagged in\n */\n async getTags(): Promise<PaginatedResponse<IGMedia>> {\n return this.http.get<PaginatedResponse<IGMedia>>(\n USER_ENDPOINTS.TAGS(this.userId),\n { fields: 'id,media_type,timestamp' }\n );\n }\n\n /**\n * Get recently searched hashtags\n */\n async getRecentlySearchedHashtags(): Promise<PaginatedResponse<RecentlySearchedHashtag>> {\n return this.http.get<PaginatedResponse<RecentlySearchedHashtag>>(\n USER_ENDPOINTS.RECENTLY_SEARCHED_HASHTAGS(this.userId)\n );\n }\n\n /**\n * Get available product catalogs\n */\n async getAvailableCatalogs(): Promise<PaginatedResponse<AvailableCatalog>> {\n return this.http.get<PaginatedResponse<AvailableCatalog>>(\n USER_ENDPOINTS.AVAILABLE_CATALOGS(this.userId)\n );\n }\n\n /**\n * Search products in a catalog\n * @param catalogId - Catalog ID to search in\n * @param query - Search query\n */\n async searchCatalogProducts(\n catalogId: string,\n query: string\n ): Promise<PaginatedResponse<CatalogProduct>> {\n return this.http.get<PaginatedResponse<CatalogProduct>>(\n USER_ENDPOINTS.CATALOG_PRODUCT_SEARCH(this.userId),\n { catalog_id: catalogId, q: query }\n );\n }\n}\n","/**\n * Media API Module\n * \n * Handles all media-related API operations.\n */\n\nimport { HttpClient } from '../http';\nimport { MEDIA_ENDPOINTS } from '../endpoints';\nimport {\n IGMedia,\n IGMediaField,\n IGMediaChild,\n MediaCollaborator,\n ProductTag,\n GetMediaOptions,\n GetMediaChildrenOptions,\n} from '../types/media';\nimport { IGComment, GetCommentsOptions } from '../types/comment';\nimport { InsightsResponse, GetMediaInsightsOptions, MediaMetric } from '../types/insights';\nimport { PaginatedResponse, formatFields } from '../types/common';\n\n/**\n * Media API class for Instagram media operations\n */\nexport class MediaApi {\n private readonly http: HttpClient;\n\n constructor(http: HttpClient) {\n this.http = http;\n }\n\n /**\n * Get media by ID\n * @param mediaId - Media ID\n * @param options - Fields to retrieve\n */\n async get(mediaId: string, options?: GetMediaOptions): Promise<IGMedia> {\n const fields = options?.fields?.join(',') || 'id,caption,media_type,media_url,permalink,timestamp';\n return this.http.get<IGMedia>(MEDIA_ENDPOINTS.GET(mediaId), { fields });\n }\n\n /**\n * Get carousel children\n * @param mediaId - Carousel media ID\n * @param options - Fields to retrieve\n */\n async getChildren(\n mediaId: string,\n options?: GetMediaChildrenOptions\n ): Promise<PaginatedResponse<IGMediaChild>> {\n const fields = formatFields(options?.fields) || 'id,media_type,media_url';\n return this.http.get<PaginatedResponse<IGMediaChild>>(\n MEDIA_ENDPOINTS.CHILDREN(mediaId),\n { fields }\n );\n }\n\n /**\n * Get comments on media\n * @param mediaId - Media ID\n * @param options - Pagination and fields options\n */\n async getComments(\n mediaId: string,\n options?: GetCommentsOptions\n ): Promise<PaginatedResponse<IGComment>> {\n return this.http.get<PaginatedResponse<IGComment>>(\n MEDIA_ENDPOINTS.COMMENTS(mediaId),\n {\n fields: formatFields(options?.fields) || 'id,text,username,timestamp',\n limit: options?.limit,\n after: options?.after,\n }\n );\n }\n\n /**\n * Get media insights\n * @param mediaId - Media ID\n * @param options - Metrics to retrieve\n */\n async getInsights(\n mediaId: string,\n options: GetMediaInsightsOptions\n ): Promise<InsightsResponse> {\n return this.http.get<InsightsResponse>(\n MEDIA_ENDPOINTS.INSIGHTS(mediaId),\n { metric: options.metric.join(',') }\n );\n }\n\n /**\n * Get media collaborators\n * @param mediaId - Media ID\n */\n async getCollaborators(mediaId: string): Promise<PaginatedResponse<MediaCollaborator>> {\n return this.http.get<PaginatedResponse<MediaCollaborator>>(\n MEDIA_ENDPOINTS.COLLABORATORS(mediaId),\n { fields: 'id,username' }\n );\n }\n\n /**\n * Get product tags on media\n * @param mediaId - Media ID\n */\n async getProductTags(mediaId: string): Promise<PaginatedResponse<ProductTag>> {\n return this.http.get<PaginatedResponse<ProductTag>>(\n MEDIA_ENDPOINTS.PRODUCT_TAGS(mediaId)\n );\n }\n}\n","/**\n * Publishing API Module\n * \n * Handles content publishing operations.\n */\n\nimport { HttpClient } from '../http';\nimport { PUBLISHING_ENDPOINTS } from '../endpoints';\nimport {\n ContainerResponse,\n ContainerStatus,\n PublishResponse,\n CreateImageContainerOptions,\n CreateVideoContainerOptions,\n CreateCarouselContainerOptions,\n ResumableUploadOptions,\n} from '../types/publishing';\n\n/**\n * Publishing API class for content publishing operations\n */\nexport class PublishingApi {\n private readonly http: HttpClient;\n private readonly userId: string;\n\n constructor(http: HttpClient, userId: string) {\n this.http = http;\n this.userId = userId;\n }\n\n /**\n * Create an image container\n * @param options - Image URL and optional caption, location, tags\n */\n async createImageContainer(options: CreateImageContainerOptions): Promise<ContainerResponse> {\n return this.http.post<ContainerResponse>(\n PUBLISHING_ENDPOINTS.CREATE_CONTAINER(this.userId),\n {\n image_url: options.image_url,\n caption: options.caption,\n location_id: options.location_id,\n user_tags: options.user_tags ? JSON.stringify(options.user_tags) : undefined,\n collaborators: options.collaborators?.join(','),\n alt_text: options.alt_text,\n is_carousel_item: options.is_carousel_item,\n }\n );\n }\n\n /**\n * Create a video/reel/story container\n * @param options - Video URL, media type, and optional settings\n */\n async createVideoContainer(options: CreateVideoContainerOptions): Promise<ContainerResponse> {\n return this.http.post<ContainerResponse>(\n PUBLISHING_ENDPOINTS.CREATE_CONTAINER(this.userId),\n {\n video_url: options.video_url,\n media_type: options.media_type,\n caption: options.caption,\n location_id: options.location_id,\n user_tags: options.user_tags ? JSON.stringify(options.user_tags) : undefined,\n collaborators: options.collaborators?.join(','),\n share_to_feed: options.share_to_feed,\n is_carousel_item: options.is_carousel_item,\n cover_url: options.cover_url,\n thumb_offset: options.thumb_offset,\n audio_name: options.audio_name,\n }\n );\n }\n\n /**\n * Create a carousel container\n * @param options - Child container IDs and optional caption\n */\n async createCarouselContainer(options: CreateCarouselContainerOptions): Promise<ContainerResponse> {\n return this.http.post<ContainerResponse>(\n PUBLISHING_ENDPOINTS.CREATE_CONTAINER(this.userId),\n {\n media_type: 'CAROUSEL',\n children: options.children.join(','),\n caption: options.caption,\n location_id: options.location_id,\n collaborators: options.collaborators?.join(','),\n }\n );\n }\n\n /**\n * Create a resumable upload session\n * @param options - Media type and settings\n */\n async createResumableUpload(options: ResumableUploadOptions): Promise<ContainerResponse> {\n return this.http.post<ContainerResponse>(\n PUBLISHING_ENDPOINTS.CREATE_CONTAINER(this.userId),\n {\n media_type: options.media_type,\n upload_type: 'resumable',\n caption: options.caption,\n location_id: options.location_id,\n collaborators: options.collaborators?.join(','),\n }\n );\n }\n\n /**\n * Get container status\n * @param containerId - Container ID\n */\n async getContainerStatus(containerId: string): Promise<ContainerStatus> {\n return this.http.get<ContainerStatus>(\n PUBLISHING_ENDPOINTS.CONTAINER_STATUS(containerId),\n { fields: 'id,status_code,status' }\n );\n }\n\n /**\n * Publish a container\n * @param containerId - Container ID to publish\n */\n async publishContainer(containerId: string): Promise<PublishResponse> {\n return this.http.post<PublishResponse>(\n PUBLISHING_ENDPOINTS.PUBLISH(this.userId),\n { creation_id: containerId }\n );\n }\n\n /**\n * Wait for container to be ready, then publish\n * @param containerId - Container ID\n * @param maxAttempts - Maximum number of status checks (default: 30)\n * @param intervalMs - Interval between checks in ms (default: 2000)\n */\n async waitAndPublish(\n containerId: string,\n maxAttempts: number = 30,\n intervalMs: number = 2000\n ): Promise<PublishResponse> {\n for (let i = 0; i < maxAttempts; i++) {\n const status = await this.getContainerStatus(containerId);\n \n if (status.status_code === 'FINISHED') {\n return this.publishContainer(containerId);\n }\n \n if (status.status_code === 'ERROR' || status.status_code === 'EXPIRED') {\n throw new Error(`Container failed with status: ${status.status_code}`);\n }\n \n await new Promise(resolve => setTimeout(resolve, intervalMs));\n }\n \n throw new Error('Container did not become ready in time');\n }\n}\n","/**\n * Messaging API Module\n * \n * Handles all messaging operations (Send API).\n */\n\nimport { HttpClient } from '../http';\nimport { MESSAGING_ENDPOINTS } from '../endpoints';\nimport {\n SendMessageResponse,\n SendTextOptions,\n SendMediaOptions,\n GenericTemplateOptions,\n ButtonTemplateOptions,\n QuickRepliesOptions,\n QuickReply,\n ReactionType,\n TemplateElement,\n TemplateButton,\n} from '../types/messaging';\n\n/**\n * Messaging API class for Instagram messaging operations\n */\nexport class MessagingApi {\n private readonly http: HttpClient;\n private readonly userId: string;\n\n constructor(http: HttpClient, userId: string) {\n this.http = http;\n this.userId = userId;\n }\n\n /**\n * Send a text message\n * @param recipientId - Instagram-scoped user ID (IGSID)\n * @param text - Message text\n * @param options - Optional settings (humanAgent for 7-day window)\n */\n async sendText(\n recipientId: string,\n text: string,\n options?: SendTextOptions\n ): Promise<SendMessageResponse> {\n const payload: Record<string, unknown> = {\n recipient: { id: recipientId },\n message: { text },\n };\n\n if (options?.humanAgent) {\n payload.messaging_type = 'MESSAGE_TAG';\n payload.tag = 'HUMAN_AGENT';\n }\n\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n payload\n );\n }\n\n /**\n * Send a media message (image, video, audio)\n * @param recipientId - Instagram-scoped user ID\n * @param options - Media type and URL\n */\n async sendMedia(\n recipientId: string,\n options: SendMediaOptions\n ): Promise<SendMessageResponse> {\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n {\n recipient: { id: recipientId },\n message: {\n attachment: {\n type: options.type,\n payload: { url: options.url },\n },\n },\n }\n );\n }\n\n /**\n * Send a sticker (like_heart)\n * @param recipientId - Instagram-scoped user ID\n */\n async sendLikeHeart(recipientId: string): Promise<SendMessageResponse> {\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n {\n recipient: { id: recipientId },\n message: {\n attachment: {\n type: 'like_heart',\n },\n },\n }\n );\n }\n\n /**\n * Send a generic template\n * @param recipientId - Instagram-scoped user ID\n * @param options - Template elements\n */\n async sendGenericTemplate(\n recipientId: string,\n options: GenericTemplateOptions\n ): Promise<SendMessageResponse> {\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n {\n recipient: { id: recipientId },\n message: {\n attachment: {\n type: 'template',\n payload: {\n template_type: 'generic',\n elements: options.elements,\n },\n },\n },\n }\n );\n }\n\n /**\n * Send a button template\n * @param recipientId - Instagram-scoped user ID\n * @param options - Text and buttons\n */\n async sendButtonTemplate(\n recipientId: string,\n options: ButtonTemplateOptions\n ): Promise<SendMessageResponse> {\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n {\n recipient: { id: recipientId },\n message: {\n attachment: {\n type: 'template',\n payload: {\n template_type: 'button',\n text: options.text,\n buttons: options.buttons,\n },\n },\n },\n }\n );\n }\n\n /**\n * Send quick replies\n * @param recipientId - Instagram-scoped user ID\n * @param options - Text and quick reply options\n */\n async sendQuickReplies(\n recipientId: string,\n options: QuickRepliesOptions\n ): Promise<SendMessageResponse> {\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n {\n recipient: { id: recipientId },\n message: {\n text: options.text,\n quick_replies: options.replies,\n },\n }\n );\n }\n\n /**\n * Send a private reply to a comment\n * @param commentId - Comment ID to reply to\n * @param message - Message text\n */\n async sendPrivateReply(\n commentId: string,\n message: string\n ): Promise<SendMessageResponse> {\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n {\n recipient: { comment_id: commentId },\n message: { text: message },\n }\n );\n }\n\n /**\n * Share a published post via message\n * @param recipientId - Instagram-scoped user ID\n * @param mediaId - Media ID of the post to share\n */\n async sendMediaShare(\n recipientId: string,\n mediaId: string\n ): Promise<SendMessageResponse> {\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n {\n recipient: { id: recipientId },\n message: {\n attachment: {\n type: 'MEDIA_SHARE',\n payload: { id: mediaId },\n },\n },\n }\n );\n }\n\n /**\n * React to a message\n * @param recipientId - Instagram-scoped user ID\n * @param messageId - Message ID to react to\n * @param reaction - Reaction type\n */\n async reactToMessage(\n recipientId: string,\n messageId: string,\n reaction: ReactionType\n ): Promise<SendMessageResponse> {\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n {\n recipient: { id: recipientId },\n sender_action: 'react',\n payload: {\n message_id: messageId,\n reaction,\n },\n }\n );\n }\n\n /**\n * Remove reaction from a message\n * @param recipientId - Instagram-scoped user ID\n * @param messageId - Message ID to unreact from\n */\n async unreactToMessage(\n recipientId: string,\n messageId: string\n ): Promise<SendMessageResponse> {\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n {\n recipient: { id: recipientId },\n sender_action: 'unreact',\n payload: {\n message_id: messageId,\n },\n }\n );\n }\n\n /**\n * Send typing indicator\n * @param recipientId - Instagram-scoped user ID\n * @param typing - Whether to show typing (true) or stop (false)\n */\n async sendTypingIndicator(\n recipientId: string,\n typing: boolean = true\n ): Promise<SendMessageResponse> {\n return this.http.post<SendMessageResponse>(\n MESSAGING_ENDPOINTS.SEND(this.userId),\n {\n recipient: { id: recipientId },\n sender_action: typing ? 'typing_on' : 'typing_off',\n }\n );\n }\n}\n","/**\n * Conversations API Module\n * \n * Handles conversation and message retrieval.\n */\n\nimport { HttpClient } from '../http';\nimport { MESSAGING_ENDPOINTS } from '../endpoints';\nimport {\n Conversation,\n ConversationMessage,\n GetConversationsOptions,\n} from '../types/messaging';\nimport { PaginatedResponse } from '../types/common';\n\n/**\n * Conversations API class for Instagram conversation operations\n */\nexport class ConversationsApi {\n private readonly http: HttpClient;\n private readonly userId: string;\n\n constructor(http: HttpClient, userId: string) {\n this.http = http;\n this.userId = userId;\n }\n\n /**\n * Get list of conversations\n * @param options - Pagination and filter options\n */\n async list(options?: GetConversationsOptions): Promise<PaginatedResponse<Conversation>> {\n return this.http.get<PaginatedResponse<Conversation>>(\n MESSAGING_ENDPOINTS.CONVERSATIONS(this.userId),\n {\n platform: options?.platform || 'instagram',\n user_id: options?.user_id,\n limit: options?.limit,\n after: options?.after,\n fields: 'id,updated_time',\n }\n );\n }\n\n /**\n * Find conversation with a specific user\n * @param igsid - Instagram-scoped user ID\n */\n async findByUser(igsid: string): Promise<PaginatedResponse<Conversation>> {\n return this.http.get<PaginatedResponse<Conversation>>(\n MESSAGING_ENDPOINTS.CONVERSATIONS(this.userId),\n {\n platform: 'instagram',\n user_id: igsid,\n fields: 'id,updated_time',\n }\n );\n }\n\n /**\n * Get messages in a conversation\n * @param conversationId - Conversation ID\n * @param fields - Fields to retrieve (default: from,to)\n */\n async getMessages(\n conversationId: string,\n fields: string = 'messages{id,created_time,from,to,message}'\n ): Promise<{ messages: PaginatedResponse<ConversationMessage> }> {\n return this.http.get<{ messages: PaginatedResponse<ConversationMessage> }>(\n MESSAGING_ENDPOINTS.CONVERSATION(conversationId),\n { fields }\n );\n }\n\n /**\n * Get a specific message\n * @param messageId - Message ID\n * @param fields - Fields to retrieve\n */\n async getMessage(\n messageId: string,\n fields: string = 'id,created_time,from,to,message'\n ): Promise<ConversationMessage> {\n return this.http.get<ConversationMessage>(\n MESSAGING_ENDPOINTS.MESSAGE(messageId),\n { fields }\n );\n }\n}\n","/**\n * Comments API Module\n * \n * Handles comment moderation operations.\n */\n\nimport { HttpClient } from '../http';\nimport { COMMENT_ENDPOINTS } from '../endpoints';\nimport {\n IGComment,\n IGCommentField,\n GetCommentsOptions,\n ReplyToCommentOptions,\n UpdateCommentOptions,\n} from '../types/comment';\nimport { PaginatedResponse, SuccessResponse, IdResponse } from '../types/common';\n\n/**\n * Comments API class for Instagram comment operations\n */\nexport class CommentsApi {\n private readonly http: HttpClient;\n\n constructor(http: HttpClient) {\n this.http = http;\n }\n\n /**\n * Get comment by ID\n * @param commentId - Comment ID\n * @param fields - Fields to retrieve\n */\n async get(\n commentId: string,\n fields: IGCommentField[] = ['id', 'text', 'username', 'timestamp']\n ): Promise<IGComment> {\n return this.http.get<IGComment>(\n COMMENT_ENDPOINTS.GET(commentId),\n { fields: fields.join(',') }\n );\n }\n\n /**\n * Get replies to a comment\n * @param commentId - Comment ID\n * @param options - Pagination and fields options\n */\n async getReplies(\n commentId: string,\n options?: GetCommentsOptions\n ): Promise<PaginatedResponse<IGComment>> {\n return this.http.get<PaginatedResponse<IGComment>>(\n COMMENT_ENDPOINTS.REPLIES(commentId),\n {\n fields: options?.fields?.join(',') || 'id,text,username,timestamp',\n limit: options?.limit,\n after: options?.after,\n }\n );\n }\n\n /**\n * Reply to a comment\n * @param commentId - Comment ID to reply to\n * @param options - Reply message\n */\n async reply(commentId: string, options: ReplyToCommentOptions): Promise<IdResponse> {\n return this.http.post<IdResponse>(\n COMMENT_ENDPOINTS.REPLY(commentId),\n { message: options.message }\n );\n }\n\n /**\n * Hide a comment\n * @param commentId - Comment ID\n */\n async hide(commentId: string): Promise<SuccessResponse> {\n return this.http.post<SuccessResponse>(\n COMMENT_ENDPOINTS.UPDATE(commentId),\n { hide: true }\n );\n }\n\n /**\n * Unhide a comment\n * @param commentId - Comment ID\n */\n async unhide(commentId: string): Promise<SuccessResponse> {\n return this.http.post<SuccessResponse>(\n COMMENT_ENDPOINTS.UPDATE(commentId),\n { hide: false }\n );\n }\n\n /**\n * Delete a comment\n * @param commentId - Comment ID\n */\n async delete(commentId: string): Promise<SuccessResponse> {\n return this.http.delete<SuccessResponse>(COMMENT_ENDPOINTS.DELETE(commentId));\n }\n}\n","/**\n * Hashtags API Module\n * \n * Handles hashtag search and media retrieval.\n */\n\nimport { HttpClient } from '../http';\nimport { HASHTAG_ENDPOINTS } from '../endpoints';\nimport {\n IGHashtag,\n HashtagSearchOptions,\n HashtagSearchResponse,\n GetHashtagMediaOptions,\n HashtagMediaResponse,\n} from '../types/hashtag';\n\n/**\n * Hashtags API class for Instagram hashtag operations\n */\nexport class HashtagsApi {\n private readonly http: HttpClient;\n\n constructor(http: HttpClient) {\n this.http = http;\n }\n\n /**\n * Search for a hashtag\n * @param options - User ID and search query\n */\n async search(options: HashtagSearchOptions): Promise<HashtagSearchResponse> {\n return this.http.get<HashtagSearchResponse>(\n HASHTAG_ENDPOINTS.SEARCH,\n {\n user_id: options.user_id,\n q: options.q,\n }\n );\n }\n\n /**\n * Get hashtag information\n * @param hashtagId - Hashtag ID\n */\n async get(hashtagId: string): Promise<IGHashtag> {\n return this.http.get<IGHashtag>(\n HASHTAG_ENDPOINTS.GET(hashtagId),\n { fields: 'id,name' }\n );\n }\n\n /**\n * Get recent media with hashtag\n * @param hashtagId - Hashtag ID\n * @param options - User ID and pagination options\n */\n async getRecentMedia(\n hashtagId: string,\n options: GetHashtagMediaOptions\n ): Promise<HashtagMediaResponse> {\n return this.http.get<HashtagMediaResponse>(\n HASHTAG_ENDPOINTS.RECENT_MEDIA(hashtagId),\n {\n user_id: options.user_id,\n fields: options.fields?.join(',') || 'id,caption,media_type,permalink',\n limit: options.limit,\n after: options.after,\n }\n );\n }\n\n /**\n * Get top media with hashtag\n * @param hashtagId - Hashtag ID\n * @param options - User ID and pagination options\n */\n async getTopMedia(\n hashtagId: string,\n options: GetHashtagMediaOptions\n ): Promise<HashtagMediaResponse> {\n return this.http.get<HashtagMediaResponse>(\n HASHTAG_ENDPOINTS.TOP_MEDIA(hashtagId),\n {\n user_id: options.user_id,\n fields: options.fields?.join(',') || 'id,caption,media_type,permalink',\n limit: options.limit,\n after: options.after,\n }\n );\n }\n}\n","/**\n * Insights API Module\n * \n * Handles account and media insights.\n */\n\nimport { HttpClient } from '../http';\nimport { USER_ENDPOINTS, MEDIA_ENDPOINTS } from '../endpoints';\nimport {\n InsightsResponse,\n GetAccountInsightsOptions,\n GetMediaInsightsOptions,\n} from '../types/insights';\n\n/**\n * Insights API class for Instagram analytics\n */\nexport class InsightsApi {\n private readonly http: HttpClient;\n private readonly userId: string;\n\n constructor(http: HttpClient, userId: string) {\n this.http = http;\n this.userId = userId;\n }\n\n /**\n * Get account insights\n * @param options - Metrics, period, and breakdown options\n */\n async getAccountInsights(options: GetAccountInsightsOptions): Promise<InsightsResponse> {\n return this.http.get<InsightsResponse>(\n USER_ENDPOINTS.INSIGHTS(this.userId),\n {\n metric: options.metric.join(','),\n period: options.period || 'day',\n since: options.since,\n until: options.until,\n metric_type: options.metric_type,\n breakdown: options.breakdown,\n }\n );\n }\n\n /**\n * Get media insights\n * @param mediaId - Media ID\n * @param options - Metrics to retrieve\n */\n async getMediaInsights(\n mediaId: string,\n options: GetMediaInsightsOptions\n ): Promise<InsightsResponse> {\n return this.http.get<InsightsResponse>(\n MEDIA_ENDPOINTS.INSIGHTS(mediaId),\n { metric: options.metric.join(',') }\n );\n }\n}\n","/**\n * Welcome Flows API Module\n * \n * Handles welcome message flow operations.\n */\n\nimport { HttpClient } from '../http';\nimport { WELCOME_FLOW_ENDPOINTS } from '../endpoints';\nimport {\n WelcomeMessageFlow,\n WelcomeFlowOptions,\n WelcomeFlowsResponse,\n} from '../types/welcomeFlow';\nimport { SuccessResponse, IdResponse } from '../types/common';\n\n/**\n * Welcome Flows API class for managing welcome message flows\n */\nexport class WelcomeFlowsApi {\n private readonly http: HttpClient;\n private readonly userId: string;\n\n constructor(http: HttpClient, userId: string) {\n this.http = http;\n this.userId = userId;\n }\n\n /**\n * Get all welcome message flows\n */\n async list(): Promise<WelcomeFlowsResponse> {\n return this.http.get<WelcomeFlowsResponse>(\n WELCOME_FLOW_ENDPOINTS.FLOWS(this.userId)\n );\n }\n\n /**\n * Get a specific welcome message flow\n * @param flowId - Flow ID\n */\n async get(flowId: string): Promise<WelcomeMessageFlow> {\n return this.http.get<WelcomeMessageFlow>(\n WELCOME_FLOW_ENDPOINTS.FLOWS(this.userId),\n { flow_id: flowId }\n );\n }\n\n /**\n * Create a new welcome message flow\n * @param options - Flow name and screens\n */\n async create(options: WelcomeFlowOptions): Promise<IdResponse> {\n return this.http.post<IdResponse>(\n WELCOME_FLOW_ENDPOINTS.FLOWS(this.userId),\n {\n name: options.name,\n screens: options.screens,\n }\n );\n }\n\n /**\n * Update an existing welcome message flow\n * @param flowId - Flow ID\n * @param options - Updated flow name and screens\n */\n async update(flowId: string, options: WelcomeFlowOptions): Promise<SuccessResponse> {\n return this.http.post<SuccessResponse>(\n WELCOME_FLOW_ENDPOINTS.FLOWS(this.userId),\n {\n flow_id: flowId,\n name: options.name,\n screens: options.screens,\n }\n );\n }\n\n /**\n * Delete a welcome message flow\n * @param flowId - Flow ID\n */\n async delete(flowId: string): Promise<SuccessResponse> {\n return this.http.delete<SuccessResponse>(\n WELCOME_FLOW_ENDPOINTS.FLOWS(this.userId),\n { flow_id: flowId }\n );\n }\n}\n","/**\n * Messenger Profile API Module\n * \n * Handles Ice Breakers, Persistent Menu, and Sender Actions.\n */\n\nimport { HttpClient } from '../http';\nimport { MESSENGER_PROFILE_ENDPOINTS } from '../endpoints';\nimport {\n IceBreaker,\n IceBreakerQuestion,\n SetIceBreakersOptions,\n IceBreakersResponse,\n PersistentMenu,\n SetPersistentMenuOptions,\n SenderAction,\n} from '../types/messengerProfile';\nimport { SuccessResponse } from '../types/common';\n\n/**\n * Messenger Profile API class for managing ice breakers and persistent menu\n */\nexport class MessengerProfileApi {\n private readonly http: HttpClient;\n private readonly userId: string;\n\n constructor(http: HttpClient, userId: string) {\n this.http = http;\n this.userId = userId;\n }\n\n /**\n * Get current ice breakers\n */\n async getIceBreakers(): Promise<IceBreakersResponse> {\n return this.http.get<IceBreakersResponse>(\n MESSENGER_PROFILE_ENDPOINTS.PROFILE(this.userId),\n { fields: 'ice_breakers' }\n );\n }\n\n /**\n * Set ice breakers (FAQ questions)\n * @param iceBreakers - Ice breaker configurations (max 4 questions per locale)\n */\n async setIceBreakers(iceBreakers: IceBreaker[]): Promise<SuccessResponse> {\n return this.http.post<SuccessResponse>(\n MESSENGER_PROFILE_ENDPOINTS.PROFILE(this.userId),\n {\n platform: 'instagram',\n ice_breakers: iceBreakers,\n }\n );\n }\n\n /**\n * Delete ice breakers\n */\n async deleteIceBreakers(): Promise<SuccessResponse> {\n return this.http.delete<SuccessResponse>(\n MESSENGER_PROFILE_ENDPOINTS.PROFILE(this.userId),\n { fields: ['ice_breakers'] }\n );\n }\n\n /**\n * Get persistent menu\n */\n async getPersistentMenu(): Promise<{ data: PersistentMenu[] }> {\n return this.http.get<{ data: PersistentMenu[] }>(\n MESSENGER_PROFILE_ENDPOINTS.PROFILE(this.userId),\n { fields: 'persistent_menu' }\n );\n }\n\n /**\n * Set persistent menu\n * @param menus - Persistent menu configurations\n */\n async setPersistentMenu(menus: PersistentMenu[]): Promise<SuccessResponse> {\n return this.http.post<SuccessResponse>(\n MESSENGER_PROFILE_ENDPOINTS.PROFILE(this.userId),\n {\n platform: 'instagram',\n persistent_menu: menus,\n }\n );\n }\n\n /**\n * Delete persistent menu\n */\n async deletePersistentMenu(): Promise<SuccessResponse> {\n return this.http.delete<SuccessResponse>(\n MESSENGER_PROFILE_ENDPOINTS.PROFILE(this.userId),\n { fields: ['persistent_menu'] }\n );\n }\n}\n","/**\n * oEmbed API Module\n * \n * Handles oEmbed operations for embedding Instagram content.\n */\n\nimport { HttpClient } from '../http';\nimport { OEMBED_ENDPOINTS } from '../endpoints';\nimport { OEmbedResponse, GetOEmbedOptions } from '../types/oembed';\n\n/**\n * oEmbed API class for embedding Instagram content\n */\nexport class OEmbedApi {\n private readonly http: HttpClient;\n\n constructor(http: HttpClient) {\n this.http = http;\n }\n\n /**\n * Get oEmbed data for an Instagram URL\n * @param options - URL and optional formatting options\n */\n async get(options: GetOEmbedOptions): Promise<OEmbedResponse> {\n return this.http.get<OEmbedResponse>(\n OEMBED_ENDPOINTS.GET,\n {\n url: options.url,\n maxwidth: options.maxwidth,\n hidecaption: options.hidecaption,\n omitscript: options.omitscript,\n }\n );\n }\n}\n","import { HttpClient } from '../http';\nimport { SubscribedFieldsResponse } from '../types/webhooks';\n\nexport class WebhooksApi {\n private readonly http: HttpClient;\n private readonly userId: string;\n\n constructor(http: HttpClient, userId: string) {\n this.http = http;\n this.userId = userId;\n }\n\n /**\n * Subscribe your app to specific fields for this user/page.\n * \n * @param fields List of fields to subscribe to (e.g., ['messages', 'comments'])\n */\n async subscribe(fields: string[]): Promise<{ success: boolean }> {\n return this.http.post<{ success: boolean }>(`/${this.userId}/subscribed_apps`, {\n subscribed_fields: fields.join(','),\n });\n }\n\n /**\n * Unsubscribe from specific fields or all fields.\n * \n * @param fields Optional list of fields to unsubscribe from. If empty, unsubscribes from all.\n */\n async unsubscribe(fields?: string[]): Promise<{ success: boolean }> {\n if (fields && fields.length > 0) {\n // Unsubscribe from specific fields by subscribing to the remaining ones?\n // Actually, the DELETE endpoint removes the app subscription entirely if no fields specified.\n // To remove specific fields, you typically re-subscribe with the fields you WANT to keep.\n // But strictly speaking, DELETE /{user-id}/subscribed_apps removes the app from the page/user.\n \n // If fields are provided, we should probably check current subscriptions and remove the ones listed.\n // For now, let's just support full unsubscribe via DELETE.\n throw new Error('Partial unsubscribe not directly supported by API. Use subscribe() with the fields you want to keep.');\n }\n\n return this.http.delete<{ success: boolean }>(`/${this.userId}/subscribed_apps`);\n }\n\n /**\n * Get the list of fields your app is currently subscribed to.\n */\n async getSubscribedFields(): Promise<SubscribedFieldsResponse> {\n return this.http.get<SubscribedFieldsResponse>(`/${this.userId}/subscribed_apps`);\n }\n}\n","/**\n * Instagram Graph API SDK - Main Client\n * \n * Type-safe TypeScript SDK for Instagram Graph API with Instagram Login.\n * \n * @example\n * ```typescript\n * import { InstagramClient } from 'instagram-graph-api-sdk';\n * \n * const client = new InstagramClient({\n * accessToken: 'your-access-token',\n * apiVersion: 'v22.0', // optional, defaults to 'v22.0'\n * });\n * \n * // Get user profile\n * const profile = await client.users.getProfile({ fields: ['id', 'username'] });\n * console.log(profile);\n * ```\n */\n\nimport { HttpClient } from './http';\nimport { InstagramClientConfig } from './types/common';\nimport { IGUser } from './types/user';\nimport {\n AuthApi,\n UsersApi,\n MediaApi,\n PublishingApi,\n MessagingApi,\n ConversationsApi,\n CommentsApi,\n HashtagsApi,\n InsightsApi,\n WelcomeFlowsApi,\n MessengerProfileApi,\n OEmbedApi,\n WebhooksApi,\n} from './api';\n\n/**\n * Default API version\n */\nconst DEFAULT_API_VERSION = 'v22.0';\n\n/**\n * Instagram Graph API Client\n * \n * Main entry point for the SDK. Provides access to all API modules.\n */\nexport class InstagramClient {\n private readonly http: HttpClient;\n private readonly config: Required<InstagramClientConfig>;\n private cachedUserId: string | null = null;\n\n /** Authentication API - Token management */\n public readonly auth: AuthApi;\n\n /** Users API - Profile, media, insights */\n public readonly users: UsersApi;\n\n /** Media API - Get media, children, comments */\n public readonly media: MediaApi;\n\n /** Publishing API - Publish images, videos, reels */\n public readonly publishing: PublishingApi;\n\n /** Messaging API - Send messages, templates */\n public readonly messaging: MessagingApi;\n\n /** Conversations API - List conversations, messages */\n public readonly conversations: ConversationsApi;\n\n /** Comments API - Moderation */\n public readonly comments: CommentsApi;\n\n /** Hashtags API - Search, media */\n public readonly hashtags: HashtagsApi;\n\n /** Insights API - Analytics */\n public readonly insights: InsightsApi;\n\n /** Welcome Flows API - Welcome message flows */\n public readonly welcomeFlows: WelcomeFlowsApi;\n\n /** Messenger Profile API - Ice breakers, menu */\n public readonly messengerProfile: MessengerProfileApi;\n\n /** oEmbed API - Embed content */\n public readonly oembed: OEmbedApi;\n\n /** Webhooks API - Manage subscriptions */\n public readonly webhooks: WebhooksApi;\n\n /**\n * Create a new Instagram client\n * @param config - Client configuration\n */\n constructor(config: InstagramClientConfig) {\n this.config = {\n accessToken: config.accessToken,\n apiVersion: config.apiVersion || DEFAULT_API_VERSION,\n timeout: config.timeout || 30000,\n };\n\n this.http = new HttpClient({\n accessToken: this.config.accessToken,\n apiVersion: this.config.apiVersion,\n timeout: this.config.timeout,\n });\n\n // Initialize API modules\n // Note: User-specific APIs use 'me' as placeholder until setUserId is called\n const userId = 'me';\n\n this.auth = new AuthApi(this.http);\n this.users = new UsersApi(this.http, userId);\n this.media = new MediaApi(this.http);\n this.publishing = new PublishingApi(this.http, userId);\n this.messaging = new MessagingApi(this.http, userId);\n this.conversations = new ConversationsApi(this.http, userId);\n this.comments = new CommentsApi(this.http);\n this.hashtags = new HashtagsApi(this.http);\n this.insights = new InsightsApi(this.http, userId);\n this.welcomeFlows = new WelcomeFlowsApi(this.http, userId);\n this.messengerProfile = new MessengerProfileApi(this.http, userId);\n this.oembed = new OEmbedApi(this.http);\n this.webhooks = new WebhooksApi(this.http, userId);\n }\n\n /**\n * Get the current user ID\n * Fetches from API if not cached\n */\n async getUserId(): Promise<string> {\n if (this.cachedUserId) {\n return this.cachedUserId;\n }\n\n const user = await this.auth.me('id');\n this.cachedUserId = user.id;\n return user.id;\n }\n\n /**\n * Update the access token\n * @param accessToken - New access token\n */\n setAccessToken(accessToken: string): void {\n this.http.setAccessToken(accessToken);\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): Readonly<Required<InstagramClientConfig>> {\n return { ...this.config };\n }\n\n /**\n * Get the API version\n */\n getApiVersion(): string {\n return this.config.apiVersion;\n }\n}\n","import crypto from 'crypto';\nimport { WebhookPayload } from '../types/webhooks';\n\nexport class InstagramWebhooks {\n /**\n * Verify that the webhook request came from Meta.\n * Calculates SHA256 HMAC of the raw body using the App Secret.\n * \n * @param body Raw request body as string\n * @param signature Signature from X-Hub-Signature-256 header (e.g., \"sha256=...\")\n * @param appSecret Your Instagram App Secret\n * @returns true if signature is valid\n */\n static verifySignature(body: string, signature: string, appSecret: string): boolean {\n if (!signature || !signature.startsWith('sha256=')) {\n return false;\n }\n\n const expectedSignature = 'sha256=' + crypto\n .createHmac('sha256', appSecret)\n .update(body)\n .digest('hex');\n\n // Timing-safe comparison\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSignature)\n );\n }\n\n /**\n * Type guard and parser for webhook payloads.\n * \n * @param body Parsed JSON body\n * @returns Typed WebhookPayload or throws error\n */\n static parsePayload(body: any): WebhookPayload {\n if (body?.object !== 'instagram' || !Array.isArray(body?.entry)) {\n throw new Error('Invalid Instagram webhook payload');\n }\n return body as WebhookPayload;\n }\n}\n","/**\n * User Types for Instagram Graph API SDK\n */\n\nimport { PaginatedResponse } from './common';\nimport { IGMedia } from './media';\n\n/**\n * Instagram User account type\n */\nexport type IGAccountType = 'BUSINESS' | 'MEDIA_CREATOR' | 'PERSONAL';\n\n/**\n * Instagram User profile fields\n */\nexport interface IGUser {\n /** The User's ID */\n id: string;\n /** The User's account type */\n account_type?: IGAccountType;\n /** The User's biography */\n biography?: string;\n /** The number of followers */\n followers_count?: number;\n /** The number of accounts following */\n follows_count?: number;\n /** The number of media objects */\n media_count?: number;\n /** The User's username */\n username?: string;\n /** The User's name */\n name?: string;\n /** The User's profile picture URL */\n profile_picture_url?: string;\n /** The User's website */\n website?: string;\n /** Instagram user ID */\n ig_id?: number;\n}\n\n/**\n * Available fields for IGUser\n */\nexport const IG_USER_FIELDS = [\n 'id',\n 'account_type',\n 'biography',\n 'followers_count',\n 'follows_count',\n 'media_count',\n 'username',\n 'name',\n 'profile_picture_url',\n 'website',\n 'ig_id',\n] as const;\n\nexport type IGUserField = (typeof IG_USER_FIELDS)[number];\n\n/**\n * Business Discovery response\n */\nexport interface BusinessDiscovery {\n business_discovery: Partial<IGUser> & {\n media?: PaginatedResponse<IGMedia>;\n };\n id: string;\n}\n\n/**\n * Content publishing limit\n */\nexport interface ContentPublishingLimit {\n quota_usage: number;\n config: {\n quota_total: number;\n quota_duration: number;\n };\n}\n\n/**\n * User mentions response\n */\nexport interface UserMention {\n id: string;\n timestamp?: string;\n caption?: string;\n media_type?: string;\n media_url?: string;\n permalink?: string;\n username?: string;\n}\n\n/**\n * Recently searched hashtag\n */\nexport interface RecentlySearchedHashtag {\n id: string;\n name?: string;\n}\n\n/**\n * Available catalog\n */\nexport interface AvailableCatalog {\n catalog_id: string;\n catalog_name?: string;\n shop_name?: string;\n product_count?: number;\n}\n\n/**\n * Catalog product\n */\nexport interface CatalogProduct {\n product_id: string;\n merchant_id?: string;\n product_name?: string;\n image_url?: string;\n retailer_id?: string;\n review_status?: string;\n is_checkout_flow?: boolean;\n}\n\n/**\n * User profile request options\n */\nexport interface GetUserProfileOptions {\n fields?: IGUserField[];\n}\n\n/**\n * User media request options\n */\nexport interface GetUserMediaOptions {\n fields?: string[];\n limit?: number;\n after?: string;\n before?: string;\n}\n\n/**\n * Business discovery options\n */\nexport interface BusinessDiscoveryOptions {\n username: string;\n fields?: string[];\n}\n","/**\n * Media Types for Instagram Graph API SDK\n */\n\nimport { PaginatedResponse } from './common';\n\n/**\n * Media type\n */\nexport type MediaType = 'IMAGE' | 'VIDEO' | 'CAROUSEL_ALBUM';\n\n/**\n * Media product type\n */\nexport type MediaProductType = 'FEED' | 'REELS' | 'STORY';\n\n/**\n * Instagram Media object\n */\nexport interface IGMedia {\n /** The Media's ID */\n id: string;\n /** Caption text */\n caption?: string;\n /** Media type */\n media_type?: MediaType;\n /** Media product type (FEED, REELS, STORY) */\n media_product_type?: MediaProductType;\n /** URL to the media */\n media_url?: string;\n /** Permalink to the media on Instagram */\n permalink?: string;\n /** Thumbnail URL (for videos) */\n thumbnail_url?: string;\n /** ISO 8601 timestamp */\n timestamp?: string;\n /** Username of the owner */\n username?: string;\n /** Like count */\n like_count?: number;\n /** Comments count */\n comments_count?: number;\n /** Is comments enabled */\n is_comment_enabled?: boolean;\n /** Is shared to feed */\n is_shared_to_feed?: boolean;\n /** Owner ID */\n owner?: { id: string };\n /** Shortcode */\n shortcode?: string;\n}\n\n/**\n * Available fields for IGMedia\n */\nexport const IG_MEDIA_FIELDS = [\n 'id',\n 'caption',\n 'media_type',\n 'media_product_type',\n 'media_url',\n 'permalink',\n 'thumbnail_url',\n 'timestamp',\n 'username',\n 'like_count',\n 'comments_count',\n 'is_comment_enabled',\n 'is_shared_to_feed',\n 'owner',\n 'shortcode',\n] as const;\n\nexport type IGMediaField = (typeof IG_MEDIA_FIELDS)[number];\n\n/**\n * Carousel child media\n */\nexport interface IGMediaChild {\n id: string;\n media_type?: MediaType;\n media_url?: string;\n timestamp?: string;\n}\n\n/**\n * Media collaborator\n */\nexport interface MediaCollaborator {\n id: string;\n username?: string;\n}\n\n/**\n * Product tag on media\n */\nexport interface ProductTag {\n product_id: string;\n merchant_id?: string;\n name?: string;\n image_url?: string;\n x?: number;\n y?: number;\n}\n\n/**\n * Media children response\n */\nexport type MediaChildrenResponse = PaginatedResponse<IGMediaChild>;\n\n/**\n * Get media options\n */\nexport interface GetMediaOptions {\n fields?: IGMediaField[];\n}\n\n/**\n * Get media children options\n */\nexport interface GetMediaChildrenOptions {\n fields?: string[];\n}\n","/**\n * Comment Types for Instagram Graph API SDK\n */\n\n/**\n * Instagram Comment\n */\nexport interface IGComment {\n /** Comment ID */\n id: string;\n /** Comment text */\n text?: string;\n /** Username of commenter */\n username?: string;\n /** ISO 8601 timestamp */\n timestamp?: string;\n /** Like count */\n like_count?: number;\n /** Is comment hidden */\n hidden?: boolean;\n /** User who posted the comment */\n from?: {\n id: string;\n username?: string;\n };\n /** Media this comment is on */\n media?: {\n id: string;\n };\n /** Parent comment (for replies) */\n parent_id?: string;\n /** Replies to this comment */\n replies?: {\n data: IGComment[];\n };\n}\n\n/**\n * Available fields for IGComment\n */\nexport const IG_COMMENT_FIELDS = [\n 'id',\n 'text',\n 'username',\n 'timestamp',\n 'like_count',\n 'hidden',\n 'from',\n 'media',\n 'parent_id',\n 'replies',\n] as const;\n\nexport type IGCommentField = (typeof IG_COMMENT_FIELDS)[number];\n\n/**\n * Get comments options\n */\nexport interface GetCommentsOptions {\n fields?: IGCommentField[];\n limit?: number;\n after?: string;\n}\n\n/**\n * Reply to comment options\n */\nexport interface ReplyToCommentOptions {\n message: string;\n}\n\n/**\n * Update comment options (hide/unhide)\n */\nexport interface UpdateCommentOptions {\n hide: boolean;\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "instagram-graph-api-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"author": "Talha Ansari",
|
|
5
|
+
"description": "Type-safe TypeScript SDK for Instagram Graph API with Instagram Login",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.mjs",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/talha-ansarii/Instagram-graph-api-sdk"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsup",
|
|
25
|
+
"dev": "tsup --watch",
|
|
26
|
+
"test": "vitest",
|
|
27
|
+
"test:coverage": "vitest --coverage",
|
|
28
|
+
"lint": "eslint src --ext .ts",
|
|
29
|
+
"docs:generate": "typedoc",
|
|
30
|
+
"prepublishOnly": "npm run build"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"instagram",
|
|
34
|
+
"instagram-api",
|
|
35
|
+
"instagram-graph-api",
|
|
36
|
+
"meta",
|
|
37
|
+
"social-media",
|
|
38
|
+
"sdk",
|
|
39
|
+
"typescript"
|
|
40
|
+
],
|
|
41
|
+
"license": "Apache-2.0",
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"axios": "^1.6.7"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^20.11.16",
|
|
47
|
+
"dotenv": "^17.2.3",
|
|
48
|
+
"tsup": "^8.0.1",
|
|
49
|
+
"tsx": "^4.21.0",
|
|
50
|
+
"typedoc": "^0.28.16",
|
|
51
|
+
"typedoc-plugin-markdown": "^4.9.0",
|
|
52
|
+
"typescript": "^5.3.3",
|
|
53
|
+
"vitest": "^1.2.2"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=18.0.0"
|
|
57
|
+
}
|
|
58
|
+
}
|