ticketnation-sdk 1.1.1 → 1.1.2

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/dist/index.d.mts CHANGED
@@ -913,7 +913,7 @@ declare class Ticketnation {
913
913
  * @param config.retries - Retry count on 5xx errors (default: 2)
914
914
  * @param config.debug - Log requests with redacted API key (default: false)
915
915
  */
916
- constructor(config: TicketnationConfig);
916
+ constructor(config?: TicketnationConfig);
917
917
  /**
918
918
  * Get information about your API key and organization.
919
919
  * Useful for verifying your key is correctly configured.
package/dist/index.d.ts CHANGED
@@ -913,7 +913,7 @@ declare class Ticketnation {
913
913
  * @param config.retries - Retry count on 5xx errors (default: 2)
914
914
  * @param config.debug - Log requests with redacted API key (default: false)
915
915
  */
916
- constructor(config: TicketnationConfig);
916
+ constructor(config?: TicketnationConfig);
917
917
  /**
918
918
  * Get information about your API key and organization.
919
919
  * Useful for verifying your key is correctly configured.
package/dist/index.js CHANGED
@@ -722,9 +722,9 @@ var Ticketnation = class {
722
722
  * @param config.debug - Log requests with redacted API key (default: false)
723
723
  */
724
724
  constructor(config) {
725
- if (!config.apiKey) {
725
+ if (!config || !config.apiKey) {
726
726
  throw new Error(
727
- "Ticketnation SDK requires an apiKey. Get one from Organizer Dashboard > Settings > API Keys."
727
+ "Ticketnation SDK requires an apiKey. Usage: new Ticketnation({ apiKey: process.env.TICKETNATION_API_KEY }). Get a key from Organizer Dashboard > Settings > API Keys."
728
728
  );
729
729
  }
730
730
  this.client = new HttpClient({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/validate.ts","../src/utils/price.ts","../src/resources/events.ts","../src/resources/tickets.ts","../src/resources/orders.ts","../src/resources/venues.ts","../src/resources/webhooks.ts","../src/resources/performers.ts","../src/resources/schedules.ts","../src/resources/brands.ts","../src/utils/pagination.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ApiErrorBody } from './types';\n\nconst SCOPE_HINTS: Record<string, string> = {\n 'events:read': 'tn.events.list(), tn.events.get(), tn.venues.search()',\n 'events:write': 'tn.events.create(), tn.events.publish(), tn.performers, tn.schedules, tn.brands',\n 'tickets:read': 'tn.tickets.list(), tn.tickets.get()',\n 'tickets:write': 'tn.tickets.create(), tn.tickets.markSoldOut()',\n 'orders:read': 'tn.orders.list(), tn.orders.get()',\n 'webhooks:manage': 'tn.webhooks.create(), tn.webhooks.list()',\n};\n\n/**\n * Error thrown by the Ticketnation SDK for all API and network errors.\n *\n * @example\n * ```ts\n * try {\n * await tn.events.get('nonexistent');\n * } catch (error) {\n * if (error instanceof TicketnationError) {\n * console.log(error.code); // 'NOT_FOUND'\n * console.log(error.status); // 404\n * console.log(error.message); // 'Event not found: nonexistent'\n * console.log(error.requestId); // 'req_abc123' (for support)\n * }\n * }\n * ```\n */\nexport class TicketnationError extends Error {\n /** Machine-readable error code (e.g., 'NOT_FOUND', 'VALIDATION_ERROR', 'RATE_LIMITED') */\n readonly code: string;\n /** HTTP status code (0 for network/timeout errors) */\n readonly status: number;\n /** Unique request ID for debugging (include in support tickets) */\n readonly requestId: string | null;\n /** Field-level validation errors (only for VALIDATION_ERROR) */\n readonly details: Array<{ field: string; message: string }> | undefined;\n /** Suggested fix for common errors */\n readonly hint: string | null;\n\n constructor(\n message: string,\n opts: {\n code: string;\n status: number;\n requestId?: string;\n details?: Array<{ field: string; message: string }>;\n },\n ) {\n super(message);\n this.name = 'TicketnationError';\n this.code = opts.code;\n this.status = opts.status;\n this.requestId = opts.requestId ?? null;\n this.details = opts.details;\n this.hint = TicketnationError.getHint(opts.code, opts.status, message);\n }\n\n static fromResponse(status: number, body: { error: ApiErrorBody; requestId?: string }): TicketnationError {\n return new TicketnationError(body.error.message, {\n code: body.error.code,\n status,\n requestId: body.requestId,\n details: body.error.details,\n });\n }\n\n private static getHint(code: string, status: number, message: string): string | null {\n if (code === 'UNAUTHORIZED') {\n return 'Check your API key. Get one from Organizer Dashboard > Settings > API Keys.';\n }\n if (code === 'SCOPE_REQUIRED' || (code === 'FORBIDDEN' && status === 403)) {\n // Try to extract scope from message\n for (const [scope, methods] of Object.entries(SCOPE_HINTS)) {\n if (message.includes(scope)) {\n return `Your API key needs the \"${scope}\" scope for: ${methods}. Update it in Settings > API Keys.`;\n }\n }\n return 'Your API key lacks the required scope. Update it in Organizer Dashboard > Settings > API Keys.';\n }\n if (code === 'RATE_LIMITED') {\n return 'Too many requests. The SDK does NOT auto-retry on 429. Wait and try again.';\n }\n if (code === 'VALIDATION_ERROR') {\n return 'Check the \"details\" property for field-level errors.';\n }\n return null;\n }\n\n /** Serialize error for logging or API responses. */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n status: this.status,\n message: this.message,\n requestId: this.requestId,\n details: this.details,\n hint: this.hint,\n };\n }\n\n /** Human-readable error summary. */\n toString(): string {\n let str = `TicketnationError [${this.code}] (${this.status}): ${this.message}`;\n if (this.requestId) str += ` (requestId: ${this.requestId})`;\n if (this.hint) str += `\\n Hint: ${this.hint}`;\n return str;\n }\n}\n","import { TicketnationError } from './errors';\n\nexport interface ClientConfig {\n apiKey: string;\n baseUrl: string;\n timeout: number;\n retries: number;\n debug: boolean;\n}\n\nexport class HttpClient {\n private readonly config: ClientConfig;\n\n constructor(config: ClientConfig) {\n this.config = config;\n }\n\n async request<T>(method: string, path: string, opts?: { body?: unknown; params?: Record<string, unknown> }): Promise<T> {\n const url = this.buildUrl(path, opts?.params);\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.config.retries; attempt++) {\n if (attempt > 0) {\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\n await this.sleep(delay);\n if (this.config.debug) {\n console.log(`[Ticketnation SDK] Retry attempt ${attempt}/${this.config.retries} for ${method} ${path}`);\n }\n }\n\n try {\n const response = await this.doRequest(method, url, opts?.body);\n return response as T;\n } catch (error) {\n lastError = error as Error;\n if (error instanceof TicketnationError && error.status < 500) {\n throw error;\n }\n }\n }\n\n throw lastError;\n }\n\n private async doRequest(method: string, url: string, body?: unknown): Promise<unknown> {\n if (this.config.debug) {\n const redactedKey = this.config.apiKey.slice(0, 6) + '...' + this.config.apiKey.slice(-4);\n console.log(`[Ticketnation SDK] ${method} ${url} (key: ${redactedKey})`);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const headers: Record<string, string> = {\n 'api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'User-Agent': 'ticketnation-sdk/1.0.2',\n };\n\n const init: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body && (method === 'POST' || method === 'PATCH' || method === 'PUT')) {\n init.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n throw new TicketnationError(`HTTP ${response.status}: ${response.statusText}`, {\n code: 'HTTP_ERROR',\n status: response.status,\n });\n }\n\n const parsed = errorBody as { error?: { code: string; message: string; details?: Array<{ field: string; message: string }> }; requestId?: string };\n if (parsed.error) {\n throw TicketnationError.fromResponse(response.status, parsed as { error: { code: string; message: string }; requestId?: string });\n }\n\n throw new TicketnationError(`HTTP ${response.status}: ${response.statusText}`, {\n code: 'HTTP_ERROR',\n status: response.status,\n });\n }\n\n if (response.status === 204) {\n return {};\n }\n\n return await response.json();\n } catch (error) {\n if (error instanceof TicketnationError) throw error;\n\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw new TicketnationError(`Request timed out after ${this.config.timeout}ms`, {\n code: 'TIMEOUT',\n status: 0,\n });\n }\n\n throw new TicketnationError(`Network error: ${(error as Error).message}`, {\n code: 'NETWORK_ERROR',\n status: 0,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const base = this.config.baseUrl.replace(/\\/$/, '');\n const url = new URL(`${base}${path}`);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * Client-side validation helpers.\n * These catch common mistakes before making an API call.\n */\n\nexport function required(value: unknown, fieldName: string): void {\n if (value === undefined || value === null || value === '') {\n throw new Error(`\"${fieldName}\" is required`);\n }\n}\n\nexport function requiredString(value: unknown, fieldName: string): void {\n required(value, fieldName);\n if (typeof value !== 'string') {\n throw new Error(`\"${fieldName}\" must be a string, got ${typeof value}`);\n }\n}\n\nexport function validDateString(value: unknown, fieldName: string): void {\n requiredString(value, fieldName);\n const date = new Date(value as string);\n if (isNaN(date.getTime())) {\n throw new Error(`\"${fieldName}\" must be a valid ISO 8601 date string, got \"${value}\"`);\n }\n}\n\nexport function validUrl(value: unknown, fieldName: string): void {\n if (value === undefined || value === null) return;\n if (typeof value !== 'string') {\n throw new Error(`\"${fieldName}\" must be a string URL, got ${typeof value}`);\n }\n try {\n new URL(value);\n } catch {\n throw new Error(`\"${fieldName}\" must be a valid URL, got \"${value}\"`);\n }\n}\n\nexport function positiveInt(value: unknown, fieldName: string): void {\n if (value === undefined || value === null) return;\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {\n throw new Error(`\"${fieldName}\" must be a positive integer, got ${value}`);\n }\n}\n","/**\n * Format a price value to a human-readable Philippine Peso string.\n *\n * @example\n * ```ts\n * formatPeso(1000) // \"₱1,000.00\"\n * formatPeso(3500) // \"₱3,500.00\"\n * formatPeso(0) // \"Free\"\n * ```\n */\nexport function formatPeso(amount: number): string {\n if (amount === 0) return 'Free';\n return `₱${amount.toLocaleString('en-PH', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n}\n\n/**\n * Validate that a price is a non-negative integer.\n * Ticketnation prices are whole pesos (e.g., 1000 = ₱1,000).\n *\n * @throws Error if price is invalid\n */\nexport function validatePrice(price: number, fieldName = 'price'): void {\n if (typeof price !== 'number' || !Number.isFinite(price)) {\n throw new Error(`${fieldName} must be a finite number, got ${typeof price}`);\n }\n if (price < 0) {\n throw new Error(`${fieldName} must be non-negative, got ${price}`);\n }\n if (!Number.isInteger(price)) {\n throw new Error(`${fieldName} must be a whole number (pesos, not centavos). Got ${price} — did you mean ${Math.round(price)}?`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Event,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n DataResponse,\n PaginatedResponse,\n DeletedResponse,\n} from '../types';\nimport { required, requiredString, validDateString, validUrl } from '../utils/validate';\nimport { validatePrice } from '../utils/price';\n\n/**\n * Manage events on the Ticketnation marketplace.\n *\n * @example\n * ```ts\n * // Create and publish in one call\n * const event = await tn.events.createAndPublish({\n * name: 'Summer Fest',\n * dateTime: '2026-06-15T18:00:00Z',\n * tickets: [{ name: 'GA', price: 1000, quantity: 500, published: true }],\n * });\n * ```\n */\nexport class EventsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a new event in DRAFT status.\n * Optionally include inline ticket types, gallery images, and venue.\n *\n * @param params - Event creation parameters\n * @returns The created event (status: DRAFT)\n *\n * @example\n * ```ts\n * const event = await tn.events.create({\n * name: 'Summer Music Fest',\n * dateTime: '2026-06-15T18:00:00Z',\n * venueId: 'uuid',\n * imageUrl: 'https://example.com/banner.jpg',\n * galleryUrls: ['https://example.com/photo1.jpg'],\n * tickets: [\n * { name: 'GA', price: 1000, quantity: 500, published: true },\n * { name: 'VIP', price: 3500, quantity: 50, published: true },\n * ],\n * });\n * ```\n */\n async create(params: CreateEventParams): Promise<Event> {\n requiredString(params.name, 'name');\n validDateString(params.dateTime, 'dateTime');\n if (params.endDateTime) validDateString(params.endDateTime, 'endDateTime');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n if (params.venueId) requiredString(params.venueId, 'venueId');\n if (params.galleryUrls) {\n params.galleryUrls.forEach((url, i) => validUrl(url, `galleryUrls[${i}]`));\n }\n if (params.tickets) {\n params.tickets.forEach((t, i) => {\n requiredString(t.name, `tickets[${i}].name`);\n required(t.price, `tickets[${i}].price`);\n validatePrice(t.price, `tickets[${i}].price`);\n required(t.quantity, `tickets[${i}].quantity`);\n });\n }\n\n const res = await this.client.request<DataResponse<Event>>('POST', '/open-api/v1/events', { body: params });\n return res.data;\n }\n\n /**\n * Create an event and immediately publish it.\n * Convenience method that calls create() then publish().\n *\n * @returns The published event (status: PUBLISHED)\n */\n async createAndPublish(params: CreateEventParams): Promise<Event> {\n const event = await this.create(params);\n return this.publish(event.id);\n }\n\n /**\n * List events for your organization (paginated).\n *\n * @example\n * ```ts\n * const { data, meta } = await tn.events.list({ status: 'PUBLISHED', page: 1 });\n * console.log(`${meta.total} published events`);\n * ```\n */\n async list(params?: ListEventsParams): Promise<PaginatedResponse<Event>> {\n return this.client.request<PaginatedResponse<Event>>('GET', '/open-api/v1/events', {\n params: params ? { page: params.page, take: params.take, status: params.status, search: params.search } : undefined,\n });\n }\n\n /**\n * Get a single event by UUID or slug.\n *\n * @example\n * ```ts\n * const event = await tn.events.get('summer-music-fest');\n * // or\n * const event = await tn.events.get('uuid-event-id');\n * ```\n */\n async get(idOrSlug: string): Promise<Event> {\n requiredString(idOrSlug, 'idOrSlug');\n const res = await this.client.request<DataResponse<Event>>('GET', `/open-api/v1/events/${encodeURIComponent(idOrSlug)}`);\n return res.data;\n }\n\n /**\n * Update event fields. Only provided fields are changed.\n * Cannot update inline tickets — use `tn.tickets` methods instead.\n */\n async update(eventId: string, params: UpdateEventParams): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('PATCH', `/open-api/v1/events/${eventId}`, { body: params });\n return res.data;\n }\n\n /**\n * Publish a DRAFT event to the marketplace.\n * The event becomes visible to buyers on ticketnation.ph.\n */\n async publish(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/publish`);\n return res.data;\n }\n\n /**\n * Revert a PUBLISHED event back to DRAFT.\n * Removes it from the public marketplace.\n */\n async unpublish(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/unpublish`);\n return res.data;\n }\n\n /**\n * Archive an event. Hidden from marketplace but data is preserved.\n */\n async archive(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/archive`);\n return res.data;\n }\n\n /**\n * Delete a DRAFT event. Only works if no tickets have been sold.\n * Published or archived events must be unpublished first.\n */\n async delete(eventId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Ticket,\n CreateTicketParams,\n UpdateTicketParams,\n DataResponse,\n DeletedResponse,\n} from '../types';\nimport { required, requiredString } from '../utils/validate';\nimport { validatePrice } from '../utils/price';\n\n/**\n * Manage ticket types for events.\n * Prices are in whole pesos (e.g., 1000 = ₱1,000).\n *\n * @example\n * ```ts\n * const ticket = await tn.tickets.create(eventId, {\n * name: 'VIP Pass',\n * price: 3500, // ₱3,500\n * quantity: 100,\n * published: true, // immediately available for sale\n * });\n * ```\n */\nexport class TicketsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a ticket type for an event.\n * Individual ticket inventory is auto-generated based on quantity.\n *\n * @param eventId - The event UUID\n * @param params - Ticket type details\n * @returns The created ticket type\n */\n async create(eventId: string, params: CreateTicketParams): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n required(params.price, 'price');\n validatePrice(params.price, 'price');\n required(params.quantity, 'quantity');\n if (params.quantity < 1) throw new Error('\"quantity\" must be at least 1');\n\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets`, { body: params });\n return res.data;\n }\n\n /**\n * List all ticket types for an event.\n */\n async list(eventId: string): Promise<Ticket[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Ticket[]>>('GET', `/open-api/v1/events/${eventId}/tickets`);\n return res.data;\n }\n\n /**\n * Get a single ticket type by ID.\n */\n async get(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('GET', `/open-api/v1/events/${eventId}/tickets/${ticketId}`);\n return res.data;\n }\n\n /**\n * Update a ticket type. Price and quantity changes are validated\n * against business rules (e.g., can't reduce below sold count).\n */\n async update(eventId: string, ticketId: string, params: UpdateTicketParams): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n if (params.price !== undefined) validatePrice(params.price, 'price');\n\n const res = await this.client.request<DataResponse<Ticket>>('PATCH', `/open-api/v1/events/${eventId}/tickets/${ticketId}`, { body: params });\n return res.data;\n }\n\n /**\n * Make a ticket type available for purchase.\n * The parent event must also be published for tickets to appear.\n */\n async publish(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets/${ticketId}/publish`);\n return res.data;\n }\n\n /**\n * Mark a ticket type as sold out (sets remainingQuantity to 0).\n * To restore availability, use update() to set a new quantity.\n */\n async markSoldOut(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets/${ticketId}/sold-out`);\n return res.data;\n }\n\n /**\n * Delete a ticket type. Only works if no tickets have been sold.\n */\n async delete(eventId: string, ticketId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/tickets/${ticketId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Order,\n ListOrdersParams,\n DataResponse,\n PaginatedResponse,\n} from '../types';\nimport { requiredString } from '../utils/validate';\n\n/**\n * Read-only access to orders for your events.\n * Orders are created when buyers purchase tickets on ticketnation.ph.\n *\n * @example\n * ```ts\n * const { data: orders } = await tn.orders.list(eventId, { status: 'COMPLETED' });\n * for (const order of orders) {\n * console.log(`#${order.orderNumber}: ${order.user.firstName} — ₱${order.total}`);\n * }\n * ```\n */\nexport class OrdersResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * List orders for an event (paginated).\n * Filter by status to get only completed, pending, or refunded orders.\n *\n * @param eventId - The event UUID\n * @param params - Pagination and filter options\n */\n async list(eventId: string, params?: ListOrdersParams): Promise<PaginatedResponse<Order>> {\n requiredString(eventId, 'eventId');\n return this.client.request<PaginatedResponse<Order>>('GET', `/open-api/v1/events/${eventId}/orders`, {\n params: params ? { page: params.page, take: params.take, status: params.status } : undefined,\n });\n }\n\n /**\n * Get a single order by ID. Includes line items and payment details.\n *\n * @param orderId - The order UUID\n */\n async get(orderId: string): Promise<Order> {\n requiredString(orderId, 'orderId');\n const res = await this.client.request<DataResponse<Order>>('GET', `/open-api/v1/orders/${orderId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Venue,\n SearchVenuesParams,\n PaginatedResponse,\n} from '../types';\nimport { requiredString } from '../utils/validate';\n\n/**\n * Search public venues on Ticketnation.\n * Use the returned venue ID when creating events with a physical location.\n *\n * @example\n * ```ts\n * const { data: venues } = await tn.venues.search({ query: 'Mall of Asia' });\n * const event = await tn.events.create({\n * name: 'Concert',\n * dateTime: '2026-06-15T18:00:00Z',\n * venueId: venues[0].id, // ← link the venue\n * });\n * ```\n */\nexport class VenuesResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Search venues by name (case-insensitive substring match).\n *\n * @param params - Search query and pagination\n * @returns Paginated list of matching venues with address and coordinates\n */\n async search(params: SearchVenuesParams): Promise<PaginatedResponse<Venue>> {\n requiredString(params.query, 'query');\n return this.client.request<PaginatedResponse<Venue>>('GET', '/open-api/v1/venues/search', {\n params: { query: params.query, page: params.page, take: params.take },\n });\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Webhook,\n WebhookWithSecret,\n CreateWebhookParams,\n UpdateWebhookParams,\n DataResponse,\n PaginatedResponse,\n DeletedResponse,\n} from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Delivery record for a webhook event. */\nexport interface WebhookDelivery {\n id: string;\n eventType: string;\n statusCode: number | null;\n success: boolean;\n attempts: number;\n createdAt: string;\n}\n\n/** Result of testing a webhook endpoint. */\nexport interface WebhookTestResult {\n success: boolean;\n statusCode: number | null;\n message: string;\n}\n\n/**\n * Manage webhook endpoints for real-time notifications.\n *\n * @example\n * ```ts\n * // Create a webhook — store the secret securely!\n * const webhook = await tn.webhooks.create({\n * url: 'https://api.example.com/webhooks/ticketnation',\n * events: ['order.completed', 'event.sold_out'],\n * });\n * console.log(webhook.secret); // whsec_... (only shown once)\n *\n * // Test it\n * const result = await tn.webhooks.test(webhook.id);\n * console.log(result.success); // true\n * ```\n */\nexport class WebhooksResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a webhook endpoint.\n * The response includes a `secret` field for HMAC signature verification.\n *\n * **Important:** The secret is only returned on creation. Store it securely.\n */\n async create(params: CreateWebhookParams): Promise<WebhookWithSecret> {\n validUrl(params.url, 'url');\n if (!params.events || params.events.length === 0) {\n throw new Error('\"events\" must contain at least one event type (e.g., \"order.completed\")');\n }\n const res = await this.client.request<DataResponse<WebhookWithSecret>>('POST', '/open-api/v1/webhooks', { body: params });\n return res.data;\n }\n\n /** List all webhooks for your API key. */\n async list(): Promise<Webhook[]> {\n const res = await this.client.request<DataResponse<Webhook[]>>('GET', '/open-api/v1/webhooks');\n return res.data;\n }\n\n /** Update a webhook's URL, events, or active status. */\n async update(webhookId: string, params: UpdateWebhookParams): Promise<Webhook> {\n requiredString(webhookId, 'webhookId');\n if (params.url) validUrl(params.url, 'url');\n const res = await this.client.request<DataResponse<Webhook>>('PATCH', `/open-api/v1/webhooks/${webhookId}`, { body: params });\n return res.data;\n }\n\n /** Delete a webhook and its delivery history. */\n async delete(webhookId: string): Promise<DeletedResponse> {\n requiredString(webhookId, 'webhookId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/webhooks/${webhookId}`);\n return res.data;\n }\n\n /** Send a test payload to verify your webhook endpoint works. */\n async test(webhookId: string): Promise<WebhookTestResult> {\n requiredString(webhookId, 'webhookId');\n const res = await this.client.request<DataResponse<WebhookTestResult>>('POST', `/open-api/v1/webhooks/${webhookId}/test`);\n return res.data;\n }\n\n /**\n * View delivery history for a webhook (paginated).\n * Useful for debugging failed deliveries.\n */\n async deliveries(webhookId: string, params?: { page?: number; take?: number }): Promise<PaginatedResponse<WebhookDelivery>> {\n requiredString(webhookId, 'webhookId');\n return this.client.request<PaginatedResponse<WebhookDelivery>>('GET', `/open-api/v1/webhooks/${webhookId}/deliveries`, {\n params: params ? { page: params.page, take: params.take } : undefined,\n });\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Parameters for creating a performer. */\nexport interface CreatePerformerParams {\n /** Performer/artist name */\n name: string;\n /** Bio or description */\n description?: string;\n /** Performer type */\n type?: 'SOLO' | 'GROUP' | 'DJ' | 'BAND' | 'SPEAKER' | 'HOST' | 'COMEDIAN' | 'OTHER';\n /** Public URL to performer image (hosted on your end) */\n imageUrl?: string;\n /** Facebook profile URL */\n facebook?: string;\n /** YouTube channel URL */\n youtube?: string;\n /** Instagram profile URL */\n instagram?: string;\n}\n\n/** Performer details. */\nexport interface Performer {\n id: string;\n name: string;\n description: string | null;\n type: string;\n slug: string | null;\n facebook: string | null;\n youtube: string | null;\n instagram: string | null;\n image: { id: string; url: string | null } | null;\n}\n\n/**\n * Manage performers/artists/speakers for events.\n *\n * @example\n * ```ts\n * await tn.performers.create(eventId, {\n * name: 'DJ Shadow',\n * type: 'SOLO',\n * imageUrl: 'https://example.com/dj-shadow.jpg',\n * });\n *\n * const performers = await tn.performers.list(eventId);\n * ```\n */\nexport class PerformersResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a performer to an event.\n * If `imageUrl` is provided, it will be displayed on the event page.\n *\n * @param eventId - The event UUID\n * @param params - Performer details\n */\n async create(eventId: string, params: CreatePerformerParams): Promise<Performer> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n const res = await this.client.request<DataResponse<Performer>>('POST', `/open-api/v1/events/${eventId}/performers`, { body: params });\n return res.data;\n }\n\n /** List all performers for an event. */\n async list(eventId: string): Promise<Performer[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Performer[]>>('GET', `/open-api/v1/events/${eventId}/performers`);\n return res.data;\n }\n\n /**\n * Remove a performer from an event.\n * This unlinks the performer — it doesn't delete the performer record.\n */\n async remove(eventId: string, performerId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(performerId, 'performerId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/performers/${performerId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validDateString } from '../utils/validate';\n\n/** Parameters for creating a schedule item. */\nexport interface CreateScheduleParams {\n /** Schedule item title (e.g., \"Doors Open\", \"DJ Shadow Live\") */\n title: string;\n /** Description of this schedule block */\n description?: string;\n /** Start time (ISO 8601) */\n startTime: string;\n /** End time (ISO 8601) */\n endTime: string;\n /** Emoji or icon name */\n icon?: string;\n /** Hex color code (e.g., \"#4f46e5\") */\n color?: string;\n /** Sort position (auto-assigned if not provided) */\n sortOrder?: number;\n /** Link this schedule item to a performer */\n performerId?: string;\n}\n\n/** Parameters for updating a schedule item. All fields optional. */\nexport interface UpdateScheduleParams {\n title?: string;\n description?: string;\n startTime?: string;\n endTime?: string;\n icon?: string;\n color?: string;\n sortOrder?: number;\n performerId?: string;\n}\n\n/** Schedule item details. */\nexport interface Schedule {\n id: string;\n title: string;\n description: string | null;\n startTime: string;\n endTime: string;\n icon: string | null;\n color: string | null;\n sortOrder: number;\n performerId: string | null;\n performer: { id: string; name: string } | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Manage event schedule / timeline items.\n *\n * @example\n * ```ts\n * // Create a full event schedule\n * await tn.schedules.create(eventId, {\n * title: 'Doors Open',\n * startTime: '2026-09-15T19:00:00Z',\n * endTime: '2026-09-15T19:30:00Z',\n * icon: '🎵',\n * });\n *\n * await tn.schedules.create(eventId, {\n * title: 'DJ Shadow Live',\n * startTime: '2026-09-15T21:00:00Z',\n * endTime: '2026-09-15T23:00:00Z',\n * performerId: performer.id, // link to a performer\n * });\n * ```\n */\nexport class SchedulesResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a schedule item to an event.\n *\n * @param eventId - The event UUID\n * @param params - Schedule item details\n */\n async create(eventId: string, params: CreateScheduleParams): Promise<Schedule> {\n requiredString(eventId, 'eventId');\n requiredString(params.title, 'title');\n validDateString(params.startTime, 'startTime');\n validDateString(params.endTime, 'endTime');\n const res = await this.client.request<DataResponse<Schedule>>('POST', `/open-api/v1/events/${eventId}/schedules`, { body: params });\n return res.data;\n }\n\n /** List all schedule items for an event, ordered by sortOrder. */\n async list(eventId: string): Promise<Schedule[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Schedule[]>>('GET', `/open-api/v1/events/${eventId}/schedules`);\n return res.data;\n }\n\n /** Update a schedule item. Only provided fields are changed. */\n async update(eventId: string, scheduleId: string, params: UpdateScheduleParams): Promise<Schedule> {\n requiredString(eventId, 'eventId');\n requiredString(scheduleId, 'scheduleId');\n if (params.startTime) validDateString(params.startTime, 'startTime');\n if (params.endTime) validDateString(params.endTime, 'endTime');\n const res = await this.client.request<DataResponse<Schedule>>('PATCH', `/open-api/v1/events/${eventId}/schedules/${scheduleId}`, { body: params });\n return res.data;\n }\n\n /** Delete a schedule item. */\n async remove(eventId: string, scheduleId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(scheduleId, 'scheduleId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/schedules/${scheduleId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Parameters for creating a brand partner. */\nexport interface CreateBrandParams {\n /** Brand/sponsor name */\n name: string;\n /** Brand description */\n description?: string;\n /** Brand website URL */\n url?: string;\n /** Public URL to brand logo (hosted on your end) */\n imageUrl?: string;\n /** Display position (lower = first) */\n position?: number;\n}\n\n/** Brand partner details. */\nexport interface Brand {\n id: string;\n name: string;\n description: string | null;\n url: string | null;\n sponsorshipColor: string | null;\n image: { id: string; url: string | null } | null;\n position: number | null;\n}\n\n/**\n * Manage brand partners / sponsors for events.\n *\n * @example\n * ```ts\n * await tn.brands.create(eventId, {\n * name: 'Red Bull',\n * url: 'https://redbull.com',\n * imageUrl: 'https://example.com/redbull-logo.png',\n * });\n * ```\n */\nexport class BrandsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a brand partner to an event.\n * If a brand with the same name already exists in your org, it will be reused.\n *\n * @param eventId - The event UUID\n * @param params - Brand details\n */\n async create(eventId: string, params: CreateBrandParams): Promise<Brand> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n if (params.url) validUrl(params.url, 'url');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n const res = await this.client.request<DataResponse<Brand>>('POST', `/open-api/v1/events/${eventId}/brands`, { body: params });\n return res.data;\n }\n\n /** List all brand partners for an event. */\n async list(eventId: string): Promise<Brand[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Brand[]>>('GET', `/open-api/v1/events/${eventId}/brands`);\n return res.data;\n }\n\n /**\n * Remove a brand from an event.\n * This unlinks the brand — it doesn't delete the brand record.\n */\n async remove(eventId: string, brandId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(brandId, 'brandId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/brands/${brandId}`);\n return res.data;\n }\n}\n","import type { PaginatedResponse, PaginationParams } from '../types';\n\nexport async function* paginate<T>(\n fetchPage: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n initialParams?: PaginationParams,\n): AsyncGenerator<T[], void, undefined> {\n let page = initialParams?.page ?? 1;\n const take = initialParams?.take ?? 10;\n\n while (true) {\n const response = await fetchPage({ page, take });\n yield response.data;\n\n if (page >= response.meta.totalPages) {\n break;\n }\n page++;\n }\n}\n\nexport async function fetchAllPages<T>(\n fetchPage: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n initialParams?: PaginationParams,\n): Promise<T[]> {\n const all: T[] = [];\n for await (const batch of paginate(fetchPage, initialParams)) {\n all.push(...batch);\n }\n return all;\n}\n","import { HttpClient } from './client';\nimport { EventsResource } from './resources/events';\nimport { TicketsResource } from './resources/tickets';\nimport { OrdersResource } from './resources/orders';\nimport { VenuesResource } from './resources/venues';\nimport { WebhooksResource } from './resources/webhooks';\nimport { PerformersResource } from './resources/performers';\nimport { SchedulesResource } from './resources/schedules';\nimport { BrandsResource } from './resources/brands';\nimport type { TicketnationConfig, AccountInfo, DataResponse } from './types';\n\n/**\n * Ticketnation SDK — publish events, manage tickets, and receive orders programmatically.\n *\n * @example\n * ```ts\n * import { Ticketnation } from 'ticketnation-sdk';\n *\n * const tn = new Ticketnation({ apiKey: 'tn_live_...' });\n *\n * // Create and publish an event in one call\n * const event = await tn.events.createAndPublish({\n * name: 'Summer Fest 2026',\n * dateTime: '2026-06-15T18:00:00Z',\n * imageUrl: 'https://example.com/banner.jpg',\n * tickets: [\n * { name: 'GA', price: 1000, quantity: 500, published: true },\n * ],\n * });\n *\n * // Add performers and schedule\n * const dj = await tn.performers.create(event.id, { name: 'DJ Shadow', type: 'SOLO' });\n * await tn.schedules.create(event.id, {\n * title: 'DJ Shadow Live',\n * startTime: '2026-06-15T21:00:00Z',\n * endTime: '2026-06-15T23:00:00Z',\n * performerId: dj.id,\n * });\n *\n * // Check orders\n * const { data: orders } = await tn.orders.list(event.id);\n * ```\n *\n * @see https://docs.ticketnation.ph/developers/overview\n */\nexport class Ticketnation {\n /** Create, list, update, publish, and delete events. */\n readonly events: EventsResource;\n /** Create, list, update, and manage ticket types. Prices are in whole pesos. */\n readonly tickets: TicketsResource;\n /** Read-only access to orders placed by buyers. */\n readonly orders: OrdersResource;\n /** Search public venues by name. */\n readonly venues: VenuesResource;\n /** Manage webhook endpoints for real-time notifications. */\n readonly webhooks: WebhooksResource;\n /** Add and manage performers/artists/speakers for events. */\n readonly performers: PerformersResource;\n /** Create event schedule / timeline items. */\n readonly schedules: SchedulesResource;\n /** Add brand partners / sponsors to events. */\n readonly brands: BrandsResource;\n\n private readonly client: HttpClient;\n\n /**\n * Create a new Ticketnation SDK instance.\n *\n * @param config - SDK configuration\n * @param config.apiKey - Your API key from Organizer Dashboard > Settings > API Keys\n * @param config.baseUrl - API base URL (default: https://api.ticketnation.ph)\n * @param config.timeout - Request timeout in ms (default: 30000)\n * @param config.retries - Retry count on 5xx errors (default: 2)\n * @param config.debug - Log requests with redacted API key (default: false)\n */\n constructor(config: TicketnationConfig) {\n if (!config.apiKey) {\n throw new Error(\n 'Ticketnation SDK requires an apiKey. Get one from Organizer Dashboard > Settings > API Keys.',\n );\n }\n\n this.client = new HttpClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.ticketnation.ph',\n timeout: config.timeout ?? 30000,\n retries: config.retries ?? 2,\n debug: config.debug ?? false,\n });\n\n this.events = new EventsResource(this.client);\n this.tickets = new TicketsResource(this.client);\n this.orders = new OrdersResource(this.client);\n this.venues = new VenuesResource(this.client);\n this.webhooks = new WebhooksResource(this.client);\n this.performers = new PerformersResource(this.client);\n this.schedules = new SchedulesResource(this.client);\n this.brands = new BrandsResource(this.client);\n }\n\n /**\n * Get information about your API key and organization.\n * Useful for verifying your key is correctly configured.\n *\n * @returns API key details (name, scopes, expiry) and organization info\n *\n * @example\n * ```ts\n * const info = await tn.me();\n * console.log(`Org: ${info.organization.name}`);\n * console.log(`Scopes: ${info.apiKey.scopes.join(', ')}`);\n * ```\n */\n async me(): Promise<AccountInfo> {\n const res = await this.client.request<DataResponse<AccountInfo>>('GET', '/open-api/v1/me');\n return res.data;\n }\n}\n\n// Re-export everything\nexport { TicketnationError } from './errors';\nexport { paginate, fetchAllPages } from './utils/pagination';\nexport { formatPeso, validatePrice } from './utils/price';\nexport type * from './types';\nexport type { Performer, CreatePerformerParams } from './resources/performers';\nexport type { Schedule, CreateScheduleParams, UpdateScheduleParams } from './resources/schedules';\nexport type { Brand, CreateBrandParams } from './resources/brands';\nexport type { WebhookDelivery, WebhookTestResult } from './resources/webhooks';\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/validate.ts","../src/utils/price.ts","../src/resources/events.ts","../src/resources/tickets.ts","../src/resources/orders.ts","../src/resources/venues.ts","../src/resources/webhooks.ts","../src/resources/performers.ts","../src/resources/schedules.ts","../src/resources/brands.ts","../src/utils/pagination.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ApiErrorBody } from './types';\n\nconst SCOPE_HINTS: Record<string, string> = {\n 'events:read': 'tn.events.list(), tn.events.get(), tn.venues.search()',\n 'events:write': 'tn.events.create(), tn.events.publish(), tn.performers, tn.schedules, tn.brands',\n 'tickets:read': 'tn.tickets.list(), tn.tickets.get()',\n 'tickets:write': 'tn.tickets.create(), tn.tickets.markSoldOut()',\n 'orders:read': 'tn.orders.list(), tn.orders.get()',\n 'webhooks:manage': 'tn.webhooks.create(), tn.webhooks.list()',\n};\n\n/**\n * Error thrown by the Ticketnation SDK for all API and network errors.\n *\n * @example\n * ```ts\n * try {\n * await tn.events.get('nonexistent');\n * } catch (error) {\n * if (error instanceof TicketnationError) {\n * console.log(error.code); // 'NOT_FOUND'\n * console.log(error.status); // 404\n * console.log(error.message); // 'Event not found: nonexistent'\n * console.log(error.requestId); // 'req_abc123' (for support)\n * }\n * }\n * ```\n */\nexport class TicketnationError extends Error {\n /** Machine-readable error code (e.g., 'NOT_FOUND', 'VALIDATION_ERROR', 'RATE_LIMITED') */\n readonly code: string;\n /** HTTP status code (0 for network/timeout errors) */\n readonly status: number;\n /** Unique request ID for debugging (include in support tickets) */\n readonly requestId: string | null;\n /** Field-level validation errors (only for VALIDATION_ERROR) */\n readonly details: Array<{ field: string; message: string }> | undefined;\n /** Suggested fix for common errors */\n readonly hint: string | null;\n\n constructor(\n message: string,\n opts: {\n code: string;\n status: number;\n requestId?: string;\n details?: Array<{ field: string; message: string }>;\n },\n ) {\n super(message);\n this.name = 'TicketnationError';\n this.code = opts.code;\n this.status = opts.status;\n this.requestId = opts.requestId ?? null;\n this.details = opts.details;\n this.hint = TicketnationError.getHint(opts.code, opts.status, message);\n }\n\n static fromResponse(status: number, body: { error: ApiErrorBody; requestId?: string }): TicketnationError {\n return new TicketnationError(body.error.message, {\n code: body.error.code,\n status,\n requestId: body.requestId,\n details: body.error.details,\n });\n }\n\n private static getHint(code: string, status: number, message: string): string | null {\n if (code === 'UNAUTHORIZED') {\n return 'Check your API key. Get one from Organizer Dashboard > Settings > API Keys.';\n }\n if (code === 'SCOPE_REQUIRED' || (code === 'FORBIDDEN' && status === 403)) {\n // Try to extract scope from message\n for (const [scope, methods] of Object.entries(SCOPE_HINTS)) {\n if (message.includes(scope)) {\n return `Your API key needs the \"${scope}\" scope for: ${methods}. Update it in Settings > API Keys.`;\n }\n }\n return 'Your API key lacks the required scope. Update it in Organizer Dashboard > Settings > API Keys.';\n }\n if (code === 'RATE_LIMITED') {\n return 'Too many requests. The SDK does NOT auto-retry on 429. Wait and try again.';\n }\n if (code === 'VALIDATION_ERROR') {\n return 'Check the \"details\" property for field-level errors.';\n }\n return null;\n }\n\n /** Serialize error for logging or API responses. */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n status: this.status,\n message: this.message,\n requestId: this.requestId,\n details: this.details,\n hint: this.hint,\n };\n }\n\n /** Human-readable error summary. */\n toString(): string {\n let str = `TicketnationError [${this.code}] (${this.status}): ${this.message}`;\n if (this.requestId) str += ` (requestId: ${this.requestId})`;\n if (this.hint) str += `\\n Hint: ${this.hint}`;\n return str;\n }\n}\n","import { TicketnationError } from './errors';\n\nexport interface ClientConfig {\n apiKey: string;\n baseUrl: string;\n timeout: number;\n retries: number;\n debug: boolean;\n}\n\nexport class HttpClient {\n private readonly config: ClientConfig;\n\n constructor(config: ClientConfig) {\n this.config = config;\n }\n\n async request<T>(method: string, path: string, opts?: { body?: unknown; params?: Record<string, unknown> }): Promise<T> {\n const url = this.buildUrl(path, opts?.params);\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.config.retries; attempt++) {\n if (attempt > 0) {\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\n await this.sleep(delay);\n if (this.config.debug) {\n console.log(`[Ticketnation SDK] Retry attempt ${attempt}/${this.config.retries} for ${method} ${path}`);\n }\n }\n\n try {\n const response = await this.doRequest(method, url, opts?.body);\n return response as T;\n } catch (error) {\n lastError = error as Error;\n if (error instanceof TicketnationError && error.status < 500) {\n throw error;\n }\n }\n }\n\n throw lastError;\n }\n\n private async doRequest(method: string, url: string, body?: unknown): Promise<unknown> {\n if (this.config.debug) {\n const redactedKey = this.config.apiKey.slice(0, 6) + '...' + this.config.apiKey.slice(-4);\n console.log(`[Ticketnation SDK] ${method} ${url} (key: ${redactedKey})`);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const headers: Record<string, string> = {\n 'api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'User-Agent': 'ticketnation-sdk/1.0.2',\n };\n\n const init: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body && (method === 'POST' || method === 'PATCH' || method === 'PUT')) {\n init.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n throw new TicketnationError(`HTTP ${response.status}: ${response.statusText}`, {\n code: 'HTTP_ERROR',\n status: response.status,\n });\n }\n\n const parsed = errorBody as { error?: { code: string; message: string; details?: Array<{ field: string; message: string }> }; requestId?: string };\n if (parsed.error) {\n throw TicketnationError.fromResponse(response.status, parsed as { error: { code: string; message: string }; requestId?: string });\n }\n\n throw new TicketnationError(`HTTP ${response.status}: ${response.statusText}`, {\n code: 'HTTP_ERROR',\n status: response.status,\n });\n }\n\n if (response.status === 204) {\n return {};\n }\n\n return await response.json();\n } catch (error) {\n if (error instanceof TicketnationError) throw error;\n\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw new TicketnationError(`Request timed out after ${this.config.timeout}ms`, {\n code: 'TIMEOUT',\n status: 0,\n });\n }\n\n throw new TicketnationError(`Network error: ${(error as Error).message}`, {\n code: 'NETWORK_ERROR',\n status: 0,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const base = this.config.baseUrl.replace(/\\/$/, '');\n const url = new URL(`${base}${path}`);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * Client-side validation helpers.\n * These catch common mistakes before making an API call.\n */\n\nexport function required(value: unknown, fieldName: string): void {\n if (value === undefined || value === null || value === '') {\n throw new Error(`\"${fieldName}\" is required`);\n }\n}\n\nexport function requiredString(value: unknown, fieldName: string): void {\n required(value, fieldName);\n if (typeof value !== 'string') {\n throw new Error(`\"${fieldName}\" must be a string, got ${typeof value}`);\n }\n}\n\nexport function validDateString(value: unknown, fieldName: string): void {\n requiredString(value, fieldName);\n const date = new Date(value as string);\n if (isNaN(date.getTime())) {\n throw new Error(`\"${fieldName}\" must be a valid ISO 8601 date string, got \"${value}\"`);\n }\n}\n\nexport function validUrl(value: unknown, fieldName: string): void {\n if (value === undefined || value === null) return;\n if (typeof value !== 'string') {\n throw new Error(`\"${fieldName}\" must be a string URL, got ${typeof value}`);\n }\n try {\n new URL(value);\n } catch {\n throw new Error(`\"${fieldName}\" must be a valid URL, got \"${value}\"`);\n }\n}\n\nexport function positiveInt(value: unknown, fieldName: string): void {\n if (value === undefined || value === null) return;\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {\n throw new Error(`\"${fieldName}\" must be a positive integer, got ${value}`);\n }\n}\n","/**\n * Format a price value to a human-readable Philippine Peso string.\n *\n * @example\n * ```ts\n * formatPeso(1000) // \"₱1,000.00\"\n * formatPeso(3500) // \"₱3,500.00\"\n * formatPeso(0) // \"Free\"\n * ```\n */\nexport function formatPeso(amount: number): string {\n if (amount === 0) return 'Free';\n return `₱${amount.toLocaleString('en-PH', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n}\n\n/**\n * Validate that a price is a non-negative integer.\n * Ticketnation prices are whole pesos (e.g., 1000 = ₱1,000).\n *\n * @throws Error if price is invalid\n */\nexport function validatePrice(price: number, fieldName = 'price'): void {\n if (typeof price !== 'number' || !Number.isFinite(price)) {\n throw new Error(`${fieldName} must be a finite number, got ${typeof price}`);\n }\n if (price < 0) {\n throw new Error(`${fieldName} must be non-negative, got ${price}`);\n }\n if (!Number.isInteger(price)) {\n throw new Error(`${fieldName} must be a whole number (pesos, not centavos). Got ${price} — did you mean ${Math.round(price)}?`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Event,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n DataResponse,\n PaginatedResponse,\n DeletedResponse,\n} from '../types';\nimport { required, requiredString, validDateString, validUrl } from '../utils/validate';\nimport { validatePrice } from '../utils/price';\n\n/**\n * Manage events on the Ticketnation marketplace.\n *\n * @example\n * ```ts\n * // Create and publish in one call\n * const event = await tn.events.createAndPublish({\n * name: 'Summer Fest',\n * dateTime: '2026-06-15T18:00:00Z',\n * tickets: [{ name: 'GA', price: 1000, quantity: 500, published: true }],\n * });\n * ```\n */\nexport class EventsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a new event in DRAFT status.\n * Optionally include inline ticket types, gallery images, and venue.\n *\n * @param params - Event creation parameters\n * @returns The created event (status: DRAFT)\n *\n * @example\n * ```ts\n * const event = await tn.events.create({\n * name: 'Summer Music Fest',\n * dateTime: '2026-06-15T18:00:00Z',\n * venueId: 'uuid',\n * imageUrl: 'https://example.com/banner.jpg',\n * galleryUrls: ['https://example.com/photo1.jpg'],\n * tickets: [\n * { name: 'GA', price: 1000, quantity: 500, published: true },\n * { name: 'VIP', price: 3500, quantity: 50, published: true },\n * ],\n * });\n * ```\n */\n async create(params: CreateEventParams): Promise<Event> {\n requiredString(params.name, 'name');\n validDateString(params.dateTime, 'dateTime');\n if (params.endDateTime) validDateString(params.endDateTime, 'endDateTime');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n if (params.venueId) requiredString(params.venueId, 'venueId');\n if (params.galleryUrls) {\n params.galleryUrls.forEach((url, i) => validUrl(url, `galleryUrls[${i}]`));\n }\n if (params.tickets) {\n params.tickets.forEach((t, i) => {\n requiredString(t.name, `tickets[${i}].name`);\n required(t.price, `tickets[${i}].price`);\n validatePrice(t.price, `tickets[${i}].price`);\n required(t.quantity, `tickets[${i}].quantity`);\n });\n }\n\n const res = await this.client.request<DataResponse<Event>>('POST', '/open-api/v1/events', { body: params });\n return res.data;\n }\n\n /**\n * Create an event and immediately publish it.\n * Convenience method that calls create() then publish().\n *\n * @returns The published event (status: PUBLISHED)\n */\n async createAndPublish(params: CreateEventParams): Promise<Event> {\n const event = await this.create(params);\n return this.publish(event.id);\n }\n\n /**\n * List events for your organization (paginated).\n *\n * @example\n * ```ts\n * const { data, meta } = await tn.events.list({ status: 'PUBLISHED', page: 1 });\n * console.log(`${meta.total} published events`);\n * ```\n */\n async list(params?: ListEventsParams): Promise<PaginatedResponse<Event>> {\n return this.client.request<PaginatedResponse<Event>>('GET', '/open-api/v1/events', {\n params: params ? { page: params.page, take: params.take, status: params.status, search: params.search } : undefined,\n });\n }\n\n /**\n * Get a single event by UUID or slug.\n *\n * @example\n * ```ts\n * const event = await tn.events.get('summer-music-fest');\n * // or\n * const event = await tn.events.get('uuid-event-id');\n * ```\n */\n async get(idOrSlug: string): Promise<Event> {\n requiredString(idOrSlug, 'idOrSlug');\n const res = await this.client.request<DataResponse<Event>>('GET', `/open-api/v1/events/${encodeURIComponent(idOrSlug)}`);\n return res.data;\n }\n\n /**\n * Update event fields. Only provided fields are changed.\n * Cannot update inline tickets — use `tn.tickets` methods instead.\n */\n async update(eventId: string, params: UpdateEventParams): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('PATCH', `/open-api/v1/events/${eventId}`, { body: params });\n return res.data;\n }\n\n /**\n * Publish a DRAFT event to the marketplace.\n * The event becomes visible to buyers on ticketnation.ph.\n */\n async publish(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/publish`);\n return res.data;\n }\n\n /**\n * Revert a PUBLISHED event back to DRAFT.\n * Removes it from the public marketplace.\n */\n async unpublish(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/unpublish`);\n return res.data;\n }\n\n /**\n * Archive an event. Hidden from marketplace but data is preserved.\n */\n async archive(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/archive`);\n return res.data;\n }\n\n /**\n * Delete a DRAFT event. Only works if no tickets have been sold.\n * Published or archived events must be unpublished first.\n */\n async delete(eventId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Ticket,\n CreateTicketParams,\n UpdateTicketParams,\n DataResponse,\n DeletedResponse,\n} from '../types';\nimport { required, requiredString } from '../utils/validate';\nimport { validatePrice } from '../utils/price';\n\n/**\n * Manage ticket types for events.\n * Prices are in whole pesos (e.g., 1000 = ₱1,000).\n *\n * @example\n * ```ts\n * const ticket = await tn.tickets.create(eventId, {\n * name: 'VIP Pass',\n * price: 3500, // ₱3,500\n * quantity: 100,\n * published: true, // immediately available for sale\n * });\n * ```\n */\nexport class TicketsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a ticket type for an event.\n * Individual ticket inventory is auto-generated based on quantity.\n *\n * @param eventId - The event UUID\n * @param params - Ticket type details\n * @returns The created ticket type\n */\n async create(eventId: string, params: CreateTicketParams): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n required(params.price, 'price');\n validatePrice(params.price, 'price');\n required(params.quantity, 'quantity');\n if (params.quantity < 1) throw new Error('\"quantity\" must be at least 1');\n\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets`, { body: params });\n return res.data;\n }\n\n /**\n * List all ticket types for an event.\n */\n async list(eventId: string): Promise<Ticket[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Ticket[]>>('GET', `/open-api/v1/events/${eventId}/tickets`);\n return res.data;\n }\n\n /**\n * Get a single ticket type by ID.\n */\n async get(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('GET', `/open-api/v1/events/${eventId}/tickets/${ticketId}`);\n return res.data;\n }\n\n /**\n * Update a ticket type. Price and quantity changes are validated\n * against business rules (e.g., can't reduce below sold count).\n */\n async update(eventId: string, ticketId: string, params: UpdateTicketParams): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n if (params.price !== undefined) validatePrice(params.price, 'price');\n\n const res = await this.client.request<DataResponse<Ticket>>('PATCH', `/open-api/v1/events/${eventId}/tickets/${ticketId}`, { body: params });\n return res.data;\n }\n\n /**\n * Make a ticket type available for purchase.\n * The parent event must also be published for tickets to appear.\n */\n async publish(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets/${ticketId}/publish`);\n return res.data;\n }\n\n /**\n * Mark a ticket type as sold out (sets remainingQuantity to 0).\n * To restore availability, use update() to set a new quantity.\n */\n async markSoldOut(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets/${ticketId}/sold-out`);\n return res.data;\n }\n\n /**\n * Delete a ticket type. Only works if no tickets have been sold.\n */\n async delete(eventId: string, ticketId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/tickets/${ticketId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Order,\n ListOrdersParams,\n DataResponse,\n PaginatedResponse,\n} from '../types';\nimport { requiredString } from '../utils/validate';\n\n/**\n * Read-only access to orders for your events.\n * Orders are created when buyers purchase tickets on ticketnation.ph.\n *\n * @example\n * ```ts\n * const { data: orders } = await tn.orders.list(eventId, { status: 'COMPLETED' });\n * for (const order of orders) {\n * console.log(`#${order.orderNumber}: ${order.user.firstName} — ₱${order.total}`);\n * }\n * ```\n */\nexport class OrdersResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * List orders for an event (paginated).\n * Filter by status to get only completed, pending, or refunded orders.\n *\n * @param eventId - The event UUID\n * @param params - Pagination and filter options\n */\n async list(eventId: string, params?: ListOrdersParams): Promise<PaginatedResponse<Order>> {\n requiredString(eventId, 'eventId');\n return this.client.request<PaginatedResponse<Order>>('GET', `/open-api/v1/events/${eventId}/orders`, {\n params: params ? { page: params.page, take: params.take, status: params.status } : undefined,\n });\n }\n\n /**\n * Get a single order by ID. Includes line items and payment details.\n *\n * @param orderId - The order UUID\n */\n async get(orderId: string): Promise<Order> {\n requiredString(orderId, 'orderId');\n const res = await this.client.request<DataResponse<Order>>('GET', `/open-api/v1/orders/${orderId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Venue,\n SearchVenuesParams,\n PaginatedResponse,\n} from '../types';\nimport { requiredString } from '../utils/validate';\n\n/**\n * Search public venues on Ticketnation.\n * Use the returned venue ID when creating events with a physical location.\n *\n * @example\n * ```ts\n * const { data: venues } = await tn.venues.search({ query: 'Mall of Asia' });\n * const event = await tn.events.create({\n * name: 'Concert',\n * dateTime: '2026-06-15T18:00:00Z',\n * venueId: venues[0].id, // ← link the venue\n * });\n * ```\n */\nexport class VenuesResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Search venues by name (case-insensitive substring match).\n *\n * @param params - Search query and pagination\n * @returns Paginated list of matching venues with address and coordinates\n */\n async search(params: SearchVenuesParams): Promise<PaginatedResponse<Venue>> {\n requiredString(params.query, 'query');\n return this.client.request<PaginatedResponse<Venue>>('GET', '/open-api/v1/venues/search', {\n params: { query: params.query, page: params.page, take: params.take },\n });\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Webhook,\n WebhookWithSecret,\n CreateWebhookParams,\n UpdateWebhookParams,\n DataResponse,\n PaginatedResponse,\n DeletedResponse,\n} from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Delivery record for a webhook event. */\nexport interface WebhookDelivery {\n id: string;\n eventType: string;\n statusCode: number | null;\n success: boolean;\n attempts: number;\n createdAt: string;\n}\n\n/** Result of testing a webhook endpoint. */\nexport interface WebhookTestResult {\n success: boolean;\n statusCode: number | null;\n message: string;\n}\n\n/**\n * Manage webhook endpoints for real-time notifications.\n *\n * @example\n * ```ts\n * // Create a webhook — store the secret securely!\n * const webhook = await tn.webhooks.create({\n * url: 'https://api.example.com/webhooks/ticketnation',\n * events: ['order.completed', 'event.sold_out'],\n * });\n * console.log(webhook.secret); // whsec_... (only shown once)\n *\n * // Test it\n * const result = await tn.webhooks.test(webhook.id);\n * console.log(result.success); // true\n * ```\n */\nexport class WebhooksResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a webhook endpoint.\n * The response includes a `secret` field for HMAC signature verification.\n *\n * **Important:** The secret is only returned on creation. Store it securely.\n */\n async create(params: CreateWebhookParams): Promise<WebhookWithSecret> {\n validUrl(params.url, 'url');\n if (!params.events || params.events.length === 0) {\n throw new Error('\"events\" must contain at least one event type (e.g., \"order.completed\")');\n }\n const res = await this.client.request<DataResponse<WebhookWithSecret>>('POST', '/open-api/v1/webhooks', { body: params });\n return res.data;\n }\n\n /** List all webhooks for your API key. */\n async list(): Promise<Webhook[]> {\n const res = await this.client.request<DataResponse<Webhook[]>>('GET', '/open-api/v1/webhooks');\n return res.data;\n }\n\n /** Update a webhook's URL, events, or active status. */\n async update(webhookId: string, params: UpdateWebhookParams): Promise<Webhook> {\n requiredString(webhookId, 'webhookId');\n if (params.url) validUrl(params.url, 'url');\n const res = await this.client.request<DataResponse<Webhook>>('PATCH', `/open-api/v1/webhooks/${webhookId}`, { body: params });\n return res.data;\n }\n\n /** Delete a webhook and its delivery history. */\n async delete(webhookId: string): Promise<DeletedResponse> {\n requiredString(webhookId, 'webhookId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/webhooks/${webhookId}`);\n return res.data;\n }\n\n /** Send a test payload to verify your webhook endpoint works. */\n async test(webhookId: string): Promise<WebhookTestResult> {\n requiredString(webhookId, 'webhookId');\n const res = await this.client.request<DataResponse<WebhookTestResult>>('POST', `/open-api/v1/webhooks/${webhookId}/test`);\n return res.data;\n }\n\n /**\n * View delivery history for a webhook (paginated).\n * Useful for debugging failed deliveries.\n */\n async deliveries(webhookId: string, params?: { page?: number; take?: number }): Promise<PaginatedResponse<WebhookDelivery>> {\n requiredString(webhookId, 'webhookId');\n return this.client.request<PaginatedResponse<WebhookDelivery>>('GET', `/open-api/v1/webhooks/${webhookId}/deliveries`, {\n params: params ? { page: params.page, take: params.take } : undefined,\n });\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Parameters for creating a performer. */\nexport interface CreatePerformerParams {\n /** Performer/artist name */\n name: string;\n /** Bio or description */\n description?: string;\n /** Performer type */\n type?: 'SOLO' | 'GROUP' | 'DJ' | 'BAND' | 'SPEAKER' | 'HOST' | 'COMEDIAN' | 'OTHER';\n /** Public URL to performer image (hosted on your end) */\n imageUrl?: string;\n /** Facebook profile URL */\n facebook?: string;\n /** YouTube channel URL */\n youtube?: string;\n /** Instagram profile URL */\n instagram?: string;\n}\n\n/** Performer details. */\nexport interface Performer {\n id: string;\n name: string;\n description: string | null;\n type: string;\n slug: string | null;\n facebook: string | null;\n youtube: string | null;\n instagram: string | null;\n image: { id: string; url: string | null } | null;\n}\n\n/**\n * Manage performers/artists/speakers for events.\n *\n * @example\n * ```ts\n * await tn.performers.create(eventId, {\n * name: 'DJ Shadow',\n * type: 'SOLO',\n * imageUrl: 'https://example.com/dj-shadow.jpg',\n * });\n *\n * const performers = await tn.performers.list(eventId);\n * ```\n */\nexport class PerformersResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a performer to an event.\n * If `imageUrl` is provided, it will be displayed on the event page.\n *\n * @param eventId - The event UUID\n * @param params - Performer details\n */\n async create(eventId: string, params: CreatePerformerParams): Promise<Performer> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n const res = await this.client.request<DataResponse<Performer>>('POST', `/open-api/v1/events/${eventId}/performers`, { body: params });\n return res.data;\n }\n\n /** List all performers for an event. */\n async list(eventId: string): Promise<Performer[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Performer[]>>('GET', `/open-api/v1/events/${eventId}/performers`);\n return res.data;\n }\n\n /**\n * Remove a performer from an event.\n * This unlinks the performer — it doesn't delete the performer record.\n */\n async remove(eventId: string, performerId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(performerId, 'performerId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/performers/${performerId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validDateString } from '../utils/validate';\n\n/** Parameters for creating a schedule item. */\nexport interface CreateScheduleParams {\n /** Schedule item title (e.g., \"Doors Open\", \"DJ Shadow Live\") */\n title: string;\n /** Description of this schedule block */\n description?: string;\n /** Start time (ISO 8601) */\n startTime: string;\n /** End time (ISO 8601) */\n endTime: string;\n /** Emoji or icon name */\n icon?: string;\n /** Hex color code (e.g., \"#4f46e5\") */\n color?: string;\n /** Sort position (auto-assigned if not provided) */\n sortOrder?: number;\n /** Link this schedule item to a performer */\n performerId?: string;\n}\n\n/** Parameters for updating a schedule item. All fields optional. */\nexport interface UpdateScheduleParams {\n title?: string;\n description?: string;\n startTime?: string;\n endTime?: string;\n icon?: string;\n color?: string;\n sortOrder?: number;\n performerId?: string;\n}\n\n/** Schedule item details. */\nexport interface Schedule {\n id: string;\n title: string;\n description: string | null;\n startTime: string;\n endTime: string;\n icon: string | null;\n color: string | null;\n sortOrder: number;\n performerId: string | null;\n performer: { id: string; name: string } | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Manage event schedule / timeline items.\n *\n * @example\n * ```ts\n * // Create a full event schedule\n * await tn.schedules.create(eventId, {\n * title: 'Doors Open',\n * startTime: '2026-09-15T19:00:00Z',\n * endTime: '2026-09-15T19:30:00Z',\n * icon: '🎵',\n * });\n *\n * await tn.schedules.create(eventId, {\n * title: 'DJ Shadow Live',\n * startTime: '2026-09-15T21:00:00Z',\n * endTime: '2026-09-15T23:00:00Z',\n * performerId: performer.id, // link to a performer\n * });\n * ```\n */\nexport class SchedulesResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a schedule item to an event.\n *\n * @param eventId - The event UUID\n * @param params - Schedule item details\n */\n async create(eventId: string, params: CreateScheduleParams): Promise<Schedule> {\n requiredString(eventId, 'eventId');\n requiredString(params.title, 'title');\n validDateString(params.startTime, 'startTime');\n validDateString(params.endTime, 'endTime');\n const res = await this.client.request<DataResponse<Schedule>>('POST', `/open-api/v1/events/${eventId}/schedules`, { body: params });\n return res.data;\n }\n\n /** List all schedule items for an event, ordered by sortOrder. */\n async list(eventId: string): Promise<Schedule[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Schedule[]>>('GET', `/open-api/v1/events/${eventId}/schedules`);\n return res.data;\n }\n\n /** Update a schedule item. Only provided fields are changed. */\n async update(eventId: string, scheduleId: string, params: UpdateScheduleParams): Promise<Schedule> {\n requiredString(eventId, 'eventId');\n requiredString(scheduleId, 'scheduleId');\n if (params.startTime) validDateString(params.startTime, 'startTime');\n if (params.endTime) validDateString(params.endTime, 'endTime');\n const res = await this.client.request<DataResponse<Schedule>>('PATCH', `/open-api/v1/events/${eventId}/schedules/${scheduleId}`, { body: params });\n return res.data;\n }\n\n /** Delete a schedule item. */\n async remove(eventId: string, scheduleId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(scheduleId, 'scheduleId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/schedules/${scheduleId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Parameters for creating a brand partner. */\nexport interface CreateBrandParams {\n /** Brand/sponsor name */\n name: string;\n /** Brand description */\n description?: string;\n /** Brand website URL */\n url?: string;\n /** Public URL to brand logo (hosted on your end) */\n imageUrl?: string;\n /** Display position (lower = first) */\n position?: number;\n}\n\n/** Brand partner details. */\nexport interface Brand {\n id: string;\n name: string;\n description: string | null;\n url: string | null;\n sponsorshipColor: string | null;\n image: { id: string; url: string | null } | null;\n position: number | null;\n}\n\n/**\n * Manage brand partners / sponsors for events.\n *\n * @example\n * ```ts\n * await tn.brands.create(eventId, {\n * name: 'Red Bull',\n * url: 'https://redbull.com',\n * imageUrl: 'https://example.com/redbull-logo.png',\n * });\n * ```\n */\nexport class BrandsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a brand partner to an event.\n * If a brand with the same name already exists in your org, it will be reused.\n *\n * @param eventId - The event UUID\n * @param params - Brand details\n */\n async create(eventId: string, params: CreateBrandParams): Promise<Brand> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n if (params.url) validUrl(params.url, 'url');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n const res = await this.client.request<DataResponse<Brand>>('POST', `/open-api/v1/events/${eventId}/brands`, { body: params });\n return res.data;\n }\n\n /** List all brand partners for an event. */\n async list(eventId: string): Promise<Brand[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Brand[]>>('GET', `/open-api/v1/events/${eventId}/brands`);\n return res.data;\n }\n\n /**\n * Remove a brand from an event.\n * This unlinks the brand — it doesn't delete the brand record.\n */\n async remove(eventId: string, brandId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(brandId, 'brandId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/brands/${brandId}`);\n return res.data;\n }\n}\n","import type { PaginatedResponse, PaginationParams } from '../types';\n\nexport async function* paginate<T>(\n fetchPage: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n initialParams?: PaginationParams,\n): AsyncGenerator<T[], void, undefined> {\n let page = initialParams?.page ?? 1;\n const take = initialParams?.take ?? 10;\n\n while (true) {\n const response = await fetchPage({ page, take });\n yield response.data;\n\n if (page >= response.meta.totalPages) {\n break;\n }\n page++;\n }\n}\n\nexport async function fetchAllPages<T>(\n fetchPage: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n initialParams?: PaginationParams,\n): Promise<T[]> {\n const all: T[] = [];\n for await (const batch of paginate(fetchPage, initialParams)) {\n all.push(...batch);\n }\n return all;\n}\n","import { HttpClient } from './client';\nimport { EventsResource } from './resources/events';\nimport { TicketsResource } from './resources/tickets';\nimport { OrdersResource } from './resources/orders';\nimport { VenuesResource } from './resources/venues';\nimport { WebhooksResource } from './resources/webhooks';\nimport { PerformersResource } from './resources/performers';\nimport { SchedulesResource } from './resources/schedules';\nimport { BrandsResource } from './resources/brands';\nimport type { TicketnationConfig, AccountInfo, DataResponse } from './types';\n\n/**\n * Ticketnation SDK — publish events, manage tickets, and receive orders programmatically.\n *\n * @example\n * ```ts\n * import { Ticketnation } from 'ticketnation-sdk';\n *\n * const tn = new Ticketnation({ apiKey: 'tn_live_...' });\n *\n * // Create and publish an event in one call\n * const event = await tn.events.createAndPublish({\n * name: 'Summer Fest 2026',\n * dateTime: '2026-06-15T18:00:00Z',\n * imageUrl: 'https://example.com/banner.jpg',\n * tickets: [\n * { name: 'GA', price: 1000, quantity: 500, published: true },\n * ],\n * });\n *\n * // Add performers and schedule\n * const dj = await tn.performers.create(event.id, { name: 'DJ Shadow', type: 'SOLO' });\n * await tn.schedules.create(event.id, {\n * title: 'DJ Shadow Live',\n * startTime: '2026-06-15T21:00:00Z',\n * endTime: '2026-06-15T23:00:00Z',\n * performerId: dj.id,\n * });\n *\n * // Check orders\n * const { data: orders } = await tn.orders.list(event.id);\n * ```\n *\n * @see https://docs.ticketnation.ph/developers/overview\n */\nexport class Ticketnation {\n /** Create, list, update, publish, and delete events. */\n readonly events: EventsResource;\n /** Create, list, update, and manage ticket types. Prices are in whole pesos. */\n readonly tickets: TicketsResource;\n /** Read-only access to orders placed by buyers. */\n readonly orders: OrdersResource;\n /** Search public venues by name. */\n readonly venues: VenuesResource;\n /** Manage webhook endpoints for real-time notifications. */\n readonly webhooks: WebhooksResource;\n /** Add and manage performers/artists/speakers for events. */\n readonly performers: PerformersResource;\n /** Create event schedule / timeline items. */\n readonly schedules: SchedulesResource;\n /** Add brand partners / sponsors to events. */\n readonly brands: BrandsResource;\n\n private readonly client: HttpClient;\n\n /**\n * Create a new Ticketnation SDK instance.\n *\n * @param config - SDK configuration\n * @param config.apiKey - Your API key from Organizer Dashboard > Settings > API Keys\n * @param config.baseUrl - API base URL (default: https://api.ticketnation.ph)\n * @param config.timeout - Request timeout in ms (default: 30000)\n * @param config.retries - Retry count on 5xx errors (default: 2)\n * @param config.debug - Log requests with redacted API key (default: false)\n */\n constructor(config?: TicketnationConfig) {\n if (!config || !config.apiKey) {\n throw new Error(\n 'Ticketnation SDK requires an apiKey. Usage: new Ticketnation({ apiKey: process.env.TICKETNATION_API_KEY }). Get a key from Organizer Dashboard > Settings > API Keys.',\n );\n }\n\n this.client = new HttpClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.ticketnation.ph',\n timeout: config.timeout ?? 30000,\n retries: config.retries ?? 2,\n debug: config.debug ?? false,\n });\n\n this.events = new EventsResource(this.client);\n this.tickets = new TicketsResource(this.client);\n this.orders = new OrdersResource(this.client);\n this.venues = new VenuesResource(this.client);\n this.webhooks = new WebhooksResource(this.client);\n this.performers = new PerformersResource(this.client);\n this.schedules = new SchedulesResource(this.client);\n this.brands = new BrandsResource(this.client);\n }\n\n /**\n * Get information about your API key and organization.\n * Useful for verifying your key is correctly configured.\n *\n * @returns API key details (name, scopes, expiry) and organization info\n *\n * @example\n * ```ts\n * const info = await tn.me();\n * console.log(`Org: ${info.organization.name}`);\n * console.log(`Scopes: ${info.apiKey.scopes.join(', ')}`);\n * ```\n */\n async me(): Promise<AccountInfo> {\n const res = await this.client.request<DataResponse<AccountInfo>>('GET', '/open-api/v1/me');\n return res.data;\n }\n}\n\n// Re-export everything\nexport { TicketnationError } from './errors';\nexport { paginate, fetchAllPages } from './utils/pagination';\nexport { formatPeso, validatePrice } from './utils/price';\nexport type * from './types';\nexport type { Performer, CreatePerformerParams } from './resources/performers';\nexport type { Schedule, CreateScheduleParams, UpdateScheduleParams } from './resources/schedules';\nexport type { Brand, CreateBrandParams } from './resources/brands';\nexport type { WebhookDelivery, WebhookTestResult } from './resources/webhooks';\n"]}
package/dist/index.mjs CHANGED
@@ -720,9 +720,9 @@ var Ticketnation = class {
720
720
  * @param config.debug - Log requests with redacted API key (default: false)
721
721
  */
722
722
  constructor(config) {
723
- if (!config.apiKey) {
723
+ if (!config || !config.apiKey) {
724
724
  throw new Error(
725
- "Ticketnation SDK requires an apiKey. Get one from Organizer Dashboard > Settings > API Keys."
725
+ "Ticketnation SDK requires an apiKey. Usage: new Ticketnation({ apiKey: process.env.TICKETNATION_API_KEY }). Get a key from Organizer Dashboard > Settings > API Keys."
726
726
  );
727
727
  }
728
728
  this.client = new HttpClient({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/validate.ts","../src/utils/price.ts","../src/resources/events.ts","../src/resources/tickets.ts","../src/resources/orders.ts","../src/resources/venues.ts","../src/resources/webhooks.ts","../src/resources/performers.ts","../src/resources/schedules.ts","../src/resources/brands.ts","../src/utils/pagination.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ApiErrorBody } from './types';\n\nconst SCOPE_HINTS: Record<string, string> = {\n 'events:read': 'tn.events.list(), tn.events.get(), tn.venues.search()',\n 'events:write': 'tn.events.create(), tn.events.publish(), tn.performers, tn.schedules, tn.brands',\n 'tickets:read': 'tn.tickets.list(), tn.tickets.get()',\n 'tickets:write': 'tn.tickets.create(), tn.tickets.markSoldOut()',\n 'orders:read': 'tn.orders.list(), tn.orders.get()',\n 'webhooks:manage': 'tn.webhooks.create(), tn.webhooks.list()',\n};\n\n/**\n * Error thrown by the Ticketnation SDK for all API and network errors.\n *\n * @example\n * ```ts\n * try {\n * await tn.events.get('nonexistent');\n * } catch (error) {\n * if (error instanceof TicketnationError) {\n * console.log(error.code); // 'NOT_FOUND'\n * console.log(error.status); // 404\n * console.log(error.message); // 'Event not found: nonexistent'\n * console.log(error.requestId); // 'req_abc123' (for support)\n * }\n * }\n * ```\n */\nexport class TicketnationError extends Error {\n /** Machine-readable error code (e.g., 'NOT_FOUND', 'VALIDATION_ERROR', 'RATE_LIMITED') */\n readonly code: string;\n /** HTTP status code (0 for network/timeout errors) */\n readonly status: number;\n /** Unique request ID for debugging (include in support tickets) */\n readonly requestId: string | null;\n /** Field-level validation errors (only for VALIDATION_ERROR) */\n readonly details: Array<{ field: string; message: string }> | undefined;\n /** Suggested fix for common errors */\n readonly hint: string | null;\n\n constructor(\n message: string,\n opts: {\n code: string;\n status: number;\n requestId?: string;\n details?: Array<{ field: string; message: string }>;\n },\n ) {\n super(message);\n this.name = 'TicketnationError';\n this.code = opts.code;\n this.status = opts.status;\n this.requestId = opts.requestId ?? null;\n this.details = opts.details;\n this.hint = TicketnationError.getHint(opts.code, opts.status, message);\n }\n\n static fromResponse(status: number, body: { error: ApiErrorBody; requestId?: string }): TicketnationError {\n return new TicketnationError(body.error.message, {\n code: body.error.code,\n status,\n requestId: body.requestId,\n details: body.error.details,\n });\n }\n\n private static getHint(code: string, status: number, message: string): string | null {\n if (code === 'UNAUTHORIZED') {\n return 'Check your API key. Get one from Organizer Dashboard > Settings > API Keys.';\n }\n if (code === 'SCOPE_REQUIRED' || (code === 'FORBIDDEN' && status === 403)) {\n // Try to extract scope from message\n for (const [scope, methods] of Object.entries(SCOPE_HINTS)) {\n if (message.includes(scope)) {\n return `Your API key needs the \"${scope}\" scope for: ${methods}. Update it in Settings > API Keys.`;\n }\n }\n return 'Your API key lacks the required scope. Update it in Organizer Dashboard > Settings > API Keys.';\n }\n if (code === 'RATE_LIMITED') {\n return 'Too many requests. The SDK does NOT auto-retry on 429. Wait and try again.';\n }\n if (code === 'VALIDATION_ERROR') {\n return 'Check the \"details\" property for field-level errors.';\n }\n return null;\n }\n\n /** Serialize error for logging or API responses. */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n status: this.status,\n message: this.message,\n requestId: this.requestId,\n details: this.details,\n hint: this.hint,\n };\n }\n\n /** Human-readable error summary. */\n toString(): string {\n let str = `TicketnationError [${this.code}] (${this.status}): ${this.message}`;\n if (this.requestId) str += ` (requestId: ${this.requestId})`;\n if (this.hint) str += `\\n Hint: ${this.hint}`;\n return str;\n }\n}\n","import { TicketnationError } from './errors';\n\nexport interface ClientConfig {\n apiKey: string;\n baseUrl: string;\n timeout: number;\n retries: number;\n debug: boolean;\n}\n\nexport class HttpClient {\n private readonly config: ClientConfig;\n\n constructor(config: ClientConfig) {\n this.config = config;\n }\n\n async request<T>(method: string, path: string, opts?: { body?: unknown; params?: Record<string, unknown> }): Promise<T> {\n const url = this.buildUrl(path, opts?.params);\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.config.retries; attempt++) {\n if (attempt > 0) {\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\n await this.sleep(delay);\n if (this.config.debug) {\n console.log(`[Ticketnation SDK] Retry attempt ${attempt}/${this.config.retries} for ${method} ${path}`);\n }\n }\n\n try {\n const response = await this.doRequest(method, url, opts?.body);\n return response as T;\n } catch (error) {\n lastError = error as Error;\n if (error instanceof TicketnationError && error.status < 500) {\n throw error;\n }\n }\n }\n\n throw lastError;\n }\n\n private async doRequest(method: string, url: string, body?: unknown): Promise<unknown> {\n if (this.config.debug) {\n const redactedKey = this.config.apiKey.slice(0, 6) + '...' + this.config.apiKey.slice(-4);\n console.log(`[Ticketnation SDK] ${method} ${url} (key: ${redactedKey})`);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const headers: Record<string, string> = {\n 'api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'User-Agent': 'ticketnation-sdk/1.0.2',\n };\n\n const init: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body && (method === 'POST' || method === 'PATCH' || method === 'PUT')) {\n init.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n throw new TicketnationError(`HTTP ${response.status}: ${response.statusText}`, {\n code: 'HTTP_ERROR',\n status: response.status,\n });\n }\n\n const parsed = errorBody as { error?: { code: string; message: string; details?: Array<{ field: string; message: string }> }; requestId?: string };\n if (parsed.error) {\n throw TicketnationError.fromResponse(response.status, parsed as { error: { code: string; message: string }; requestId?: string });\n }\n\n throw new TicketnationError(`HTTP ${response.status}: ${response.statusText}`, {\n code: 'HTTP_ERROR',\n status: response.status,\n });\n }\n\n if (response.status === 204) {\n return {};\n }\n\n return await response.json();\n } catch (error) {\n if (error instanceof TicketnationError) throw error;\n\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw new TicketnationError(`Request timed out after ${this.config.timeout}ms`, {\n code: 'TIMEOUT',\n status: 0,\n });\n }\n\n throw new TicketnationError(`Network error: ${(error as Error).message}`, {\n code: 'NETWORK_ERROR',\n status: 0,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const base = this.config.baseUrl.replace(/\\/$/, '');\n const url = new URL(`${base}${path}`);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * Client-side validation helpers.\n * These catch common mistakes before making an API call.\n */\n\nexport function required(value: unknown, fieldName: string): void {\n if (value === undefined || value === null || value === '') {\n throw new Error(`\"${fieldName}\" is required`);\n }\n}\n\nexport function requiredString(value: unknown, fieldName: string): void {\n required(value, fieldName);\n if (typeof value !== 'string') {\n throw new Error(`\"${fieldName}\" must be a string, got ${typeof value}`);\n }\n}\n\nexport function validDateString(value: unknown, fieldName: string): void {\n requiredString(value, fieldName);\n const date = new Date(value as string);\n if (isNaN(date.getTime())) {\n throw new Error(`\"${fieldName}\" must be a valid ISO 8601 date string, got \"${value}\"`);\n }\n}\n\nexport function validUrl(value: unknown, fieldName: string): void {\n if (value === undefined || value === null) return;\n if (typeof value !== 'string') {\n throw new Error(`\"${fieldName}\" must be a string URL, got ${typeof value}`);\n }\n try {\n new URL(value);\n } catch {\n throw new Error(`\"${fieldName}\" must be a valid URL, got \"${value}\"`);\n }\n}\n\nexport function positiveInt(value: unknown, fieldName: string): void {\n if (value === undefined || value === null) return;\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {\n throw new Error(`\"${fieldName}\" must be a positive integer, got ${value}`);\n }\n}\n","/**\n * Format a price value to a human-readable Philippine Peso string.\n *\n * @example\n * ```ts\n * formatPeso(1000) // \"₱1,000.00\"\n * formatPeso(3500) // \"₱3,500.00\"\n * formatPeso(0) // \"Free\"\n * ```\n */\nexport function formatPeso(amount: number): string {\n if (amount === 0) return 'Free';\n return `₱${amount.toLocaleString('en-PH', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n}\n\n/**\n * Validate that a price is a non-negative integer.\n * Ticketnation prices are whole pesos (e.g., 1000 = ₱1,000).\n *\n * @throws Error if price is invalid\n */\nexport function validatePrice(price: number, fieldName = 'price'): void {\n if (typeof price !== 'number' || !Number.isFinite(price)) {\n throw new Error(`${fieldName} must be a finite number, got ${typeof price}`);\n }\n if (price < 0) {\n throw new Error(`${fieldName} must be non-negative, got ${price}`);\n }\n if (!Number.isInteger(price)) {\n throw new Error(`${fieldName} must be a whole number (pesos, not centavos). Got ${price} — did you mean ${Math.round(price)}?`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Event,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n DataResponse,\n PaginatedResponse,\n DeletedResponse,\n} from '../types';\nimport { required, requiredString, validDateString, validUrl } from '../utils/validate';\nimport { validatePrice } from '../utils/price';\n\n/**\n * Manage events on the Ticketnation marketplace.\n *\n * @example\n * ```ts\n * // Create and publish in one call\n * const event = await tn.events.createAndPublish({\n * name: 'Summer Fest',\n * dateTime: '2026-06-15T18:00:00Z',\n * tickets: [{ name: 'GA', price: 1000, quantity: 500, published: true }],\n * });\n * ```\n */\nexport class EventsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a new event in DRAFT status.\n * Optionally include inline ticket types, gallery images, and venue.\n *\n * @param params - Event creation parameters\n * @returns The created event (status: DRAFT)\n *\n * @example\n * ```ts\n * const event = await tn.events.create({\n * name: 'Summer Music Fest',\n * dateTime: '2026-06-15T18:00:00Z',\n * venueId: 'uuid',\n * imageUrl: 'https://example.com/banner.jpg',\n * galleryUrls: ['https://example.com/photo1.jpg'],\n * tickets: [\n * { name: 'GA', price: 1000, quantity: 500, published: true },\n * { name: 'VIP', price: 3500, quantity: 50, published: true },\n * ],\n * });\n * ```\n */\n async create(params: CreateEventParams): Promise<Event> {\n requiredString(params.name, 'name');\n validDateString(params.dateTime, 'dateTime');\n if (params.endDateTime) validDateString(params.endDateTime, 'endDateTime');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n if (params.venueId) requiredString(params.venueId, 'venueId');\n if (params.galleryUrls) {\n params.galleryUrls.forEach((url, i) => validUrl(url, `galleryUrls[${i}]`));\n }\n if (params.tickets) {\n params.tickets.forEach((t, i) => {\n requiredString(t.name, `tickets[${i}].name`);\n required(t.price, `tickets[${i}].price`);\n validatePrice(t.price, `tickets[${i}].price`);\n required(t.quantity, `tickets[${i}].quantity`);\n });\n }\n\n const res = await this.client.request<DataResponse<Event>>('POST', '/open-api/v1/events', { body: params });\n return res.data;\n }\n\n /**\n * Create an event and immediately publish it.\n * Convenience method that calls create() then publish().\n *\n * @returns The published event (status: PUBLISHED)\n */\n async createAndPublish(params: CreateEventParams): Promise<Event> {\n const event = await this.create(params);\n return this.publish(event.id);\n }\n\n /**\n * List events for your organization (paginated).\n *\n * @example\n * ```ts\n * const { data, meta } = await tn.events.list({ status: 'PUBLISHED', page: 1 });\n * console.log(`${meta.total} published events`);\n * ```\n */\n async list(params?: ListEventsParams): Promise<PaginatedResponse<Event>> {\n return this.client.request<PaginatedResponse<Event>>('GET', '/open-api/v1/events', {\n params: params ? { page: params.page, take: params.take, status: params.status, search: params.search } : undefined,\n });\n }\n\n /**\n * Get a single event by UUID or slug.\n *\n * @example\n * ```ts\n * const event = await tn.events.get('summer-music-fest');\n * // or\n * const event = await tn.events.get('uuid-event-id');\n * ```\n */\n async get(idOrSlug: string): Promise<Event> {\n requiredString(idOrSlug, 'idOrSlug');\n const res = await this.client.request<DataResponse<Event>>('GET', `/open-api/v1/events/${encodeURIComponent(idOrSlug)}`);\n return res.data;\n }\n\n /**\n * Update event fields. Only provided fields are changed.\n * Cannot update inline tickets — use `tn.tickets` methods instead.\n */\n async update(eventId: string, params: UpdateEventParams): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('PATCH', `/open-api/v1/events/${eventId}`, { body: params });\n return res.data;\n }\n\n /**\n * Publish a DRAFT event to the marketplace.\n * The event becomes visible to buyers on ticketnation.ph.\n */\n async publish(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/publish`);\n return res.data;\n }\n\n /**\n * Revert a PUBLISHED event back to DRAFT.\n * Removes it from the public marketplace.\n */\n async unpublish(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/unpublish`);\n return res.data;\n }\n\n /**\n * Archive an event. Hidden from marketplace but data is preserved.\n */\n async archive(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/archive`);\n return res.data;\n }\n\n /**\n * Delete a DRAFT event. Only works if no tickets have been sold.\n * Published or archived events must be unpublished first.\n */\n async delete(eventId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Ticket,\n CreateTicketParams,\n UpdateTicketParams,\n DataResponse,\n DeletedResponse,\n} from '../types';\nimport { required, requiredString } from '../utils/validate';\nimport { validatePrice } from '../utils/price';\n\n/**\n * Manage ticket types for events.\n * Prices are in whole pesos (e.g., 1000 = ₱1,000).\n *\n * @example\n * ```ts\n * const ticket = await tn.tickets.create(eventId, {\n * name: 'VIP Pass',\n * price: 3500, // ₱3,500\n * quantity: 100,\n * published: true, // immediately available for sale\n * });\n * ```\n */\nexport class TicketsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a ticket type for an event.\n * Individual ticket inventory is auto-generated based on quantity.\n *\n * @param eventId - The event UUID\n * @param params - Ticket type details\n * @returns The created ticket type\n */\n async create(eventId: string, params: CreateTicketParams): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n required(params.price, 'price');\n validatePrice(params.price, 'price');\n required(params.quantity, 'quantity');\n if (params.quantity < 1) throw new Error('\"quantity\" must be at least 1');\n\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets`, { body: params });\n return res.data;\n }\n\n /**\n * List all ticket types for an event.\n */\n async list(eventId: string): Promise<Ticket[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Ticket[]>>('GET', `/open-api/v1/events/${eventId}/tickets`);\n return res.data;\n }\n\n /**\n * Get a single ticket type by ID.\n */\n async get(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('GET', `/open-api/v1/events/${eventId}/tickets/${ticketId}`);\n return res.data;\n }\n\n /**\n * Update a ticket type. Price and quantity changes are validated\n * against business rules (e.g., can't reduce below sold count).\n */\n async update(eventId: string, ticketId: string, params: UpdateTicketParams): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n if (params.price !== undefined) validatePrice(params.price, 'price');\n\n const res = await this.client.request<DataResponse<Ticket>>('PATCH', `/open-api/v1/events/${eventId}/tickets/${ticketId}`, { body: params });\n return res.data;\n }\n\n /**\n * Make a ticket type available for purchase.\n * The parent event must also be published for tickets to appear.\n */\n async publish(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets/${ticketId}/publish`);\n return res.data;\n }\n\n /**\n * Mark a ticket type as sold out (sets remainingQuantity to 0).\n * To restore availability, use update() to set a new quantity.\n */\n async markSoldOut(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets/${ticketId}/sold-out`);\n return res.data;\n }\n\n /**\n * Delete a ticket type. Only works if no tickets have been sold.\n */\n async delete(eventId: string, ticketId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/tickets/${ticketId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Order,\n ListOrdersParams,\n DataResponse,\n PaginatedResponse,\n} from '../types';\nimport { requiredString } from '../utils/validate';\n\n/**\n * Read-only access to orders for your events.\n * Orders are created when buyers purchase tickets on ticketnation.ph.\n *\n * @example\n * ```ts\n * const { data: orders } = await tn.orders.list(eventId, { status: 'COMPLETED' });\n * for (const order of orders) {\n * console.log(`#${order.orderNumber}: ${order.user.firstName} — ₱${order.total}`);\n * }\n * ```\n */\nexport class OrdersResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * List orders for an event (paginated).\n * Filter by status to get only completed, pending, or refunded orders.\n *\n * @param eventId - The event UUID\n * @param params - Pagination and filter options\n */\n async list(eventId: string, params?: ListOrdersParams): Promise<PaginatedResponse<Order>> {\n requiredString(eventId, 'eventId');\n return this.client.request<PaginatedResponse<Order>>('GET', `/open-api/v1/events/${eventId}/orders`, {\n params: params ? { page: params.page, take: params.take, status: params.status } : undefined,\n });\n }\n\n /**\n * Get a single order by ID. Includes line items and payment details.\n *\n * @param orderId - The order UUID\n */\n async get(orderId: string): Promise<Order> {\n requiredString(orderId, 'orderId');\n const res = await this.client.request<DataResponse<Order>>('GET', `/open-api/v1/orders/${orderId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Venue,\n SearchVenuesParams,\n PaginatedResponse,\n} from '../types';\nimport { requiredString } from '../utils/validate';\n\n/**\n * Search public venues on Ticketnation.\n * Use the returned venue ID when creating events with a physical location.\n *\n * @example\n * ```ts\n * const { data: venues } = await tn.venues.search({ query: 'Mall of Asia' });\n * const event = await tn.events.create({\n * name: 'Concert',\n * dateTime: '2026-06-15T18:00:00Z',\n * venueId: venues[0].id, // ← link the venue\n * });\n * ```\n */\nexport class VenuesResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Search venues by name (case-insensitive substring match).\n *\n * @param params - Search query and pagination\n * @returns Paginated list of matching venues with address and coordinates\n */\n async search(params: SearchVenuesParams): Promise<PaginatedResponse<Venue>> {\n requiredString(params.query, 'query');\n return this.client.request<PaginatedResponse<Venue>>('GET', '/open-api/v1/venues/search', {\n params: { query: params.query, page: params.page, take: params.take },\n });\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Webhook,\n WebhookWithSecret,\n CreateWebhookParams,\n UpdateWebhookParams,\n DataResponse,\n PaginatedResponse,\n DeletedResponse,\n} from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Delivery record for a webhook event. */\nexport interface WebhookDelivery {\n id: string;\n eventType: string;\n statusCode: number | null;\n success: boolean;\n attempts: number;\n createdAt: string;\n}\n\n/** Result of testing a webhook endpoint. */\nexport interface WebhookTestResult {\n success: boolean;\n statusCode: number | null;\n message: string;\n}\n\n/**\n * Manage webhook endpoints for real-time notifications.\n *\n * @example\n * ```ts\n * // Create a webhook — store the secret securely!\n * const webhook = await tn.webhooks.create({\n * url: 'https://api.example.com/webhooks/ticketnation',\n * events: ['order.completed', 'event.sold_out'],\n * });\n * console.log(webhook.secret); // whsec_... (only shown once)\n *\n * // Test it\n * const result = await tn.webhooks.test(webhook.id);\n * console.log(result.success); // true\n * ```\n */\nexport class WebhooksResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a webhook endpoint.\n * The response includes a `secret` field for HMAC signature verification.\n *\n * **Important:** The secret is only returned on creation. Store it securely.\n */\n async create(params: CreateWebhookParams): Promise<WebhookWithSecret> {\n validUrl(params.url, 'url');\n if (!params.events || params.events.length === 0) {\n throw new Error('\"events\" must contain at least one event type (e.g., \"order.completed\")');\n }\n const res = await this.client.request<DataResponse<WebhookWithSecret>>('POST', '/open-api/v1/webhooks', { body: params });\n return res.data;\n }\n\n /** List all webhooks for your API key. */\n async list(): Promise<Webhook[]> {\n const res = await this.client.request<DataResponse<Webhook[]>>('GET', '/open-api/v1/webhooks');\n return res.data;\n }\n\n /** Update a webhook's URL, events, or active status. */\n async update(webhookId: string, params: UpdateWebhookParams): Promise<Webhook> {\n requiredString(webhookId, 'webhookId');\n if (params.url) validUrl(params.url, 'url');\n const res = await this.client.request<DataResponse<Webhook>>('PATCH', `/open-api/v1/webhooks/${webhookId}`, { body: params });\n return res.data;\n }\n\n /** Delete a webhook and its delivery history. */\n async delete(webhookId: string): Promise<DeletedResponse> {\n requiredString(webhookId, 'webhookId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/webhooks/${webhookId}`);\n return res.data;\n }\n\n /** Send a test payload to verify your webhook endpoint works. */\n async test(webhookId: string): Promise<WebhookTestResult> {\n requiredString(webhookId, 'webhookId');\n const res = await this.client.request<DataResponse<WebhookTestResult>>('POST', `/open-api/v1/webhooks/${webhookId}/test`);\n return res.data;\n }\n\n /**\n * View delivery history for a webhook (paginated).\n * Useful for debugging failed deliveries.\n */\n async deliveries(webhookId: string, params?: { page?: number; take?: number }): Promise<PaginatedResponse<WebhookDelivery>> {\n requiredString(webhookId, 'webhookId');\n return this.client.request<PaginatedResponse<WebhookDelivery>>('GET', `/open-api/v1/webhooks/${webhookId}/deliveries`, {\n params: params ? { page: params.page, take: params.take } : undefined,\n });\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Parameters for creating a performer. */\nexport interface CreatePerformerParams {\n /** Performer/artist name */\n name: string;\n /** Bio or description */\n description?: string;\n /** Performer type */\n type?: 'SOLO' | 'GROUP' | 'DJ' | 'BAND' | 'SPEAKER' | 'HOST' | 'COMEDIAN' | 'OTHER';\n /** Public URL to performer image (hosted on your end) */\n imageUrl?: string;\n /** Facebook profile URL */\n facebook?: string;\n /** YouTube channel URL */\n youtube?: string;\n /** Instagram profile URL */\n instagram?: string;\n}\n\n/** Performer details. */\nexport interface Performer {\n id: string;\n name: string;\n description: string | null;\n type: string;\n slug: string | null;\n facebook: string | null;\n youtube: string | null;\n instagram: string | null;\n image: { id: string; url: string | null } | null;\n}\n\n/**\n * Manage performers/artists/speakers for events.\n *\n * @example\n * ```ts\n * await tn.performers.create(eventId, {\n * name: 'DJ Shadow',\n * type: 'SOLO',\n * imageUrl: 'https://example.com/dj-shadow.jpg',\n * });\n *\n * const performers = await tn.performers.list(eventId);\n * ```\n */\nexport class PerformersResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a performer to an event.\n * If `imageUrl` is provided, it will be displayed on the event page.\n *\n * @param eventId - The event UUID\n * @param params - Performer details\n */\n async create(eventId: string, params: CreatePerformerParams): Promise<Performer> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n const res = await this.client.request<DataResponse<Performer>>('POST', `/open-api/v1/events/${eventId}/performers`, { body: params });\n return res.data;\n }\n\n /** List all performers for an event. */\n async list(eventId: string): Promise<Performer[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Performer[]>>('GET', `/open-api/v1/events/${eventId}/performers`);\n return res.data;\n }\n\n /**\n * Remove a performer from an event.\n * This unlinks the performer — it doesn't delete the performer record.\n */\n async remove(eventId: string, performerId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(performerId, 'performerId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/performers/${performerId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validDateString } from '../utils/validate';\n\n/** Parameters for creating a schedule item. */\nexport interface CreateScheduleParams {\n /** Schedule item title (e.g., \"Doors Open\", \"DJ Shadow Live\") */\n title: string;\n /** Description of this schedule block */\n description?: string;\n /** Start time (ISO 8601) */\n startTime: string;\n /** End time (ISO 8601) */\n endTime: string;\n /** Emoji or icon name */\n icon?: string;\n /** Hex color code (e.g., \"#4f46e5\") */\n color?: string;\n /** Sort position (auto-assigned if not provided) */\n sortOrder?: number;\n /** Link this schedule item to a performer */\n performerId?: string;\n}\n\n/** Parameters for updating a schedule item. All fields optional. */\nexport interface UpdateScheduleParams {\n title?: string;\n description?: string;\n startTime?: string;\n endTime?: string;\n icon?: string;\n color?: string;\n sortOrder?: number;\n performerId?: string;\n}\n\n/** Schedule item details. */\nexport interface Schedule {\n id: string;\n title: string;\n description: string | null;\n startTime: string;\n endTime: string;\n icon: string | null;\n color: string | null;\n sortOrder: number;\n performerId: string | null;\n performer: { id: string; name: string } | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Manage event schedule / timeline items.\n *\n * @example\n * ```ts\n * // Create a full event schedule\n * await tn.schedules.create(eventId, {\n * title: 'Doors Open',\n * startTime: '2026-09-15T19:00:00Z',\n * endTime: '2026-09-15T19:30:00Z',\n * icon: '🎵',\n * });\n *\n * await tn.schedules.create(eventId, {\n * title: 'DJ Shadow Live',\n * startTime: '2026-09-15T21:00:00Z',\n * endTime: '2026-09-15T23:00:00Z',\n * performerId: performer.id, // link to a performer\n * });\n * ```\n */\nexport class SchedulesResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a schedule item to an event.\n *\n * @param eventId - The event UUID\n * @param params - Schedule item details\n */\n async create(eventId: string, params: CreateScheduleParams): Promise<Schedule> {\n requiredString(eventId, 'eventId');\n requiredString(params.title, 'title');\n validDateString(params.startTime, 'startTime');\n validDateString(params.endTime, 'endTime');\n const res = await this.client.request<DataResponse<Schedule>>('POST', `/open-api/v1/events/${eventId}/schedules`, { body: params });\n return res.data;\n }\n\n /** List all schedule items for an event, ordered by sortOrder. */\n async list(eventId: string): Promise<Schedule[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Schedule[]>>('GET', `/open-api/v1/events/${eventId}/schedules`);\n return res.data;\n }\n\n /** Update a schedule item. Only provided fields are changed. */\n async update(eventId: string, scheduleId: string, params: UpdateScheduleParams): Promise<Schedule> {\n requiredString(eventId, 'eventId');\n requiredString(scheduleId, 'scheduleId');\n if (params.startTime) validDateString(params.startTime, 'startTime');\n if (params.endTime) validDateString(params.endTime, 'endTime');\n const res = await this.client.request<DataResponse<Schedule>>('PATCH', `/open-api/v1/events/${eventId}/schedules/${scheduleId}`, { body: params });\n return res.data;\n }\n\n /** Delete a schedule item. */\n async remove(eventId: string, scheduleId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(scheduleId, 'scheduleId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/schedules/${scheduleId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Parameters for creating a brand partner. */\nexport interface CreateBrandParams {\n /** Brand/sponsor name */\n name: string;\n /** Brand description */\n description?: string;\n /** Brand website URL */\n url?: string;\n /** Public URL to brand logo (hosted on your end) */\n imageUrl?: string;\n /** Display position (lower = first) */\n position?: number;\n}\n\n/** Brand partner details. */\nexport interface Brand {\n id: string;\n name: string;\n description: string | null;\n url: string | null;\n sponsorshipColor: string | null;\n image: { id: string; url: string | null } | null;\n position: number | null;\n}\n\n/**\n * Manage brand partners / sponsors for events.\n *\n * @example\n * ```ts\n * await tn.brands.create(eventId, {\n * name: 'Red Bull',\n * url: 'https://redbull.com',\n * imageUrl: 'https://example.com/redbull-logo.png',\n * });\n * ```\n */\nexport class BrandsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a brand partner to an event.\n * If a brand with the same name already exists in your org, it will be reused.\n *\n * @param eventId - The event UUID\n * @param params - Brand details\n */\n async create(eventId: string, params: CreateBrandParams): Promise<Brand> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n if (params.url) validUrl(params.url, 'url');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n const res = await this.client.request<DataResponse<Brand>>('POST', `/open-api/v1/events/${eventId}/brands`, { body: params });\n return res.data;\n }\n\n /** List all brand partners for an event. */\n async list(eventId: string): Promise<Brand[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Brand[]>>('GET', `/open-api/v1/events/${eventId}/brands`);\n return res.data;\n }\n\n /**\n * Remove a brand from an event.\n * This unlinks the brand — it doesn't delete the brand record.\n */\n async remove(eventId: string, brandId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(brandId, 'brandId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/brands/${brandId}`);\n return res.data;\n }\n}\n","import type { PaginatedResponse, PaginationParams } from '../types';\n\nexport async function* paginate<T>(\n fetchPage: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n initialParams?: PaginationParams,\n): AsyncGenerator<T[], void, undefined> {\n let page = initialParams?.page ?? 1;\n const take = initialParams?.take ?? 10;\n\n while (true) {\n const response = await fetchPage({ page, take });\n yield response.data;\n\n if (page >= response.meta.totalPages) {\n break;\n }\n page++;\n }\n}\n\nexport async function fetchAllPages<T>(\n fetchPage: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n initialParams?: PaginationParams,\n): Promise<T[]> {\n const all: T[] = [];\n for await (const batch of paginate(fetchPage, initialParams)) {\n all.push(...batch);\n }\n return all;\n}\n","import { HttpClient } from './client';\nimport { EventsResource } from './resources/events';\nimport { TicketsResource } from './resources/tickets';\nimport { OrdersResource } from './resources/orders';\nimport { VenuesResource } from './resources/venues';\nimport { WebhooksResource } from './resources/webhooks';\nimport { PerformersResource } from './resources/performers';\nimport { SchedulesResource } from './resources/schedules';\nimport { BrandsResource } from './resources/brands';\nimport type { TicketnationConfig, AccountInfo, DataResponse } from './types';\n\n/**\n * Ticketnation SDK — publish events, manage tickets, and receive orders programmatically.\n *\n * @example\n * ```ts\n * import { Ticketnation } from 'ticketnation-sdk';\n *\n * const tn = new Ticketnation({ apiKey: 'tn_live_...' });\n *\n * // Create and publish an event in one call\n * const event = await tn.events.createAndPublish({\n * name: 'Summer Fest 2026',\n * dateTime: '2026-06-15T18:00:00Z',\n * imageUrl: 'https://example.com/banner.jpg',\n * tickets: [\n * { name: 'GA', price: 1000, quantity: 500, published: true },\n * ],\n * });\n *\n * // Add performers and schedule\n * const dj = await tn.performers.create(event.id, { name: 'DJ Shadow', type: 'SOLO' });\n * await tn.schedules.create(event.id, {\n * title: 'DJ Shadow Live',\n * startTime: '2026-06-15T21:00:00Z',\n * endTime: '2026-06-15T23:00:00Z',\n * performerId: dj.id,\n * });\n *\n * // Check orders\n * const { data: orders } = await tn.orders.list(event.id);\n * ```\n *\n * @see https://docs.ticketnation.ph/developers/overview\n */\nexport class Ticketnation {\n /** Create, list, update, publish, and delete events. */\n readonly events: EventsResource;\n /** Create, list, update, and manage ticket types. Prices are in whole pesos. */\n readonly tickets: TicketsResource;\n /** Read-only access to orders placed by buyers. */\n readonly orders: OrdersResource;\n /** Search public venues by name. */\n readonly venues: VenuesResource;\n /** Manage webhook endpoints for real-time notifications. */\n readonly webhooks: WebhooksResource;\n /** Add and manage performers/artists/speakers for events. */\n readonly performers: PerformersResource;\n /** Create event schedule / timeline items. */\n readonly schedules: SchedulesResource;\n /** Add brand partners / sponsors to events. */\n readonly brands: BrandsResource;\n\n private readonly client: HttpClient;\n\n /**\n * Create a new Ticketnation SDK instance.\n *\n * @param config - SDK configuration\n * @param config.apiKey - Your API key from Organizer Dashboard > Settings > API Keys\n * @param config.baseUrl - API base URL (default: https://api.ticketnation.ph)\n * @param config.timeout - Request timeout in ms (default: 30000)\n * @param config.retries - Retry count on 5xx errors (default: 2)\n * @param config.debug - Log requests with redacted API key (default: false)\n */\n constructor(config: TicketnationConfig) {\n if (!config.apiKey) {\n throw new Error(\n 'Ticketnation SDK requires an apiKey. Get one from Organizer Dashboard > Settings > API Keys.',\n );\n }\n\n this.client = new HttpClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.ticketnation.ph',\n timeout: config.timeout ?? 30000,\n retries: config.retries ?? 2,\n debug: config.debug ?? false,\n });\n\n this.events = new EventsResource(this.client);\n this.tickets = new TicketsResource(this.client);\n this.orders = new OrdersResource(this.client);\n this.venues = new VenuesResource(this.client);\n this.webhooks = new WebhooksResource(this.client);\n this.performers = new PerformersResource(this.client);\n this.schedules = new SchedulesResource(this.client);\n this.brands = new BrandsResource(this.client);\n }\n\n /**\n * Get information about your API key and organization.\n * Useful for verifying your key is correctly configured.\n *\n * @returns API key details (name, scopes, expiry) and organization info\n *\n * @example\n * ```ts\n * const info = await tn.me();\n * console.log(`Org: ${info.organization.name}`);\n * console.log(`Scopes: ${info.apiKey.scopes.join(', ')}`);\n * ```\n */\n async me(): Promise<AccountInfo> {\n const res = await this.client.request<DataResponse<AccountInfo>>('GET', '/open-api/v1/me');\n return res.data;\n }\n}\n\n// Re-export everything\nexport { TicketnationError } from './errors';\nexport { paginate, fetchAllPages } from './utils/pagination';\nexport { formatPeso, validatePrice } from './utils/price';\nexport type * from './types';\nexport type { Performer, CreatePerformerParams } from './resources/performers';\nexport type { Schedule, CreateScheduleParams, UpdateScheduleParams } from './resources/schedules';\nexport type { Brand, CreateBrandParams } from './resources/brands';\nexport type { WebhookDelivery, WebhookTestResult } from './resources/webhooks';\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/validate.ts","../src/utils/price.ts","../src/resources/events.ts","../src/resources/tickets.ts","../src/resources/orders.ts","../src/resources/venues.ts","../src/resources/webhooks.ts","../src/resources/performers.ts","../src/resources/schedules.ts","../src/resources/brands.ts","../src/utils/pagination.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ApiErrorBody } from './types';\n\nconst SCOPE_HINTS: Record<string, string> = {\n 'events:read': 'tn.events.list(), tn.events.get(), tn.venues.search()',\n 'events:write': 'tn.events.create(), tn.events.publish(), tn.performers, tn.schedules, tn.brands',\n 'tickets:read': 'tn.tickets.list(), tn.tickets.get()',\n 'tickets:write': 'tn.tickets.create(), tn.tickets.markSoldOut()',\n 'orders:read': 'tn.orders.list(), tn.orders.get()',\n 'webhooks:manage': 'tn.webhooks.create(), tn.webhooks.list()',\n};\n\n/**\n * Error thrown by the Ticketnation SDK for all API and network errors.\n *\n * @example\n * ```ts\n * try {\n * await tn.events.get('nonexistent');\n * } catch (error) {\n * if (error instanceof TicketnationError) {\n * console.log(error.code); // 'NOT_FOUND'\n * console.log(error.status); // 404\n * console.log(error.message); // 'Event not found: nonexistent'\n * console.log(error.requestId); // 'req_abc123' (for support)\n * }\n * }\n * ```\n */\nexport class TicketnationError extends Error {\n /** Machine-readable error code (e.g., 'NOT_FOUND', 'VALIDATION_ERROR', 'RATE_LIMITED') */\n readonly code: string;\n /** HTTP status code (0 for network/timeout errors) */\n readonly status: number;\n /** Unique request ID for debugging (include in support tickets) */\n readonly requestId: string | null;\n /** Field-level validation errors (only for VALIDATION_ERROR) */\n readonly details: Array<{ field: string; message: string }> | undefined;\n /** Suggested fix for common errors */\n readonly hint: string | null;\n\n constructor(\n message: string,\n opts: {\n code: string;\n status: number;\n requestId?: string;\n details?: Array<{ field: string; message: string }>;\n },\n ) {\n super(message);\n this.name = 'TicketnationError';\n this.code = opts.code;\n this.status = opts.status;\n this.requestId = opts.requestId ?? null;\n this.details = opts.details;\n this.hint = TicketnationError.getHint(opts.code, opts.status, message);\n }\n\n static fromResponse(status: number, body: { error: ApiErrorBody; requestId?: string }): TicketnationError {\n return new TicketnationError(body.error.message, {\n code: body.error.code,\n status,\n requestId: body.requestId,\n details: body.error.details,\n });\n }\n\n private static getHint(code: string, status: number, message: string): string | null {\n if (code === 'UNAUTHORIZED') {\n return 'Check your API key. Get one from Organizer Dashboard > Settings > API Keys.';\n }\n if (code === 'SCOPE_REQUIRED' || (code === 'FORBIDDEN' && status === 403)) {\n // Try to extract scope from message\n for (const [scope, methods] of Object.entries(SCOPE_HINTS)) {\n if (message.includes(scope)) {\n return `Your API key needs the \"${scope}\" scope for: ${methods}. Update it in Settings > API Keys.`;\n }\n }\n return 'Your API key lacks the required scope. Update it in Organizer Dashboard > Settings > API Keys.';\n }\n if (code === 'RATE_LIMITED') {\n return 'Too many requests. The SDK does NOT auto-retry on 429. Wait and try again.';\n }\n if (code === 'VALIDATION_ERROR') {\n return 'Check the \"details\" property for field-level errors.';\n }\n return null;\n }\n\n /** Serialize error for logging or API responses. */\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n status: this.status,\n message: this.message,\n requestId: this.requestId,\n details: this.details,\n hint: this.hint,\n };\n }\n\n /** Human-readable error summary. */\n toString(): string {\n let str = `TicketnationError [${this.code}] (${this.status}): ${this.message}`;\n if (this.requestId) str += ` (requestId: ${this.requestId})`;\n if (this.hint) str += `\\n Hint: ${this.hint}`;\n return str;\n }\n}\n","import { TicketnationError } from './errors';\n\nexport interface ClientConfig {\n apiKey: string;\n baseUrl: string;\n timeout: number;\n retries: number;\n debug: boolean;\n}\n\nexport class HttpClient {\n private readonly config: ClientConfig;\n\n constructor(config: ClientConfig) {\n this.config = config;\n }\n\n async request<T>(method: string, path: string, opts?: { body?: unknown; params?: Record<string, unknown> }): Promise<T> {\n const url = this.buildUrl(path, opts?.params);\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.config.retries; attempt++) {\n if (attempt > 0) {\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\n await this.sleep(delay);\n if (this.config.debug) {\n console.log(`[Ticketnation SDK] Retry attempt ${attempt}/${this.config.retries} for ${method} ${path}`);\n }\n }\n\n try {\n const response = await this.doRequest(method, url, opts?.body);\n return response as T;\n } catch (error) {\n lastError = error as Error;\n if (error instanceof TicketnationError && error.status < 500) {\n throw error;\n }\n }\n }\n\n throw lastError;\n }\n\n private async doRequest(method: string, url: string, body?: unknown): Promise<unknown> {\n if (this.config.debug) {\n const redactedKey = this.config.apiKey.slice(0, 6) + '...' + this.config.apiKey.slice(-4);\n console.log(`[Ticketnation SDK] ${method} ${url} (key: ${redactedKey})`);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const headers: Record<string, string> = {\n 'api-key': this.config.apiKey,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'User-Agent': 'ticketnation-sdk/1.0.2',\n };\n\n const init: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body && (method === 'POST' || method === 'PATCH' || method === 'PUT')) {\n init.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n throw new TicketnationError(`HTTP ${response.status}: ${response.statusText}`, {\n code: 'HTTP_ERROR',\n status: response.status,\n });\n }\n\n const parsed = errorBody as { error?: { code: string; message: string; details?: Array<{ field: string; message: string }> }; requestId?: string };\n if (parsed.error) {\n throw TicketnationError.fromResponse(response.status, parsed as { error: { code: string; message: string }; requestId?: string });\n }\n\n throw new TicketnationError(`HTTP ${response.status}: ${response.statusText}`, {\n code: 'HTTP_ERROR',\n status: response.status,\n });\n }\n\n if (response.status === 204) {\n return {};\n }\n\n return await response.json();\n } catch (error) {\n if (error instanceof TicketnationError) throw error;\n\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw new TicketnationError(`Request timed out after ${this.config.timeout}ms`, {\n code: 'TIMEOUT',\n status: 0,\n });\n }\n\n throw new TicketnationError(`Network error: ${(error as Error).message}`, {\n code: 'NETWORK_ERROR',\n status: 0,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const base = this.config.baseUrl.replace(/\\/$/, '');\n const url = new URL(`${base}${path}`);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * Client-side validation helpers.\n * These catch common mistakes before making an API call.\n */\n\nexport function required(value: unknown, fieldName: string): void {\n if (value === undefined || value === null || value === '') {\n throw new Error(`\"${fieldName}\" is required`);\n }\n}\n\nexport function requiredString(value: unknown, fieldName: string): void {\n required(value, fieldName);\n if (typeof value !== 'string') {\n throw new Error(`\"${fieldName}\" must be a string, got ${typeof value}`);\n }\n}\n\nexport function validDateString(value: unknown, fieldName: string): void {\n requiredString(value, fieldName);\n const date = new Date(value as string);\n if (isNaN(date.getTime())) {\n throw new Error(`\"${fieldName}\" must be a valid ISO 8601 date string, got \"${value}\"`);\n }\n}\n\nexport function validUrl(value: unknown, fieldName: string): void {\n if (value === undefined || value === null) return;\n if (typeof value !== 'string') {\n throw new Error(`\"${fieldName}\" must be a string URL, got ${typeof value}`);\n }\n try {\n new URL(value);\n } catch {\n throw new Error(`\"${fieldName}\" must be a valid URL, got \"${value}\"`);\n }\n}\n\nexport function positiveInt(value: unknown, fieldName: string): void {\n if (value === undefined || value === null) return;\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 1) {\n throw new Error(`\"${fieldName}\" must be a positive integer, got ${value}`);\n }\n}\n","/**\n * Format a price value to a human-readable Philippine Peso string.\n *\n * @example\n * ```ts\n * formatPeso(1000) // \"₱1,000.00\"\n * formatPeso(3500) // \"₱3,500.00\"\n * formatPeso(0) // \"Free\"\n * ```\n */\nexport function formatPeso(amount: number): string {\n if (amount === 0) return 'Free';\n return `₱${amount.toLocaleString('en-PH', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n}\n\n/**\n * Validate that a price is a non-negative integer.\n * Ticketnation prices are whole pesos (e.g., 1000 = ₱1,000).\n *\n * @throws Error if price is invalid\n */\nexport function validatePrice(price: number, fieldName = 'price'): void {\n if (typeof price !== 'number' || !Number.isFinite(price)) {\n throw new Error(`${fieldName} must be a finite number, got ${typeof price}`);\n }\n if (price < 0) {\n throw new Error(`${fieldName} must be non-negative, got ${price}`);\n }\n if (!Number.isInteger(price)) {\n throw new Error(`${fieldName} must be a whole number (pesos, not centavos). Got ${price} — did you mean ${Math.round(price)}?`);\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Event,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n DataResponse,\n PaginatedResponse,\n DeletedResponse,\n} from '../types';\nimport { required, requiredString, validDateString, validUrl } from '../utils/validate';\nimport { validatePrice } from '../utils/price';\n\n/**\n * Manage events on the Ticketnation marketplace.\n *\n * @example\n * ```ts\n * // Create and publish in one call\n * const event = await tn.events.createAndPublish({\n * name: 'Summer Fest',\n * dateTime: '2026-06-15T18:00:00Z',\n * tickets: [{ name: 'GA', price: 1000, quantity: 500, published: true }],\n * });\n * ```\n */\nexport class EventsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a new event in DRAFT status.\n * Optionally include inline ticket types, gallery images, and venue.\n *\n * @param params - Event creation parameters\n * @returns The created event (status: DRAFT)\n *\n * @example\n * ```ts\n * const event = await tn.events.create({\n * name: 'Summer Music Fest',\n * dateTime: '2026-06-15T18:00:00Z',\n * venueId: 'uuid',\n * imageUrl: 'https://example.com/banner.jpg',\n * galleryUrls: ['https://example.com/photo1.jpg'],\n * tickets: [\n * { name: 'GA', price: 1000, quantity: 500, published: true },\n * { name: 'VIP', price: 3500, quantity: 50, published: true },\n * ],\n * });\n * ```\n */\n async create(params: CreateEventParams): Promise<Event> {\n requiredString(params.name, 'name');\n validDateString(params.dateTime, 'dateTime');\n if (params.endDateTime) validDateString(params.endDateTime, 'endDateTime');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n if (params.venueId) requiredString(params.venueId, 'venueId');\n if (params.galleryUrls) {\n params.galleryUrls.forEach((url, i) => validUrl(url, `galleryUrls[${i}]`));\n }\n if (params.tickets) {\n params.tickets.forEach((t, i) => {\n requiredString(t.name, `tickets[${i}].name`);\n required(t.price, `tickets[${i}].price`);\n validatePrice(t.price, `tickets[${i}].price`);\n required(t.quantity, `tickets[${i}].quantity`);\n });\n }\n\n const res = await this.client.request<DataResponse<Event>>('POST', '/open-api/v1/events', { body: params });\n return res.data;\n }\n\n /**\n * Create an event and immediately publish it.\n * Convenience method that calls create() then publish().\n *\n * @returns The published event (status: PUBLISHED)\n */\n async createAndPublish(params: CreateEventParams): Promise<Event> {\n const event = await this.create(params);\n return this.publish(event.id);\n }\n\n /**\n * List events for your organization (paginated).\n *\n * @example\n * ```ts\n * const { data, meta } = await tn.events.list({ status: 'PUBLISHED', page: 1 });\n * console.log(`${meta.total} published events`);\n * ```\n */\n async list(params?: ListEventsParams): Promise<PaginatedResponse<Event>> {\n return this.client.request<PaginatedResponse<Event>>('GET', '/open-api/v1/events', {\n params: params ? { page: params.page, take: params.take, status: params.status, search: params.search } : undefined,\n });\n }\n\n /**\n * Get a single event by UUID or slug.\n *\n * @example\n * ```ts\n * const event = await tn.events.get('summer-music-fest');\n * // or\n * const event = await tn.events.get('uuid-event-id');\n * ```\n */\n async get(idOrSlug: string): Promise<Event> {\n requiredString(idOrSlug, 'idOrSlug');\n const res = await this.client.request<DataResponse<Event>>('GET', `/open-api/v1/events/${encodeURIComponent(idOrSlug)}`);\n return res.data;\n }\n\n /**\n * Update event fields. Only provided fields are changed.\n * Cannot update inline tickets — use `tn.tickets` methods instead.\n */\n async update(eventId: string, params: UpdateEventParams): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('PATCH', `/open-api/v1/events/${eventId}`, { body: params });\n return res.data;\n }\n\n /**\n * Publish a DRAFT event to the marketplace.\n * The event becomes visible to buyers on ticketnation.ph.\n */\n async publish(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/publish`);\n return res.data;\n }\n\n /**\n * Revert a PUBLISHED event back to DRAFT.\n * Removes it from the public marketplace.\n */\n async unpublish(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/unpublish`);\n return res.data;\n }\n\n /**\n * Archive an event. Hidden from marketplace but data is preserved.\n */\n async archive(eventId: string): Promise<Event> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Event>>('POST', `/open-api/v1/events/${eventId}/archive`);\n return res.data;\n }\n\n /**\n * Delete a DRAFT event. Only works if no tickets have been sold.\n * Published or archived events must be unpublished first.\n */\n async delete(eventId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Ticket,\n CreateTicketParams,\n UpdateTicketParams,\n DataResponse,\n DeletedResponse,\n} from '../types';\nimport { required, requiredString } from '../utils/validate';\nimport { validatePrice } from '../utils/price';\n\n/**\n * Manage ticket types for events.\n * Prices are in whole pesos (e.g., 1000 = ₱1,000).\n *\n * @example\n * ```ts\n * const ticket = await tn.tickets.create(eventId, {\n * name: 'VIP Pass',\n * price: 3500, // ₱3,500\n * quantity: 100,\n * published: true, // immediately available for sale\n * });\n * ```\n */\nexport class TicketsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a ticket type for an event.\n * Individual ticket inventory is auto-generated based on quantity.\n *\n * @param eventId - The event UUID\n * @param params - Ticket type details\n * @returns The created ticket type\n */\n async create(eventId: string, params: CreateTicketParams): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n required(params.price, 'price');\n validatePrice(params.price, 'price');\n required(params.quantity, 'quantity');\n if (params.quantity < 1) throw new Error('\"quantity\" must be at least 1');\n\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets`, { body: params });\n return res.data;\n }\n\n /**\n * List all ticket types for an event.\n */\n async list(eventId: string): Promise<Ticket[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Ticket[]>>('GET', `/open-api/v1/events/${eventId}/tickets`);\n return res.data;\n }\n\n /**\n * Get a single ticket type by ID.\n */\n async get(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('GET', `/open-api/v1/events/${eventId}/tickets/${ticketId}`);\n return res.data;\n }\n\n /**\n * Update a ticket type. Price and quantity changes are validated\n * against business rules (e.g., can't reduce below sold count).\n */\n async update(eventId: string, ticketId: string, params: UpdateTicketParams): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n if (params.price !== undefined) validatePrice(params.price, 'price');\n\n const res = await this.client.request<DataResponse<Ticket>>('PATCH', `/open-api/v1/events/${eventId}/tickets/${ticketId}`, { body: params });\n return res.data;\n }\n\n /**\n * Make a ticket type available for purchase.\n * The parent event must also be published for tickets to appear.\n */\n async publish(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets/${ticketId}/publish`);\n return res.data;\n }\n\n /**\n * Mark a ticket type as sold out (sets remainingQuantity to 0).\n * To restore availability, use update() to set a new quantity.\n */\n async markSoldOut(eventId: string, ticketId: string): Promise<Ticket> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<Ticket>>('POST', `/open-api/v1/events/${eventId}/tickets/${ticketId}/sold-out`);\n return res.data;\n }\n\n /**\n * Delete a ticket type. Only works if no tickets have been sold.\n */\n async delete(eventId: string, ticketId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(ticketId, 'ticketId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/tickets/${ticketId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Order,\n ListOrdersParams,\n DataResponse,\n PaginatedResponse,\n} from '../types';\nimport { requiredString } from '../utils/validate';\n\n/**\n * Read-only access to orders for your events.\n * Orders are created when buyers purchase tickets on ticketnation.ph.\n *\n * @example\n * ```ts\n * const { data: orders } = await tn.orders.list(eventId, { status: 'COMPLETED' });\n * for (const order of orders) {\n * console.log(`#${order.orderNumber}: ${order.user.firstName} — ₱${order.total}`);\n * }\n * ```\n */\nexport class OrdersResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * List orders for an event (paginated).\n * Filter by status to get only completed, pending, or refunded orders.\n *\n * @param eventId - The event UUID\n * @param params - Pagination and filter options\n */\n async list(eventId: string, params?: ListOrdersParams): Promise<PaginatedResponse<Order>> {\n requiredString(eventId, 'eventId');\n return this.client.request<PaginatedResponse<Order>>('GET', `/open-api/v1/events/${eventId}/orders`, {\n params: params ? { page: params.page, take: params.take, status: params.status } : undefined,\n });\n }\n\n /**\n * Get a single order by ID. Includes line items and payment details.\n *\n * @param orderId - The order UUID\n */\n async get(orderId: string): Promise<Order> {\n requiredString(orderId, 'orderId');\n const res = await this.client.request<DataResponse<Order>>('GET', `/open-api/v1/orders/${orderId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Venue,\n SearchVenuesParams,\n PaginatedResponse,\n} from '../types';\nimport { requiredString } from '../utils/validate';\n\n/**\n * Search public venues on Ticketnation.\n * Use the returned venue ID when creating events with a physical location.\n *\n * @example\n * ```ts\n * const { data: venues } = await tn.venues.search({ query: 'Mall of Asia' });\n * const event = await tn.events.create({\n * name: 'Concert',\n * dateTime: '2026-06-15T18:00:00Z',\n * venueId: venues[0].id, // ← link the venue\n * });\n * ```\n */\nexport class VenuesResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Search venues by name (case-insensitive substring match).\n *\n * @param params - Search query and pagination\n * @returns Paginated list of matching venues with address and coordinates\n */\n async search(params: SearchVenuesParams): Promise<PaginatedResponse<Venue>> {\n requiredString(params.query, 'query');\n return this.client.request<PaginatedResponse<Venue>>('GET', '/open-api/v1/venues/search', {\n params: { query: params.query, page: params.page, take: params.take },\n });\n }\n}\n","import type { HttpClient } from '../client';\nimport type {\n Webhook,\n WebhookWithSecret,\n CreateWebhookParams,\n UpdateWebhookParams,\n DataResponse,\n PaginatedResponse,\n DeletedResponse,\n} from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Delivery record for a webhook event. */\nexport interface WebhookDelivery {\n id: string;\n eventType: string;\n statusCode: number | null;\n success: boolean;\n attempts: number;\n createdAt: string;\n}\n\n/** Result of testing a webhook endpoint. */\nexport interface WebhookTestResult {\n success: boolean;\n statusCode: number | null;\n message: string;\n}\n\n/**\n * Manage webhook endpoints for real-time notifications.\n *\n * @example\n * ```ts\n * // Create a webhook — store the secret securely!\n * const webhook = await tn.webhooks.create({\n * url: 'https://api.example.com/webhooks/ticketnation',\n * events: ['order.completed', 'event.sold_out'],\n * });\n * console.log(webhook.secret); // whsec_... (only shown once)\n *\n * // Test it\n * const result = await tn.webhooks.test(webhook.id);\n * console.log(result.success); // true\n * ```\n */\nexport class WebhooksResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Create a webhook endpoint.\n * The response includes a `secret` field for HMAC signature verification.\n *\n * **Important:** The secret is only returned on creation. Store it securely.\n */\n async create(params: CreateWebhookParams): Promise<WebhookWithSecret> {\n validUrl(params.url, 'url');\n if (!params.events || params.events.length === 0) {\n throw new Error('\"events\" must contain at least one event type (e.g., \"order.completed\")');\n }\n const res = await this.client.request<DataResponse<WebhookWithSecret>>('POST', '/open-api/v1/webhooks', { body: params });\n return res.data;\n }\n\n /** List all webhooks for your API key. */\n async list(): Promise<Webhook[]> {\n const res = await this.client.request<DataResponse<Webhook[]>>('GET', '/open-api/v1/webhooks');\n return res.data;\n }\n\n /** Update a webhook's URL, events, or active status. */\n async update(webhookId: string, params: UpdateWebhookParams): Promise<Webhook> {\n requiredString(webhookId, 'webhookId');\n if (params.url) validUrl(params.url, 'url');\n const res = await this.client.request<DataResponse<Webhook>>('PATCH', `/open-api/v1/webhooks/${webhookId}`, { body: params });\n return res.data;\n }\n\n /** Delete a webhook and its delivery history. */\n async delete(webhookId: string): Promise<DeletedResponse> {\n requiredString(webhookId, 'webhookId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/webhooks/${webhookId}`);\n return res.data;\n }\n\n /** Send a test payload to verify your webhook endpoint works. */\n async test(webhookId: string): Promise<WebhookTestResult> {\n requiredString(webhookId, 'webhookId');\n const res = await this.client.request<DataResponse<WebhookTestResult>>('POST', `/open-api/v1/webhooks/${webhookId}/test`);\n return res.data;\n }\n\n /**\n * View delivery history for a webhook (paginated).\n * Useful for debugging failed deliveries.\n */\n async deliveries(webhookId: string, params?: { page?: number; take?: number }): Promise<PaginatedResponse<WebhookDelivery>> {\n requiredString(webhookId, 'webhookId');\n return this.client.request<PaginatedResponse<WebhookDelivery>>('GET', `/open-api/v1/webhooks/${webhookId}/deliveries`, {\n params: params ? { page: params.page, take: params.take } : undefined,\n });\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Parameters for creating a performer. */\nexport interface CreatePerformerParams {\n /** Performer/artist name */\n name: string;\n /** Bio or description */\n description?: string;\n /** Performer type */\n type?: 'SOLO' | 'GROUP' | 'DJ' | 'BAND' | 'SPEAKER' | 'HOST' | 'COMEDIAN' | 'OTHER';\n /** Public URL to performer image (hosted on your end) */\n imageUrl?: string;\n /** Facebook profile URL */\n facebook?: string;\n /** YouTube channel URL */\n youtube?: string;\n /** Instagram profile URL */\n instagram?: string;\n}\n\n/** Performer details. */\nexport interface Performer {\n id: string;\n name: string;\n description: string | null;\n type: string;\n slug: string | null;\n facebook: string | null;\n youtube: string | null;\n instagram: string | null;\n image: { id: string; url: string | null } | null;\n}\n\n/**\n * Manage performers/artists/speakers for events.\n *\n * @example\n * ```ts\n * await tn.performers.create(eventId, {\n * name: 'DJ Shadow',\n * type: 'SOLO',\n * imageUrl: 'https://example.com/dj-shadow.jpg',\n * });\n *\n * const performers = await tn.performers.list(eventId);\n * ```\n */\nexport class PerformersResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a performer to an event.\n * If `imageUrl` is provided, it will be displayed on the event page.\n *\n * @param eventId - The event UUID\n * @param params - Performer details\n */\n async create(eventId: string, params: CreatePerformerParams): Promise<Performer> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n const res = await this.client.request<DataResponse<Performer>>('POST', `/open-api/v1/events/${eventId}/performers`, { body: params });\n return res.data;\n }\n\n /** List all performers for an event. */\n async list(eventId: string): Promise<Performer[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Performer[]>>('GET', `/open-api/v1/events/${eventId}/performers`);\n return res.data;\n }\n\n /**\n * Remove a performer from an event.\n * This unlinks the performer — it doesn't delete the performer record.\n */\n async remove(eventId: string, performerId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(performerId, 'performerId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/performers/${performerId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validDateString } from '../utils/validate';\n\n/** Parameters for creating a schedule item. */\nexport interface CreateScheduleParams {\n /** Schedule item title (e.g., \"Doors Open\", \"DJ Shadow Live\") */\n title: string;\n /** Description of this schedule block */\n description?: string;\n /** Start time (ISO 8601) */\n startTime: string;\n /** End time (ISO 8601) */\n endTime: string;\n /** Emoji or icon name */\n icon?: string;\n /** Hex color code (e.g., \"#4f46e5\") */\n color?: string;\n /** Sort position (auto-assigned if not provided) */\n sortOrder?: number;\n /** Link this schedule item to a performer */\n performerId?: string;\n}\n\n/** Parameters for updating a schedule item. All fields optional. */\nexport interface UpdateScheduleParams {\n title?: string;\n description?: string;\n startTime?: string;\n endTime?: string;\n icon?: string;\n color?: string;\n sortOrder?: number;\n performerId?: string;\n}\n\n/** Schedule item details. */\nexport interface Schedule {\n id: string;\n title: string;\n description: string | null;\n startTime: string;\n endTime: string;\n icon: string | null;\n color: string | null;\n sortOrder: number;\n performerId: string | null;\n performer: { id: string; name: string } | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Manage event schedule / timeline items.\n *\n * @example\n * ```ts\n * // Create a full event schedule\n * await tn.schedules.create(eventId, {\n * title: 'Doors Open',\n * startTime: '2026-09-15T19:00:00Z',\n * endTime: '2026-09-15T19:30:00Z',\n * icon: '🎵',\n * });\n *\n * await tn.schedules.create(eventId, {\n * title: 'DJ Shadow Live',\n * startTime: '2026-09-15T21:00:00Z',\n * endTime: '2026-09-15T23:00:00Z',\n * performerId: performer.id, // link to a performer\n * });\n * ```\n */\nexport class SchedulesResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a schedule item to an event.\n *\n * @param eventId - The event UUID\n * @param params - Schedule item details\n */\n async create(eventId: string, params: CreateScheduleParams): Promise<Schedule> {\n requiredString(eventId, 'eventId');\n requiredString(params.title, 'title');\n validDateString(params.startTime, 'startTime');\n validDateString(params.endTime, 'endTime');\n const res = await this.client.request<DataResponse<Schedule>>('POST', `/open-api/v1/events/${eventId}/schedules`, { body: params });\n return res.data;\n }\n\n /** List all schedule items for an event, ordered by sortOrder. */\n async list(eventId: string): Promise<Schedule[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Schedule[]>>('GET', `/open-api/v1/events/${eventId}/schedules`);\n return res.data;\n }\n\n /** Update a schedule item. Only provided fields are changed. */\n async update(eventId: string, scheduleId: string, params: UpdateScheduleParams): Promise<Schedule> {\n requiredString(eventId, 'eventId');\n requiredString(scheduleId, 'scheduleId');\n if (params.startTime) validDateString(params.startTime, 'startTime');\n if (params.endTime) validDateString(params.endTime, 'endTime');\n const res = await this.client.request<DataResponse<Schedule>>('PATCH', `/open-api/v1/events/${eventId}/schedules/${scheduleId}`, { body: params });\n return res.data;\n }\n\n /** Delete a schedule item. */\n async remove(eventId: string, scheduleId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(scheduleId, 'scheduleId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/schedules/${scheduleId}`);\n return res.data;\n }\n}\n","import type { HttpClient } from '../client';\nimport type { DataResponse, DeletedResponse } from '../types';\nimport { requiredString, validUrl } from '../utils/validate';\n\n/** Parameters for creating a brand partner. */\nexport interface CreateBrandParams {\n /** Brand/sponsor name */\n name: string;\n /** Brand description */\n description?: string;\n /** Brand website URL */\n url?: string;\n /** Public URL to brand logo (hosted on your end) */\n imageUrl?: string;\n /** Display position (lower = first) */\n position?: number;\n}\n\n/** Brand partner details. */\nexport interface Brand {\n id: string;\n name: string;\n description: string | null;\n url: string | null;\n sponsorshipColor: string | null;\n image: { id: string; url: string | null } | null;\n position: number | null;\n}\n\n/**\n * Manage brand partners / sponsors for events.\n *\n * @example\n * ```ts\n * await tn.brands.create(eventId, {\n * name: 'Red Bull',\n * url: 'https://redbull.com',\n * imageUrl: 'https://example.com/redbull-logo.png',\n * });\n * ```\n */\nexport class BrandsResource {\n constructor(private readonly client: HttpClient) {}\n\n /**\n * Add a brand partner to an event.\n * If a brand with the same name already exists in your org, it will be reused.\n *\n * @param eventId - The event UUID\n * @param params - Brand details\n */\n async create(eventId: string, params: CreateBrandParams): Promise<Brand> {\n requiredString(eventId, 'eventId');\n requiredString(params.name, 'name');\n if (params.url) validUrl(params.url, 'url');\n if (params.imageUrl) validUrl(params.imageUrl, 'imageUrl');\n const res = await this.client.request<DataResponse<Brand>>('POST', `/open-api/v1/events/${eventId}/brands`, { body: params });\n return res.data;\n }\n\n /** List all brand partners for an event. */\n async list(eventId: string): Promise<Brand[]> {\n requiredString(eventId, 'eventId');\n const res = await this.client.request<DataResponse<Brand[]>>('GET', `/open-api/v1/events/${eventId}/brands`);\n return res.data;\n }\n\n /**\n * Remove a brand from an event.\n * This unlinks the brand — it doesn't delete the brand record.\n */\n async remove(eventId: string, brandId: string): Promise<DeletedResponse> {\n requiredString(eventId, 'eventId');\n requiredString(brandId, 'brandId');\n const res = await this.client.request<DataResponse<DeletedResponse>>('DELETE', `/open-api/v1/events/${eventId}/brands/${brandId}`);\n return res.data;\n }\n}\n","import type { PaginatedResponse, PaginationParams } from '../types';\n\nexport async function* paginate<T>(\n fetchPage: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n initialParams?: PaginationParams,\n): AsyncGenerator<T[], void, undefined> {\n let page = initialParams?.page ?? 1;\n const take = initialParams?.take ?? 10;\n\n while (true) {\n const response = await fetchPage({ page, take });\n yield response.data;\n\n if (page >= response.meta.totalPages) {\n break;\n }\n page++;\n }\n}\n\nexport async function fetchAllPages<T>(\n fetchPage: (params: PaginationParams) => Promise<PaginatedResponse<T>>,\n initialParams?: PaginationParams,\n): Promise<T[]> {\n const all: T[] = [];\n for await (const batch of paginate(fetchPage, initialParams)) {\n all.push(...batch);\n }\n return all;\n}\n","import { HttpClient } from './client';\nimport { EventsResource } from './resources/events';\nimport { TicketsResource } from './resources/tickets';\nimport { OrdersResource } from './resources/orders';\nimport { VenuesResource } from './resources/venues';\nimport { WebhooksResource } from './resources/webhooks';\nimport { PerformersResource } from './resources/performers';\nimport { SchedulesResource } from './resources/schedules';\nimport { BrandsResource } from './resources/brands';\nimport type { TicketnationConfig, AccountInfo, DataResponse } from './types';\n\n/**\n * Ticketnation SDK — publish events, manage tickets, and receive orders programmatically.\n *\n * @example\n * ```ts\n * import { Ticketnation } from 'ticketnation-sdk';\n *\n * const tn = new Ticketnation({ apiKey: 'tn_live_...' });\n *\n * // Create and publish an event in one call\n * const event = await tn.events.createAndPublish({\n * name: 'Summer Fest 2026',\n * dateTime: '2026-06-15T18:00:00Z',\n * imageUrl: 'https://example.com/banner.jpg',\n * tickets: [\n * { name: 'GA', price: 1000, quantity: 500, published: true },\n * ],\n * });\n *\n * // Add performers and schedule\n * const dj = await tn.performers.create(event.id, { name: 'DJ Shadow', type: 'SOLO' });\n * await tn.schedules.create(event.id, {\n * title: 'DJ Shadow Live',\n * startTime: '2026-06-15T21:00:00Z',\n * endTime: '2026-06-15T23:00:00Z',\n * performerId: dj.id,\n * });\n *\n * // Check orders\n * const { data: orders } = await tn.orders.list(event.id);\n * ```\n *\n * @see https://docs.ticketnation.ph/developers/overview\n */\nexport class Ticketnation {\n /** Create, list, update, publish, and delete events. */\n readonly events: EventsResource;\n /** Create, list, update, and manage ticket types. Prices are in whole pesos. */\n readonly tickets: TicketsResource;\n /** Read-only access to orders placed by buyers. */\n readonly orders: OrdersResource;\n /** Search public venues by name. */\n readonly venues: VenuesResource;\n /** Manage webhook endpoints for real-time notifications. */\n readonly webhooks: WebhooksResource;\n /** Add and manage performers/artists/speakers for events. */\n readonly performers: PerformersResource;\n /** Create event schedule / timeline items. */\n readonly schedules: SchedulesResource;\n /** Add brand partners / sponsors to events. */\n readonly brands: BrandsResource;\n\n private readonly client: HttpClient;\n\n /**\n * Create a new Ticketnation SDK instance.\n *\n * @param config - SDK configuration\n * @param config.apiKey - Your API key from Organizer Dashboard > Settings > API Keys\n * @param config.baseUrl - API base URL (default: https://api.ticketnation.ph)\n * @param config.timeout - Request timeout in ms (default: 30000)\n * @param config.retries - Retry count on 5xx errors (default: 2)\n * @param config.debug - Log requests with redacted API key (default: false)\n */\n constructor(config?: TicketnationConfig) {\n if (!config || !config.apiKey) {\n throw new Error(\n 'Ticketnation SDK requires an apiKey. Usage: new Ticketnation({ apiKey: process.env.TICKETNATION_API_KEY }). Get a key from Organizer Dashboard > Settings > API Keys.',\n );\n }\n\n this.client = new HttpClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.ticketnation.ph',\n timeout: config.timeout ?? 30000,\n retries: config.retries ?? 2,\n debug: config.debug ?? false,\n });\n\n this.events = new EventsResource(this.client);\n this.tickets = new TicketsResource(this.client);\n this.orders = new OrdersResource(this.client);\n this.venues = new VenuesResource(this.client);\n this.webhooks = new WebhooksResource(this.client);\n this.performers = new PerformersResource(this.client);\n this.schedules = new SchedulesResource(this.client);\n this.brands = new BrandsResource(this.client);\n }\n\n /**\n * Get information about your API key and organization.\n * Useful for verifying your key is correctly configured.\n *\n * @returns API key details (name, scopes, expiry) and organization info\n *\n * @example\n * ```ts\n * const info = await tn.me();\n * console.log(`Org: ${info.organization.name}`);\n * console.log(`Scopes: ${info.apiKey.scopes.join(', ')}`);\n * ```\n */\n async me(): Promise<AccountInfo> {\n const res = await this.client.request<DataResponse<AccountInfo>>('GET', '/open-api/v1/me');\n return res.data;\n }\n}\n\n// Re-export everything\nexport { TicketnationError } from './errors';\nexport { paginate, fetchAllPages } from './utils/pagination';\nexport { formatPeso, validatePrice } from './utils/price';\nexport type * from './types';\nexport type { Performer, CreatePerformerParams } from './resources/performers';\nexport type { Schedule, CreateScheduleParams, UpdateScheduleParams } from './resources/schedules';\nexport type { Brand, CreateBrandParams } from './resources/brands';\nexport type { WebhookDelivery, WebhookTestResult } from './resources/webhooks';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ticketnation-sdk",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "Official TypeScript SDK for the Ticketnation Open API — publish events, manage tickets, and receive orders programmatically.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",