htag-sdk 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -383,18 +383,18 @@ var TrendsClient = class {
383
383
  /**
384
384
  * Rent history trends.
385
385
  *
386
- * `GET /internal-api/v1/markets/trends/rent`
386
+ * `GET /v1/markets/trends/rent`
387
387
  */
388
388
  async rent(params) {
389
- return this.trend("rent", params);
389
+ return this.publicTrend("rent", params);
390
390
  }
391
391
  /**
392
392
  * Yield history trends.
393
393
  *
394
- * `GET /internal-api/v1/markets/trends/yield`
394
+ * `GET /v1/markets/trends/yield`
395
395
  */
396
396
  async yieldHistory(params) {
397
- return this.trend("yield", params);
397
+ return this.publicTrend("yield", params);
398
398
  }
399
399
  /**
400
400
  * Supply and demand (monthly frequency).
@@ -431,18 +431,18 @@ var TrendsClient = class {
431
431
  /**
432
432
  * Growth rate cycle.
433
433
  *
434
- * `GET /internal-api/v1/markets/trends/growth-rates`
434
+ * `GET /v1/markets/trends/growth-rates`
435
435
  */
436
436
  async growthRates(params) {
437
- return this.trend("growth-rates", params);
437
+ return this.publicTrend("growth-rates", params);
438
438
  }
439
439
  /**
440
440
  * Demand profile breakdown.
441
441
  *
442
- * `GET /internal-api/v1/markets/trends/demand-profile`
442
+ * `GET /v1/markets/trends/demand-profile`
443
443
  */
444
444
  async demandProfile(params) {
445
- return this.trend("demand-profile", params);
445
+ return this.publicTrend("demand-profile", params);
446
446
  }
447
447
  // -----------------------------------------------------------------------
448
448
  // Shared implementation
@@ -455,6 +455,14 @@ var TrendsClient = class {
455
455
  { signal }
456
456
  );
457
457
  }
458
+ async publicTrend(metric, params) {
459
+ const { signal, ...query } = params;
460
+ const qs = buildQueryString(query);
461
+ return this.http.get(
462
+ `/v1/markets/trends/${metric}${qs}`,
463
+ { signal }
464
+ );
465
+ }
458
466
  };
459
467
 
460
468
  // src/markets/client.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/address/client.ts","../src/property/client.ts","../src/markets/trends.ts","../src/markets/client.ts","../src/intent-hub/client.ts","../src/client.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// @htag/sdk — Official TypeScript SDK for HtAG Location Intelligence APIs\n// ---------------------------------------------------------------------------\n\n// Main client\nexport { HtAgApiClient } from './client.js';\n\n// Configuration types\nexport type {\n HtAgClientOptions,\n ResolvedConfig,\n BaseResponse,\n RequestOptions,\n LevelEnum,\n PropertyTypeEnum,\n} from './types.js';\n\n// Error classes\nexport {\n HtAgError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n ServerError,\n} from './errors.js';\n\n// Address domain\nexport { AddressClient } from './address/index.js';\nexport type {\n AddressRecord,\n AddressSearchResult,\n AddressSearchParams,\n AddressSearchResponse,\n AddressInsightsParams,\n AddressInsightsResponse,\n BatchStandardiseParams,\n BatchStandardiseResponse,\n StandardisedAddress,\n} from './address/index.js';\n\n// Property domain\nexport { PropertyClient } from './property/index.js';\nexport type {\n SoldPropertyRecord,\n SoldSearchParams,\n SoldPropertiesResponse,\n} from './property/index.js';\n\n// Markets domain\nexport { MarketsClient, TrendsClient } from './markets/index.js';\nexport type {\n MarketSnapshot,\n PriceHistoryOut,\n RentHistoryOut,\n YieldHistoryOut,\n FSDMonthlyOut,\n FSDQuarterlyOut,\n FSDYearlyOut,\n EssentialsOut,\n GRCOut,\n DemandProfileOut,\n LogicNode,\n AdvancedSearchBody,\n SnapshotsParams,\n MarketQueryParams,\n TrendsParams,\n TrendsWithBedroomsParams,\n SnapshotsResponse,\n MarketQueryResponse,\n PriceResponse,\n RentResponse,\n YieldResponse,\n SupplyDemandResponse,\n SearchIndexResponse,\n HoldPeriodResponse,\n PerformanceResponse,\n GrowthRatesResponse,\n DemandProfileResponse,\n} from './markets/index.js';\n\n// Intent Hub domain\nexport { IntentHubClient } from './intent-hub/index.js';\nexport type {\n SourceType,\n IntegrationType,\n IntegrationStatus,\n Sentiment,\n Urgency,\n SubmitEventParams,\n ClassifiedEvent,\n QueryEventsParams,\n PaginatedEvents,\n CreateIntegrationParams,\n UpdateIntegrationParams,\n Integration,\n TestResult,\n CreateSubscriptionParams,\n UpdateSubscriptionParams,\n Subscription,\n EventCategory,\n EventType,\n TagInfo,\n} from './intent-hub/index.js';\n","/**\n * Base error class for all HtAG SDK errors.\n */\nexport class HtAgError extends Error {\n /** HTTP status code, if available. */\n readonly status: number | undefined;\n\n /** Raw response body, if available. */\n readonly body: unknown;\n\n /** The request URL that caused the error. */\n readonly url: string | undefined;\n\n constructor(\n message: string,\n options?: {\n status?: number;\n body?: unknown;\n url?: string;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options?.cause });\n this.name = 'HtAgError';\n this.status = options?.status;\n this.body = options?.body;\n this.url = options?.url;\n }\n}\n\n/**\n * Thrown when the server returns 401 or 403.\n */\nexport class AuthenticationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(\n `Authentication failed (HTTP ${options.status}). Check your API key.`,\n options,\n );\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Thrown when the server returns 429 after exhausting all retries.\n */\nexport class RateLimitError extends HtAgError {\n constructor(options: { body: unknown; url: string }) {\n super('Rate limit exceeded. Please retry after a short delay.', {\n status: 429,\n ...options,\n });\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Thrown when the server returns 400 or 422.\n */\nexport class ValidationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n const detail = extractDetail(options.body);\n super(\n detail\n ? `Validation error (HTTP ${options.status}): ${detail}`\n : `Validation error (HTTP ${options.status})`,\n options,\n );\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Thrown when the server returns a 5xx status after exhausting all retries.\n */\nexport class ServerError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(`Server error (HTTP ${options.status})`, options);\n this.name = 'ServerError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractDetail(body: unknown): string | undefined {\n if (body && typeof body === 'object' && 'detail' in body) {\n const detail = (body as Record<string, unknown>).detail;\n if (typeof detail === 'string') return detail;\n if (Array.isArray(detail)) {\n return detail\n .map((d) => {\n if (typeof d === 'string') return d;\n if (d && typeof d === 'object' && 'msg' in d) return String(d.msg);\n return JSON.stringify(d);\n })\n .join('; ');\n }\n return JSON.stringify(detail);\n }\n return undefined;\n}\n","import type { ResolvedConfig, RequestOptions } from './types.js';\nimport {\n HtAgError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n ServerError,\n} from './errors.js';\n\n// ---------------------------------------------------------------------------\n// camelCase -> snake_case conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a camelCase string to snake_case.\n *\n * Handles sequences of uppercase letters correctly:\n * - \"areaId\" -> \"area_id\"\n * - \"periodEndMin\" -> \"period_end_min\"\n * - \"IRSD\" -> \"irsd\" (all-caps treated as one token)\n */\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase();\n}\n\n// ---------------------------------------------------------------------------\n// Query-string builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a URL query string from a params object, converting camelCase keys\n * to snake_case. Arrays are joined with commas. `undefined` and `null` values\n * are omitted.\n */\nexport function buildQueryString(\n params: Record<string, unknown>,\n): string {\n const parts: string[] = [];\n\n for (const [key, value] of Object.entries(params)) {\n // Skip internal SDK options that are not API params.\n if (key === 'signal') continue;\n if (value === undefined || value === null) continue;\n\n const snakeKey = toSnakeCase(key);\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(value.join(','))}`,\n );\n }\n } else {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(String(value))}`,\n );\n }\n }\n\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n}\n\n// ---------------------------------------------------------------------------\n// Retryable HTTP client\n// ---------------------------------------------------------------------------\n\nfunction isRetryable(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the body of a response. Returns the parsed JSON on success or a string\n * representation when parsing fails.\n */\nasync function parseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n return await response.json();\n } catch {\n return await response.text();\n }\n }\n return await response.text();\n}\n\n/**\n * Throw the appropriate typed error for the given HTTP status.\n */\nfunction throwForStatus(\n status: number,\n body: unknown,\n url: string,\n): never {\n if (status === 401 || status === 403) {\n throw new AuthenticationError({ status, body, url });\n }\n if (status === 429) {\n throw new RateLimitError({ body, url });\n }\n if (status === 400 || status === 422) {\n throw new ValidationError({ status, body, url });\n }\n if (status >= 500) {\n throw new ServerError({ status, body, url });\n }\n throw new HtAgError(`HTTP ${status}`, { status, body, url });\n}\n\n/**\n * Internal HTTP transport used by all domain clients.\n */\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n /**\n * Execute a GET request against the public API base.\n */\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the public API base.\n */\n async post<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the public API base.\n */\n async patch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the public API base.\n */\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a GET request against the internal API base.\n */\n async internalGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.internalBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the internal API base.\n */\n async internalPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.internalBaseUrl + path, body, options);\n }\n\n /**\n * Execute a GET request against the Intent Hub API base.\n */\n async intentHubGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the Intent Hub API base.\n */\n async intentHubPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the Intent Hub API base.\n */\n async intentHubPatch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the Intent Hub API base.\n */\n async intentHubDelete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n // -----------------------------------------------------------------------\n // Core request implementation with retries and exponential backoff\n // -----------------------------------------------------------------------\n\n private async request<T>(\n method: string,\n url: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const headers: Record<string, string> = {\n 'x-api-key': this.config.apiKey,\n 'accept': 'application/json',\n };\n\n if (body !== undefined) {\n headers['content-type'] = 'application/json';\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n // If this is a retry, wait with exponential backoff + jitter.\n if (attempt > 0) {\n const base = this.config.retryBaseDelay * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base * 0.5;\n await sleep(base + jitter);\n }\n\n // Build an AbortController that combines the user signal with a timeout.\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n };\n\n // Wire up caller's abort signal.\n if (options?.signal) {\n if (options.signal.aborted) {\n throw new HtAgError('Request aborted', {\n url,\n cause: options.signal.reason,\n });\n }\n options.signal.addEventListener('abort', () => controller.abort(options.signal!.reason), {\n once: true,\n });\n }\n\n timeoutId = setTimeout(\n () => controller.abort(new Error('Request timed out')),\n this.config.timeout,\n );\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n cleanup();\n\n if (response.ok) {\n // 204 No Content — nothing to parse.\n if (response.status === 204) {\n return undefined as T;\n }\n return (await parseBody(response)) as T;\n }\n\n const responseBody = await parseBody(response);\n\n // Retry on retryable statuses, unless we've exhausted retries.\n if (isRetryable(response.status) && attempt < this.config.maxRetries) {\n lastError = new HtAgError(`HTTP ${response.status}`, {\n status: response.status,\n body: responseBody,\n url,\n });\n continue;\n }\n\n // Non-retryable or exhausted retries — throw typed error.\n throwForStatus(response.status, responseBody, url);\n } catch (err) {\n cleanup();\n\n // Re-throw our own typed errors.\n if (err instanceof HtAgError) {\n throw err;\n }\n\n // Handle abort / timeout.\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) {\n throw new HtAgError('Request aborted', { url, cause: err });\n }\n throw new HtAgError('Request timed out', { url, cause: err });\n }\n\n // Network / fetch errors — retry if we have attempts left.\n if (attempt < this.config.maxRetries) {\n lastError = err instanceof Error ? err : new Error(String(err));\n continue;\n }\n\n throw new HtAgError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n { url, cause: err },\n );\n }\n }\n\n // Should not reach here, but just in case.\n throw lastError ?? new HtAgError('Request failed after retries', { url });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n AddressSearchParams,\n AddressSearchResponse,\n AddressInsightsParams,\n AddressInsightsResponse,\n BatchStandardiseParams,\n BatchStandardiseResponse,\n} from './types.js';\n\n/**\n * Client for the Address API domain.\n *\n * ```ts\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class AddressClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for addresses matching a free-text query.\n *\n * `GET /v1/address/search`\n */\n async search(params: AddressSearchParams): Promise<AddressSearchResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressSearchResponse>(`/v1/address/search${qs}`, { signal });\n }\n\n /**\n * Retrieve detailed insights for one or more addresses.\n *\n * `GET /v1/address/insights`\n */\n async insights(params: AddressInsightsParams): Promise<AddressInsightsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressInsightsResponse>(`/v1/address/insights${qs}`, { signal });\n }\n\n /**\n * Standardise a batch of raw address strings into structured records.\n *\n * `POST /v1/address/standardise`\n */\n async standardise(params: BatchStandardiseParams): Promise<BatchStandardiseResponse> {\n const { signal, addresses } = params;\n return this.http.post<BatchStandardiseResponse>(\n '/v1/address/standardise',\n { addresses },\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n SoldSearchParams,\n SoldPropertiesResponse,\n} from './types.js';\n\n/**\n * Client for the Property API domain.\n *\n * ```ts\n * const sold = await client.property.soldSearch({ address: '100 George St Sydney', radius: 2000 });\n * ```\n */\nexport class PropertyClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for recently sold properties near a location.\n *\n * `GET /v1/property/sold/search`\n */\n async soldSearch(params: SoldSearchParams): Promise<SoldPropertiesResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<SoldPropertiesResponse>(`/v1/property/sold/search${qs}`, { signal });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n TrendsParams,\n TrendsWithBedroomsParams,\n PriceResponse,\n RentResponse,\n YieldResponse,\n SupplyDemandResponse,\n SearchIndexResponse,\n HoldPeriodResponse,\n PerformanceResponse,\n GrowthRatesResponse,\n DemandProfileResponse,\n} from './types.js';\n\n/**\n * Client for the Markets Trends API domain.\n *\n * Each method queries a specific time-series metric:\n *\n * ```ts\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * propertyType: ['house'],\n * });\n * ```\n */\nexport class TrendsClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Price history trends.\n *\n * `GET /internal-api/v1/markets/trends/price`\n */\n async price(params: TrendsWithBedroomsParams): Promise<PriceResponse> {\n return this.trend<PriceResponse>('price', params);\n }\n\n /**\n * Rent history trends.\n *\n * `GET /internal-api/v1/markets/trends/rent`\n */\n async rent(params: TrendsWithBedroomsParams): Promise<RentResponse> {\n return this.trend<RentResponse>('rent', params);\n }\n\n /**\n * Yield history trends.\n *\n * `GET /internal-api/v1/markets/trends/yield`\n */\n async yieldHistory(params: TrendsWithBedroomsParams): Promise<YieldResponse> {\n return this.trend<YieldResponse>('yield', params);\n }\n\n /**\n * Supply and demand (monthly frequency).\n *\n * `GET /internal-api/v1/markets/trends/supply-demand`\n */\n async supplyDemand(params: TrendsWithBedroomsParams): Promise<SupplyDemandResponse> {\n return this.trend<SupplyDemandResponse>('supply-demand', params);\n }\n\n /**\n * Search interest index (quarterly frequency).\n *\n * `GET /internal-api/v1/markets/trends/search-index`\n */\n async searchIndex(params: TrendsParams): Promise<SearchIndexResponse> {\n return this.trend<SearchIndexResponse>('search-index', params);\n }\n\n /**\n * Hold period (yearly frequency).\n *\n * `GET /internal-api/v1/markets/trends/hold-period`\n */\n async holdPeriod(params: TrendsParams): Promise<HoldPeriodResponse> {\n return this.trend<HoldPeriodResponse>('hold-period', params);\n }\n\n /**\n * Performance essentials.\n *\n * `GET /internal-api/v1/markets/trends/performance`\n */\n async performance(params: TrendsWithBedroomsParams): Promise<PerformanceResponse> {\n return this.trend<PerformanceResponse>('performance', params);\n }\n\n /**\n * Growth rate cycle.\n *\n * `GET /internal-api/v1/markets/trends/growth-rates`\n */\n async growthRates(params: TrendsParams): Promise<GrowthRatesResponse> {\n return this.trend<GrowthRatesResponse>('growth-rates', params);\n }\n\n /**\n * Demand profile breakdown.\n *\n * `GET /internal-api/v1/markets/trends/demand-profile`\n */\n async demandProfile(params: TrendsParams): Promise<DemandProfileResponse> {\n return this.trend<DemandProfileResponse>('demand-profile', params);\n }\n\n // -----------------------------------------------------------------------\n // Shared implementation\n // -----------------------------------------------------------------------\n\n private async trend<T>(metric: string, params: TrendsParams | TrendsWithBedroomsParams): Promise<T> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<T>(\n `/internal-api/v1/markets/trends/${metric}${qs}`,\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport { TrendsClient } from './trends.js';\nimport type {\n SnapshotsParams,\n SnapshotsResponse,\n AdvancedSearchBody,\n MarketQueryResponse,\n} from './types.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Client for the Markets API domain.\n *\n * ```ts\n * const snapshots = await client.markets.snapshots({\n * level: 'suburb',\n * propertyType: ['house'],\n * });\n *\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * });\n * ```\n */\nexport class MarketsClient {\n /** Sub-client for time-series trend endpoints. */\n readonly trends: TrendsClient;\n\n /** @internal */\n constructor(private readonly http: HttpClient) {\n this.trends = new TrendsClient(http);\n }\n\n /**\n * Retrieve market snapshot data with optional filters.\n *\n * `GET /internal-api/v1/markets/snapshots`\n */\n async snapshots(params: SnapshotsParams): Promise<SnapshotsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<SnapshotsResponse>(\n `/internal-api/v1/markets/snapshots${qs}`,\n { signal },\n );\n }\n\n /**\n * Advanced market query with logical filter expressions.\n *\n * `POST /internal-api/v1/markets/query`\n */\n async query(\n body: AdvancedSearchBody,\n options?: RequestOptions,\n ): Promise<MarketQueryResponse> {\n return this.http.internalPost<MarketQueryResponse>(\n '/internal-api/v1/markets/query',\n body,\n options,\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type { RequestOptions } from '../types.js';\nimport type {\n SubmitEventParams,\n ClassifiedEvent,\n QueryEventsParams,\n PaginatedEvents,\n CreateIntegrationParams,\n Integration,\n UpdateIntegrationParams,\n TestResult,\n CreateSubscriptionParams,\n Subscription,\n UpdateSubscriptionParams,\n EventCategory,\n EventType,\n TagInfo,\n} from './types.js';\n\n/**\n * Client for the Intent Hub API domain.\n *\n * ```ts\n * const event = await client.intentHub.submitEvent({\n * sourceType: 'AGENT',\n * sourceId: 'my-agent',\n * textContent: 'User wants to refinance their mortgage',\n * });\n * ```\n */\nexport class IntentHubClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n /**\n * Submit a raw event for classification.\n *\n * `POST /intent-hub/v1/events`\n */\n async submitEvent(params: SubmitEventParams): Promise<ClassifiedEvent> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<ClassifiedEvent>(\n '/events',\n {\n source_type: rest.sourceType,\n source_id: rest.sourceId,\n text_content: rest.textContent,\n payload: rest.payload,\n user_id: rest.userId,\n session_id: rest.sessionId,\n suggested_category: rest.suggestedCategory,\n suggested_intent: rest.suggestedIntent,\n idempotency_key: rest.idempotencyKey,\n event_type: rest.eventType,\n },\n { signal },\n );\n }\n\n /**\n * Retrieve a single classified event by ID.\n *\n * `GET /intent-hub/v1/events/:eventId`\n */\n async getEvent(eventId: string, options?: RequestOptions): Promise<ClassifiedEvent> {\n return this.http.intentHubGet<ClassifiedEvent>(\n `/events/${encodeURIComponent(eventId)}`,\n options,\n );\n }\n\n /**\n * Query classified events with optional filters.\n *\n * `GET /intent-hub/v1/events`\n */\n async queryEvents(params?: QueryEventsParams): Promise<PaginatedEvents> {\n if (!params) {\n return this.http.intentHubGet<PaginatedEvents>('/events');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<PaginatedEvents>(`/events${qs}`, { signal });\n }\n\n // -------------------------------------------------------------------------\n // Integrations\n // -------------------------------------------------------------------------\n\n /**\n * Create a new integration endpoint.\n *\n * `POST /intent-hub/v1/integrations`\n */\n async createIntegration(params: CreateIntegrationParams): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Integration>(\n '/integrations',\n {\n name: rest.name,\n type: rest.type,\n url: rest.url,\n secret: rest.secret,\n headers: rest.headers,\n config: rest.config,\n },\n { signal },\n );\n }\n\n /**\n * List all integrations for the current organisation.\n *\n * `GET /intent-hub/v1/integrations`\n */\n async listIntegrations(options?: RequestOptions): Promise<Integration[]> {\n return this.http.intentHubGet<Integration[]>('/integrations', options);\n }\n\n /**\n * Retrieve a single integration by ID.\n *\n * `GET /intent-hub/v1/integrations/:id`\n */\n async getIntegration(id: string, options?: RequestOptions): Promise<Integration> {\n return this.http.intentHubGet<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing integration.\n *\n * `PATCH /intent-hub/v1/integrations/:id`\n */\n async updateIntegration(\n id: string,\n params: UpdateIntegrationParams,\n ): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n {\n name: rest.name,\n url: rest.url,\n secret: rest.secret,\n status: rest.status,\n },\n { signal },\n );\n }\n\n /**\n * Delete an integration by ID.\n *\n * `DELETE /intent-hub/v1/integrations/:id`\n */\n async deleteIntegration(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Send a test event to an integration endpoint.\n *\n * `POST /intent-hub/v1/integrations/:id/test`\n */\n async testIntegration(id: string, options?: RequestOptions): Promise<TestResult> {\n return this.http.intentHubPost<TestResult>(\n `/integrations/${encodeURIComponent(id)}/test`,\n {},\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Subscriptions\n // -------------------------------------------------------------------------\n\n /**\n * Create a new subscription linking event patterns to an integration.\n *\n * `POST /intent-hub/v1/subscriptions`\n */\n async createSubscription(params: CreateSubscriptionParams): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Subscription>(\n '/subscriptions',\n {\n integration_id: rest.integrationId,\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n filters: rest.filters,\n },\n { signal },\n );\n }\n\n /**\n * List all subscriptions for the current organisation.\n *\n * `GET /intent-hub/v1/subscriptions`\n */\n async listSubscriptions(options?: RequestOptions): Promise<Subscription[]> {\n return this.http.intentHubGet<Subscription[]>('/subscriptions', options);\n }\n\n /**\n * Retrieve a single subscription by ID.\n *\n * `GET /intent-hub/v1/subscriptions/:id`\n */\n async getSubscription(id: string, options?: RequestOptions): Promise<Subscription> {\n return this.http.intentHubGet<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing subscription.\n *\n * `PATCH /intent-hub/v1/subscriptions/:id`\n */\n async updateSubscription(\n id: string,\n params: UpdateSubscriptionParams,\n ): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n {\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n integration_id: rest.integrationId,\n is_active: rest.isActive,\n },\n { signal },\n );\n }\n\n /**\n * Delete a subscription by ID.\n *\n * `DELETE /intent-hub/v1/subscriptions/:id`\n */\n async deleteSubscription(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Catalog\n // -------------------------------------------------------------------------\n\n /**\n * List all event categories in the taxonomy.\n *\n * `GET /intent-hub/v1/catalog/categories`\n */\n async listCategories(options?: RequestOptions): Promise<EventCategory[]> {\n return this.http.intentHubGet<EventCategory[]>('/catalog/categories', options);\n }\n\n /**\n * List event types, optionally filtered by category.\n *\n * `GET /intent-hub/v1/catalog/event-types`\n */\n async listEventTypes(\n params?: { category?: string } & RequestOptions,\n ): Promise<EventType[]> {\n if (!params) {\n return this.http.intentHubGet<EventType[]>('/catalog/event-types');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<EventType[]>(`/catalog/event-types${qs}`, { signal });\n }\n\n /**\n * List all tags with their usage counts.\n *\n * `GET /intent-hub/v1/catalog/tags`\n */\n async listTags(options?: RequestOptions): Promise<TagInfo[]> {\n return this.http.intentHubGet<TagInfo[]>('/catalog/tags', options);\n }\n}\n","import type { HtAgClientOptions, ResolvedConfig } from './types.js';\nimport { HttpClient } from './http.js';\nimport { AddressClient } from './address/client.js';\nimport { PropertyClient } from './property/client.js';\nimport { MarketsClient } from './markets/client.js';\nimport { IntentHubClient } from './intent-hub/client.js';\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_BASE_DELAY = 500; // ms\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds\n\n/**\n * Build the environment-derived base URLs.\n *\n * - `prod` -> `https://api.prod.htagai.com`\n * - `dev` -> `https://api.dev.htagai.com`\n */\nfunction resolveBaseUrls(options: HtAgClientOptions): {\n publicBaseUrl: string;\n internalBaseUrl: string;\n intentHubBaseUrl: string;\n} {\n if (options.baseUrl) {\n // Strip trailing slashes for consistency.\n const base = options.baseUrl.replace(/\\/+$/, '');\n return { publicBaseUrl: base, internalBaseUrl: base, intentHubBaseUrl: base };\n }\n\n const env = options.environment ?? 'prod';\n const base = `https://api.${env}.htagai.com`;\n return {\n publicBaseUrl: base,\n internalBaseUrl: base,\n intentHubBaseUrl: `${base}/intent-hub/v1`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// HtAgApiClient\n// ---------------------------------------------------------------------------\n\n/**\n * Top-level client for the HtAG Location Intelligence APIs.\n *\n * ```ts\n * import { HtAgApiClient } from '@htag/sdk';\n *\n * const client = new HtAgApiClient({\n * apiKey: process.env.HTAG_API_KEY!,\n * environment: 'prod',\n * });\n *\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class HtAgApiClient {\n /** Address search, insights and standardisation. */\n readonly address: AddressClient;\n\n /** Sold property search. */\n readonly property: PropertyClient;\n\n /** Market snapshots, advanced queries and time-series trends. */\n readonly markets: MarketsClient;\n\n /** Intent Hub: event classification, integrations and subscriptions. */\n readonly intentHub: IntentHubClient;\n\n constructor(options: HtAgClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'HtAgApiClient requires an apiKey. Pass it in the constructor options.',\n );\n }\n\n const { publicBaseUrl, internalBaseUrl, intentHubBaseUrl } = resolveBaseUrls(options);\n\n const config: ResolvedConfig = {\n apiKey: options.apiKey,\n publicBaseUrl,\n internalBaseUrl,\n intentHubBaseUrl,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n retryBaseDelay: options.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n };\n\n const http = new HttpClient(config);\n\n this.address = new AddressClient(http);\n this.property = new PropertyClient(http);\n this.markets = new MarketsClient(http);\n this.intentHub = new IntentHubClient(http);\n }\n}\n"],"mappings":"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","names":["base"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/address/client.ts","../src/property/client.ts","../src/markets/trends.ts","../src/markets/client.ts","../src/intent-hub/client.ts","../src/client.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// @htag/sdk — Official TypeScript SDK for HtAG Location Intelligence APIs\n// ---------------------------------------------------------------------------\n\n// Main client\nexport { HtAgApiClient } from './client.js';\n\n// Configuration types\nexport type {\n HtAgClientOptions,\n ResolvedConfig,\n BaseResponse,\n RequestOptions,\n LevelEnum,\n PropertyTypeEnum,\n} from './types.js';\n\n// Error classes\nexport {\n HtAgError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n ServerError,\n} from './errors.js';\n\n// Address domain\nexport { AddressClient } from './address/index.js';\nexport type {\n AddressRecord,\n AddressSearchResult,\n AddressSearchParams,\n AddressSearchResponse,\n AddressInsightsParams,\n AddressInsightsResponse,\n BatchStandardiseParams,\n BatchStandardiseResponse,\n StandardisedAddress,\n} from './address/index.js';\n\n// Property domain\nexport { PropertyClient } from './property/index.js';\nexport type {\n SoldPropertyRecord,\n SoldSearchParams,\n SoldPropertiesResponse,\n} from './property/index.js';\n\n// Markets domain\nexport { MarketsClient, TrendsClient } from './markets/index.js';\nexport type {\n MarketSnapshot,\n PriceHistoryOut,\n RentHistoryOut,\n YieldHistoryOut,\n FSDMonthlyOut,\n FSDQuarterlyOut,\n FSDYearlyOut,\n EssentialsOut,\n GRCOut,\n DemandProfileOut,\n LogicNode,\n AdvancedSearchBody,\n SnapshotsParams,\n MarketQueryParams,\n TrendsParams,\n TrendsWithBedroomsParams,\n SnapshotsResponse,\n MarketQueryResponse,\n PriceResponse,\n RentResponse,\n YieldResponse,\n SupplyDemandResponse,\n SearchIndexResponse,\n HoldPeriodResponse,\n PerformanceResponse,\n GrowthRatesResponse,\n DemandProfileResponse,\n} from './markets/index.js';\n\n// Intent Hub domain\nexport { IntentHubClient } from './intent-hub/index.js';\nexport type {\n SourceType,\n IntegrationType,\n IntegrationStatus,\n Sentiment,\n Urgency,\n SubmitEventParams,\n ClassifiedEvent,\n QueryEventsParams,\n PaginatedEvents,\n CreateIntegrationParams,\n UpdateIntegrationParams,\n Integration,\n TestResult,\n CreateSubscriptionParams,\n UpdateSubscriptionParams,\n Subscription,\n EventCategory,\n EventType,\n TagInfo,\n} from './intent-hub/index.js';\n","/**\n * Base error class for all HtAG SDK errors.\n */\nexport class HtAgError extends Error {\n /** HTTP status code, if available. */\n readonly status: number | undefined;\n\n /** Raw response body, if available. */\n readonly body: unknown;\n\n /** The request URL that caused the error. */\n readonly url: string | undefined;\n\n constructor(\n message: string,\n options?: {\n status?: number;\n body?: unknown;\n url?: string;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options?.cause });\n this.name = 'HtAgError';\n this.status = options?.status;\n this.body = options?.body;\n this.url = options?.url;\n }\n}\n\n/**\n * Thrown when the server returns 401 or 403.\n */\nexport class AuthenticationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(\n `Authentication failed (HTTP ${options.status}). Check your API key.`,\n options,\n );\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Thrown when the server returns 429 after exhausting all retries.\n */\nexport class RateLimitError extends HtAgError {\n constructor(options: { body: unknown; url: string }) {\n super('Rate limit exceeded. Please retry after a short delay.', {\n status: 429,\n ...options,\n });\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Thrown when the server returns 400 or 422.\n */\nexport class ValidationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n const detail = extractDetail(options.body);\n super(\n detail\n ? `Validation error (HTTP ${options.status}): ${detail}`\n : `Validation error (HTTP ${options.status})`,\n options,\n );\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Thrown when the server returns a 5xx status after exhausting all retries.\n */\nexport class ServerError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(`Server error (HTTP ${options.status})`, options);\n this.name = 'ServerError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractDetail(body: unknown): string | undefined {\n if (body && typeof body === 'object' && 'detail' in body) {\n const detail = (body as Record<string, unknown>).detail;\n if (typeof detail === 'string') return detail;\n if (Array.isArray(detail)) {\n return detail\n .map((d) => {\n if (typeof d === 'string') return d;\n if (d && typeof d === 'object' && 'msg' in d) return String(d.msg);\n return JSON.stringify(d);\n })\n .join('; ');\n }\n return JSON.stringify(detail);\n }\n return undefined;\n}\n","import type { ResolvedConfig, RequestOptions } from './types.js';\nimport {\n HtAgError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n ServerError,\n} from './errors.js';\n\n// ---------------------------------------------------------------------------\n// camelCase -> snake_case conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a camelCase string to snake_case.\n *\n * Handles sequences of uppercase letters correctly:\n * - \"areaId\" -> \"area_id\"\n * - \"periodEndMin\" -> \"period_end_min\"\n * - \"IRSD\" -> \"irsd\" (all-caps treated as one token)\n */\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase();\n}\n\n// ---------------------------------------------------------------------------\n// Query-string builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a URL query string from a params object, converting camelCase keys\n * to snake_case. Arrays are joined with commas. `undefined` and `null` values\n * are omitted.\n */\nexport function buildQueryString(\n params: Record<string, unknown>,\n): string {\n const parts: string[] = [];\n\n for (const [key, value] of Object.entries(params)) {\n // Skip internal SDK options that are not API params.\n if (key === 'signal') continue;\n if (value === undefined || value === null) continue;\n\n const snakeKey = toSnakeCase(key);\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(value.join(','))}`,\n );\n }\n } else {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(String(value))}`,\n );\n }\n }\n\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n}\n\n// ---------------------------------------------------------------------------\n// Retryable HTTP client\n// ---------------------------------------------------------------------------\n\nfunction isRetryable(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the body of a response. Returns the parsed JSON on success or a string\n * representation when parsing fails.\n */\nasync function parseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n return await response.json();\n } catch {\n return await response.text();\n }\n }\n return await response.text();\n}\n\n/**\n * Throw the appropriate typed error for the given HTTP status.\n */\nfunction throwForStatus(\n status: number,\n body: unknown,\n url: string,\n): never {\n if (status === 401 || status === 403) {\n throw new AuthenticationError({ status, body, url });\n }\n if (status === 429) {\n throw new RateLimitError({ body, url });\n }\n if (status === 400 || status === 422) {\n throw new ValidationError({ status, body, url });\n }\n if (status >= 500) {\n throw new ServerError({ status, body, url });\n }\n throw new HtAgError(`HTTP ${status}`, { status, body, url });\n}\n\n/**\n * Internal HTTP transport used by all domain clients.\n */\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n /**\n * Execute a GET request against the public API base.\n */\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the public API base.\n */\n async post<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the public API base.\n */\n async patch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the public API base.\n */\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a GET request against the internal API base.\n */\n async internalGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.internalBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the internal API base.\n */\n async internalPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.internalBaseUrl + path, body, options);\n }\n\n /**\n * Execute a GET request against the Intent Hub API base.\n */\n async intentHubGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the Intent Hub API base.\n */\n async intentHubPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the Intent Hub API base.\n */\n async intentHubPatch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the Intent Hub API base.\n */\n async intentHubDelete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n // -----------------------------------------------------------------------\n // Core request implementation with retries and exponential backoff\n // -----------------------------------------------------------------------\n\n private async request<T>(\n method: string,\n url: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const headers: Record<string, string> = {\n 'x-api-key': this.config.apiKey,\n 'accept': 'application/json',\n };\n\n if (body !== undefined) {\n headers['content-type'] = 'application/json';\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n // If this is a retry, wait with exponential backoff + jitter.\n if (attempt > 0) {\n const base = this.config.retryBaseDelay * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base * 0.5;\n await sleep(base + jitter);\n }\n\n // Build an AbortController that combines the user signal with a timeout.\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n };\n\n // Wire up caller's abort signal.\n if (options?.signal) {\n if (options.signal.aborted) {\n throw new HtAgError('Request aborted', {\n url,\n cause: options.signal.reason,\n });\n }\n options.signal.addEventListener('abort', () => controller.abort(options.signal!.reason), {\n once: true,\n });\n }\n\n timeoutId = setTimeout(\n () => controller.abort(new Error('Request timed out')),\n this.config.timeout,\n );\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n cleanup();\n\n if (response.ok) {\n // 204 No Content — nothing to parse.\n if (response.status === 204) {\n return undefined as T;\n }\n return (await parseBody(response)) as T;\n }\n\n const responseBody = await parseBody(response);\n\n // Retry on retryable statuses, unless we've exhausted retries.\n if (isRetryable(response.status) && attempt < this.config.maxRetries) {\n lastError = new HtAgError(`HTTP ${response.status}`, {\n status: response.status,\n body: responseBody,\n url,\n });\n continue;\n }\n\n // Non-retryable or exhausted retries — throw typed error.\n throwForStatus(response.status, responseBody, url);\n } catch (err) {\n cleanup();\n\n // Re-throw our own typed errors.\n if (err instanceof HtAgError) {\n throw err;\n }\n\n // Handle abort / timeout.\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) {\n throw new HtAgError('Request aborted', { url, cause: err });\n }\n throw new HtAgError('Request timed out', { url, cause: err });\n }\n\n // Network / fetch errors — retry if we have attempts left.\n if (attempt < this.config.maxRetries) {\n lastError = err instanceof Error ? err : new Error(String(err));\n continue;\n }\n\n throw new HtAgError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n { url, cause: err },\n );\n }\n }\n\n // Should not reach here, but just in case.\n throw lastError ?? new HtAgError('Request failed after retries', { url });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n AddressSearchParams,\n AddressSearchResponse,\n AddressInsightsParams,\n AddressInsightsResponse,\n BatchStandardiseParams,\n BatchStandardiseResponse,\n} from './types.js';\n\n/**\n * Client for the Address API domain.\n *\n * ```ts\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class AddressClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for addresses matching a free-text query.\n *\n * `GET /v1/address/search`\n */\n async search(params: AddressSearchParams): Promise<AddressSearchResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressSearchResponse>(`/v1/address/search${qs}`, { signal });\n }\n\n /**\n * Retrieve detailed insights for one or more addresses.\n *\n * `GET /v1/address/insights`\n */\n async insights(params: AddressInsightsParams): Promise<AddressInsightsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressInsightsResponse>(`/v1/address/insights${qs}`, { signal });\n }\n\n /**\n * Standardise a batch of raw address strings into structured records.\n *\n * `POST /v1/address/standardise`\n */\n async standardise(params: BatchStandardiseParams): Promise<BatchStandardiseResponse> {\n const { signal, addresses } = params;\n return this.http.post<BatchStandardiseResponse>(\n '/v1/address/standardise',\n { addresses },\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n SoldSearchParams,\n SoldPropertiesResponse,\n} from './types.js';\n\n/**\n * Client for the Property API domain.\n *\n * ```ts\n * const sold = await client.property.soldSearch({ address: '100 George St Sydney', radius: 2000 });\n * ```\n */\nexport class PropertyClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for recently sold properties near a location.\n *\n * `GET /v1/property/sold/search`\n */\n async soldSearch(params: SoldSearchParams): Promise<SoldPropertiesResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<SoldPropertiesResponse>(`/v1/property/sold/search${qs}`, { signal });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n TrendsParams,\n TrendsWithBedroomsParams,\n PriceResponse,\n RentResponse,\n YieldResponse,\n SupplyDemandResponse,\n SearchIndexResponse,\n HoldPeriodResponse,\n PerformanceResponse,\n GrowthRatesResponse,\n DemandProfileResponse,\n} from './types.js';\n\n/**\n * Client for the Markets Trends API domain.\n *\n * Each method queries a specific time-series metric:\n *\n * ```ts\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * propertyType: ['house'],\n * });\n * ```\n */\nexport class TrendsClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Price history trends.\n *\n * `GET /internal-api/v1/markets/trends/price`\n */\n async price(params: TrendsWithBedroomsParams): Promise<PriceResponse> {\n return this.trend<PriceResponse>('price', params);\n }\n\n /**\n * Rent history trends.\n *\n * `GET /v1/markets/trends/rent`\n */\n async rent(params: TrendsWithBedroomsParams): Promise<RentResponse> {\n return this.publicTrend<RentResponse>('rent', params);\n }\n\n /**\n * Yield history trends.\n *\n * `GET /v1/markets/trends/yield`\n */\n async yieldHistory(params: TrendsWithBedroomsParams): Promise<YieldResponse> {\n return this.publicTrend<YieldResponse>('yield', params);\n }\n\n /**\n * Supply and demand (monthly frequency).\n *\n * `GET /internal-api/v1/markets/trends/supply-demand`\n */\n async supplyDemand(params: TrendsWithBedroomsParams): Promise<SupplyDemandResponse> {\n return this.trend<SupplyDemandResponse>('supply-demand', params);\n }\n\n /**\n * Search interest index (quarterly frequency).\n *\n * `GET /internal-api/v1/markets/trends/search-index`\n */\n async searchIndex(params: TrendsParams): Promise<SearchIndexResponse> {\n return this.trend<SearchIndexResponse>('search-index', params);\n }\n\n /**\n * Hold period (yearly frequency).\n *\n * `GET /internal-api/v1/markets/trends/hold-period`\n */\n async holdPeriod(params: TrendsParams): Promise<HoldPeriodResponse> {\n return this.trend<HoldPeriodResponse>('hold-period', params);\n }\n\n /**\n * Performance essentials.\n *\n * `GET /internal-api/v1/markets/trends/performance`\n */\n async performance(params: TrendsWithBedroomsParams): Promise<PerformanceResponse> {\n return this.trend<PerformanceResponse>('performance', params);\n }\n\n /**\n * Growth rate cycle.\n *\n * `GET /v1/markets/trends/growth-rates`\n */\n async growthRates(params: TrendsParams): Promise<GrowthRatesResponse> {\n return this.publicTrend<GrowthRatesResponse>('growth-rates', params);\n }\n\n /**\n * Demand profile breakdown.\n *\n * `GET /v1/markets/trends/demand-profile`\n */\n async demandProfile(params: TrendsParams): Promise<DemandProfileResponse> {\n return this.publicTrend<DemandProfileResponse>('demand-profile', params);\n }\n\n // -----------------------------------------------------------------------\n // Shared implementation\n // -----------------------------------------------------------------------\n\n private async trend<T>(metric: string, params: TrendsParams | TrendsWithBedroomsParams): Promise<T> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<T>(\n `/internal-api/v1/markets/trends/${metric}${qs}`,\n { signal },\n );\n }\n\n private async publicTrend<T>(metric: string, params: TrendsParams | TrendsWithBedroomsParams): Promise<T> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<T>(\n `/v1/markets/trends/${metric}${qs}`,\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport { TrendsClient } from './trends.js';\nimport type {\n SnapshotsParams,\n SnapshotsResponse,\n AdvancedSearchBody,\n MarketQueryResponse,\n} from './types.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Client for the Markets API domain.\n *\n * ```ts\n * const snapshots = await client.markets.snapshots({\n * level: 'suburb',\n * propertyType: ['house'],\n * });\n *\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * });\n * ```\n */\nexport class MarketsClient {\n /** Sub-client for time-series trend endpoints. */\n readonly trends: TrendsClient;\n\n /** @internal */\n constructor(private readonly http: HttpClient) {\n this.trends = new TrendsClient(http);\n }\n\n /**\n * Retrieve market snapshot data with optional filters.\n *\n * `GET /internal-api/v1/markets/snapshots`\n */\n async snapshots(params: SnapshotsParams): Promise<SnapshotsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<SnapshotsResponse>(\n `/internal-api/v1/markets/snapshots${qs}`,\n { signal },\n );\n }\n\n /**\n * Advanced market query with logical filter expressions.\n *\n * `POST /internal-api/v1/markets/query`\n */\n async query(\n body: AdvancedSearchBody,\n options?: RequestOptions,\n ): Promise<MarketQueryResponse> {\n return this.http.internalPost<MarketQueryResponse>(\n '/internal-api/v1/markets/query',\n body,\n options,\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type { RequestOptions } from '../types.js';\nimport type {\n SubmitEventParams,\n ClassifiedEvent,\n QueryEventsParams,\n PaginatedEvents,\n CreateIntegrationParams,\n Integration,\n UpdateIntegrationParams,\n TestResult,\n CreateSubscriptionParams,\n Subscription,\n UpdateSubscriptionParams,\n EventCategory,\n EventType,\n TagInfo,\n} from './types.js';\n\n/**\n * Client for the Intent Hub API domain.\n *\n * ```ts\n * const event = await client.intentHub.submitEvent({\n * sourceType: 'AGENT',\n * sourceId: 'my-agent',\n * textContent: 'User wants to refinance their mortgage',\n * });\n * ```\n */\nexport class IntentHubClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n /**\n * Submit a raw event for classification.\n *\n * `POST /intent-hub/v1/events`\n */\n async submitEvent(params: SubmitEventParams): Promise<ClassifiedEvent> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<ClassifiedEvent>(\n '/events',\n {\n source_type: rest.sourceType,\n source_id: rest.sourceId,\n text_content: rest.textContent,\n payload: rest.payload,\n user_id: rest.userId,\n session_id: rest.sessionId,\n suggested_category: rest.suggestedCategory,\n suggested_intent: rest.suggestedIntent,\n idempotency_key: rest.idempotencyKey,\n event_type: rest.eventType,\n },\n { signal },\n );\n }\n\n /**\n * Retrieve a single classified event by ID.\n *\n * `GET /intent-hub/v1/events/:eventId`\n */\n async getEvent(eventId: string, options?: RequestOptions): Promise<ClassifiedEvent> {\n return this.http.intentHubGet<ClassifiedEvent>(\n `/events/${encodeURIComponent(eventId)}`,\n options,\n );\n }\n\n /**\n * Query classified events with optional filters.\n *\n * `GET /intent-hub/v1/events`\n */\n async queryEvents(params?: QueryEventsParams): Promise<PaginatedEvents> {\n if (!params) {\n return this.http.intentHubGet<PaginatedEvents>('/events');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<PaginatedEvents>(`/events${qs}`, { signal });\n }\n\n // -------------------------------------------------------------------------\n // Integrations\n // -------------------------------------------------------------------------\n\n /**\n * Create a new integration endpoint.\n *\n * `POST /intent-hub/v1/integrations`\n */\n async createIntegration(params: CreateIntegrationParams): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Integration>(\n '/integrations',\n {\n name: rest.name,\n type: rest.type,\n url: rest.url,\n secret: rest.secret,\n headers: rest.headers,\n config: rest.config,\n },\n { signal },\n );\n }\n\n /**\n * List all integrations for the current organisation.\n *\n * `GET /intent-hub/v1/integrations`\n */\n async listIntegrations(options?: RequestOptions): Promise<Integration[]> {\n return this.http.intentHubGet<Integration[]>('/integrations', options);\n }\n\n /**\n * Retrieve a single integration by ID.\n *\n * `GET /intent-hub/v1/integrations/:id`\n */\n async getIntegration(id: string, options?: RequestOptions): Promise<Integration> {\n return this.http.intentHubGet<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing integration.\n *\n * `PATCH /intent-hub/v1/integrations/:id`\n */\n async updateIntegration(\n id: string,\n params: UpdateIntegrationParams,\n ): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n {\n name: rest.name,\n url: rest.url,\n secret: rest.secret,\n status: rest.status,\n },\n { signal },\n );\n }\n\n /**\n * Delete an integration by ID.\n *\n * `DELETE /intent-hub/v1/integrations/:id`\n */\n async deleteIntegration(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Send a test event to an integration endpoint.\n *\n * `POST /intent-hub/v1/integrations/:id/test`\n */\n async testIntegration(id: string, options?: RequestOptions): Promise<TestResult> {\n return this.http.intentHubPost<TestResult>(\n `/integrations/${encodeURIComponent(id)}/test`,\n {},\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Subscriptions\n // -------------------------------------------------------------------------\n\n /**\n * Create a new subscription linking event patterns to an integration.\n *\n * `POST /intent-hub/v1/subscriptions`\n */\n async createSubscription(params: CreateSubscriptionParams): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Subscription>(\n '/subscriptions',\n {\n integration_id: rest.integrationId,\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n filters: rest.filters,\n },\n { signal },\n );\n }\n\n /**\n * List all subscriptions for the current organisation.\n *\n * `GET /intent-hub/v1/subscriptions`\n */\n async listSubscriptions(options?: RequestOptions): Promise<Subscription[]> {\n return this.http.intentHubGet<Subscription[]>('/subscriptions', options);\n }\n\n /**\n * Retrieve a single subscription by ID.\n *\n * `GET /intent-hub/v1/subscriptions/:id`\n */\n async getSubscription(id: string, options?: RequestOptions): Promise<Subscription> {\n return this.http.intentHubGet<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing subscription.\n *\n * `PATCH /intent-hub/v1/subscriptions/:id`\n */\n async updateSubscription(\n id: string,\n params: UpdateSubscriptionParams,\n ): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n {\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n integration_id: rest.integrationId,\n is_active: rest.isActive,\n },\n { signal },\n );\n }\n\n /**\n * Delete a subscription by ID.\n *\n * `DELETE /intent-hub/v1/subscriptions/:id`\n */\n async deleteSubscription(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Catalog\n // -------------------------------------------------------------------------\n\n /**\n * List all event categories in the taxonomy.\n *\n * `GET /intent-hub/v1/catalog/categories`\n */\n async listCategories(options?: RequestOptions): Promise<EventCategory[]> {\n return this.http.intentHubGet<EventCategory[]>('/catalog/categories', options);\n }\n\n /**\n * List event types, optionally filtered by category.\n *\n * `GET /intent-hub/v1/catalog/event-types`\n */\n async listEventTypes(\n params?: { category?: string } & RequestOptions,\n ): Promise<EventType[]> {\n if (!params) {\n return this.http.intentHubGet<EventType[]>('/catalog/event-types');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<EventType[]>(`/catalog/event-types${qs}`, { signal });\n }\n\n /**\n * List all tags with their usage counts.\n *\n * `GET /intent-hub/v1/catalog/tags`\n */\n async listTags(options?: RequestOptions): Promise<TagInfo[]> {\n return this.http.intentHubGet<TagInfo[]>('/catalog/tags', options);\n }\n}\n","import type { HtAgClientOptions, ResolvedConfig } from './types.js';\nimport { HttpClient } from './http.js';\nimport { AddressClient } from './address/client.js';\nimport { PropertyClient } from './property/client.js';\nimport { MarketsClient } from './markets/client.js';\nimport { IntentHubClient } from './intent-hub/client.js';\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_BASE_DELAY = 500; // ms\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds\n\n/**\n * Build the environment-derived base URLs.\n *\n * - `prod` -> `https://api.prod.htagai.com`\n * - `dev` -> `https://api.dev.htagai.com`\n */\nfunction resolveBaseUrls(options: HtAgClientOptions): {\n publicBaseUrl: string;\n internalBaseUrl: string;\n intentHubBaseUrl: string;\n} {\n if (options.baseUrl) {\n // Strip trailing slashes for consistency.\n const base = options.baseUrl.replace(/\\/+$/, '');\n return { publicBaseUrl: base, internalBaseUrl: base, intentHubBaseUrl: base };\n }\n\n const env = options.environment ?? 'prod';\n const base = `https://api.${env}.htagai.com`;\n return {\n publicBaseUrl: base,\n internalBaseUrl: base,\n intentHubBaseUrl: `${base}/intent-hub/v1`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// HtAgApiClient\n// ---------------------------------------------------------------------------\n\n/**\n * Top-level client for the HtAG Location Intelligence APIs.\n *\n * ```ts\n * import { HtAgApiClient } from '@htag/sdk';\n *\n * const client = new HtAgApiClient({\n * apiKey: process.env.HTAG_API_KEY!,\n * environment: 'prod',\n * });\n *\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class HtAgApiClient {\n /** Address search, insights and standardisation. */\n readonly address: AddressClient;\n\n /** Sold property search. */\n readonly property: PropertyClient;\n\n /** Market snapshots, advanced queries and time-series trends. */\n readonly markets: MarketsClient;\n\n /** Intent Hub: event classification, integrations and subscriptions. */\n readonly intentHub: IntentHubClient;\n\n constructor(options: HtAgClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'HtAgApiClient requires an apiKey. Pass it in the constructor options.',\n );\n }\n\n const { publicBaseUrl, internalBaseUrl, intentHubBaseUrl } = resolveBaseUrls(options);\n\n const config: ResolvedConfig = {\n apiKey: options.apiKey,\n publicBaseUrl,\n internalBaseUrl,\n intentHubBaseUrl,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n retryBaseDelay: options.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n };\n\n const http = new HttpClient(config);\n\n this.address = new AddressClient(http);\n this.property = new PropertyClient(http);\n this.markets = new MarketsClient(http);\n this.intentHub = new IntentHubClient(http);\n }\n}\n"],"mappings":"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","names":["base"]}
package/dist/index.d.cts CHANGED
@@ -551,13 +551,13 @@ declare class TrendsClient {
551
551
  /**
552
552
  * Rent history trends.
553
553
  *
554
- * `GET /internal-api/v1/markets/trends/rent`
554
+ * `GET /v1/markets/trends/rent`
555
555
  */
556
556
  rent(params: TrendsWithBedroomsParams): Promise<RentResponse>;
557
557
  /**
558
558
  * Yield history trends.
559
559
  *
560
- * `GET /internal-api/v1/markets/trends/yield`
560
+ * `GET /v1/markets/trends/yield`
561
561
  */
562
562
  yieldHistory(params: TrendsWithBedroomsParams): Promise<YieldResponse>;
563
563
  /**
@@ -587,16 +587,17 @@ declare class TrendsClient {
587
587
  /**
588
588
  * Growth rate cycle.
589
589
  *
590
- * `GET /internal-api/v1/markets/trends/growth-rates`
590
+ * `GET /v1/markets/trends/growth-rates`
591
591
  */
592
592
  growthRates(params: TrendsParams): Promise<GrowthRatesResponse>;
593
593
  /**
594
594
  * Demand profile breakdown.
595
595
  *
596
- * `GET /internal-api/v1/markets/trends/demand-profile`
596
+ * `GET /v1/markets/trends/demand-profile`
597
597
  */
598
598
  demandProfile(params: TrendsParams): Promise<DemandProfileResponse>;
599
599
  private trend;
600
+ private publicTrend;
600
601
  }
601
602
 
602
603
  /**
package/dist/index.d.ts CHANGED
@@ -551,13 +551,13 @@ declare class TrendsClient {
551
551
  /**
552
552
  * Rent history trends.
553
553
  *
554
- * `GET /internal-api/v1/markets/trends/rent`
554
+ * `GET /v1/markets/trends/rent`
555
555
  */
556
556
  rent(params: TrendsWithBedroomsParams): Promise<RentResponse>;
557
557
  /**
558
558
  * Yield history trends.
559
559
  *
560
- * `GET /internal-api/v1/markets/trends/yield`
560
+ * `GET /v1/markets/trends/yield`
561
561
  */
562
562
  yieldHistory(params: TrendsWithBedroomsParams): Promise<YieldResponse>;
563
563
  /**
@@ -587,16 +587,17 @@ declare class TrendsClient {
587
587
  /**
588
588
  * Growth rate cycle.
589
589
  *
590
- * `GET /internal-api/v1/markets/trends/growth-rates`
590
+ * `GET /v1/markets/trends/growth-rates`
591
591
  */
592
592
  growthRates(params: TrendsParams): Promise<GrowthRatesResponse>;
593
593
  /**
594
594
  * Demand profile breakdown.
595
595
  *
596
- * `GET /internal-api/v1/markets/trends/demand-profile`
596
+ * `GET /v1/markets/trends/demand-profile`
597
597
  */
598
598
  demandProfile(params: TrendsParams): Promise<DemandProfileResponse>;
599
599
  private trend;
600
+ private publicTrend;
600
601
  }
601
602
 
602
603
  /**
package/dist/index.js CHANGED
@@ -347,18 +347,18 @@ var TrendsClient = class {
347
347
  /**
348
348
  * Rent history trends.
349
349
  *
350
- * `GET /internal-api/v1/markets/trends/rent`
350
+ * `GET /v1/markets/trends/rent`
351
351
  */
352
352
  async rent(params) {
353
- return this.trend("rent", params);
353
+ return this.publicTrend("rent", params);
354
354
  }
355
355
  /**
356
356
  * Yield history trends.
357
357
  *
358
- * `GET /internal-api/v1/markets/trends/yield`
358
+ * `GET /v1/markets/trends/yield`
359
359
  */
360
360
  async yieldHistory(params) {
361
- return this.trend("yield", params);
361
+ return this.publicTrend("yield", params);
362
362
  }
363
363
  /**
364
364
  * Supply and demand (monthly frequency).
@@ -395,18 +395,18 @@ var TrendsClient = class {
395
395
  /**
396
396
  * Growth rate cycle.
397
397
  *
398
- * `GET /internal-api/v1/markets/trends/growth-rates`
398
+ * `GET /v1/markets/trends/growth-rates`
399
399
  */
400
400
  async growthRates(params) {
401
- return this.trend("growth-rates", params);
401
+ return this.publicTrend("growth-rates", params);
402
402
  }
403
403
  /**
404
404
  * Demand profile breakdown.
405
405
  *
406
- * `GET /internal-api/v1/markets/trends/demand-profile`
406
+ * `GET /v1/markets/trends/demand-profile`
407
407
  */
408
408
  async demandProfile(params) {
409
- return this.trend("demand-profile", params);
409
+ return this.publicTrend("demand-profile", params);
410
410
  }
411
411
  // -----------------------------------------------------------------------
412
412
  // Shared implementation
@@ -419,6 +419,14 @@ var TrendsClient = class {
419
419
  { signal }
420
420
  );
421
421
  }
422
+ async publicTrend(metric, params) {
423
+ const { signal, ...query } = params;
424
+ const qs = buildQueryString(query);
425
+ return this.http.get(
426
+ `/v1/markets/trends/${metric}${qs}`,
427
+ { signal }
428
+ );
429
+ }
422
430
  };
423
431
 
424
432
  // src/markets/client.ts
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/address/client.ts","../src/property/client.ts","../src/markets/trends.ts","../src/markets/client.ts","../src/intent-hub/client.ts","../src/client.ts"],"sourcesContent":["/**\n * Base error class for all HtAG SDK errors.\n */\nexport class HtAgError extends Error {\n /** HTTP status code, if available. */\n readonly status: number | undefined;\n\n /** Raw response body, if available. */\n readonly body: unknown;\n\n /** The request URL that caused the error. */\n readonly url: string | undefined;\n\n constructor(\n message: string,\n options?: {\n status?: number;\n body?: unknown;\n url?: string;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options?.cause });\n this.name = 'HtAgError';\n this.status = options?.status;\n this.body = options?.body;\n this.url = options?.url;\n }\n}\n\n/**\n * Thrown when the server returns 401 or 403.\n */\nexport class AuthenticationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(\n `Authentication failed (HTTP ${options.status}). Check your API key.`,\n options,\n );\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Thrown when the server returns 429 after exhausting all retries.\n */\nexport class RateLimitError extends HtAgError {\n constructor(options: { body: unknown; url: string }) {\n super('Rate limit exceeded. Please retry after a short delay.', {\n status: 429,\n ...options,\n });\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Thrown when the server returns 400 or 422.\n */\nexport class ValidationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n const detail = extractDetail(options.body);\n super(\n detail\n ? `Validation error (HTTP ${options.status}): ${detail}`\n : `Validation error (HTTP ${options.status})`,\n options,\n );\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Thrown when the server returns a 5xx status after exhausting all retries.\n */\nexport class ServerError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(`Server error (HTTP ${options.status})`, options);\n this.name = 'ServerError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractDetail(body: unknown): string | undefined {\n if (body && typeof body === 'object' && 'detail' in body) {\n const detail = (body as Record<string, unknown>).detail;\n if (typeof detail === 'string') return detail;\n if (Array.isArray(detail)) {\n return detail\n .map((d) => {\n if (typeof d === 'string') return d;\n if (d && typeof d === 'object' && 'msg' in d) return String(d.msg);\n return JSON.stringify(d);\n })\n .join('; ');\n }\n return JSON.stringify(detail);\n }\n return undefined;\n}\n","import type { ResolvedConfig, RequestOptions } from './types.js';\nimport {\n HtAgError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n ServerError,\n} from './errors.js';\n\n// ---------------------------------------------------------------------------\n// camelCase -> snake_case conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a camelCase string to snake_case.\n *\n * Handles sequences of uppercase letters correctly:\n * - \"areaId\" -> \"area_id\"\n * - \"periodEndMin\" -> \"period_end_min\"\n * - \"IRSD\" -> \"irsd\" (all-caps treated as one token)\n */\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase();\n}\n\n// ---------------------------------------------------------------------------\n// Query-string builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a URL query string from a params object, converting camelCase keys\n * to snake_case. Arrays are joined with commas. `undefined` and `null` values\n * are omitted.\n */\nexport function buildQueryString(\n params: Record<string, unknown>,\n): string {\n const parts: string[] = [];\n\n for (const [key, value] of Object.entries(params)) {\n // Skip internal SDK options that are not API params.\n if (key === 'signal') continue;\n if (value === undefined || value === null) continue;\n\n const snakeKey = toSnakeCase(key);\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(value.join(','))}`,\n );\n }\n } else {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(String(value))}`,\n );\n }\n }\n\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n}\n\n// ---------------------------------------------------------------------------\n// Retryable HTTP client\n// ---------------------------------------------------------------------------\n\nfunction isRetryable(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the body of a response. Returns the parsed JSON on success or a string\n * representation when parsing fails.\n */\nasync function parseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n return await response.json();\n } catch {\n return await response.text();\n }\n }\n return await response.text();\n}\n\n/**\n * Throw the appropriate typed error for the given HTTP status.\n */\nfunction throwForStatus(\n status: number,\n body: unknown,\n url: string,\n): never {\n if (status === 401 || status === 403) {\n throw new AuthenticationError({ status, body, url });\n }\n if (status === 429) {\n throw new RateLimitError({ body, url });\n }\n if (status === 400 || status === 422) {\n throw new ValidationError({ status, body, url });\n }\n if (status >= 500) {\n throw new ServerError({ status, body, url });\n }\n throw new HtAgError(`HTTP ${status}`, { status, body, url });\n}\n\n/**\n * Internal HTTP transport used by all domain clients.\n */\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n /**\n * Execute a GET request against the public API base.\n */\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the public API base.\n */\n async post<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the public API base.\n */\n async patch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the public API base.\n */\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a GET request against the internal API base.\n */\n async internalGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.internalBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the internal API base.\n */\n async internalPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.internalBaseUrl + path, body, options);\n }\n\n /**\n * Execute a GET request against the Intent Hub API base.\n */\n async intentHubGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the Intent Hub API base.\n */\n async intentHubPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the Intent Hub API base.\n */\n async intentHubPatch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the Intent Hub API base.\n */\n async intentHubDelete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n // -----------------------------------------------------------------------\n // Core request implementation with retries and exponential backoff\n // -----------------------------------------------------------------------\n\n private async request<T>(\n method: string,\n url: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const headers: Record<string, string> = {\n 'x-api-key': this.config.apiKey,\n 'accept': 'application/json',\n };\n\n if (body !== undefined) {\n headers['content-type'] = 'application/json';\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n // If this is a retry, wait with exponential backoff + jitter.\n if (attempt > 0) {\n const base = this.config.retryBaseDelay * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base * 0.5;\n await sleep(base + jitter);\n }\n\n // Build an AbortController that combines the user signal with a timeout.\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n };\n\n // Wire up caller's abort signal.\n if (options?.signal) {\n if (options.signal.aborted) {\n throw new HtAgError('Request aborted', {\n url,\n cause: options.signal.reason,\n });\n }\n options.signal.addEventListener('abort', () => controller.abort(options.signal!.reason), {\n once: true,\n });\n }\n\n timeoutId = setTimeout(\n () => controller.abort(new Error('Request timed out')),\n this.config.timeout,\n );\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n cleanup();\n\n if (response.ok) {\n // 204 No Content — nothing to parse.\n if (response.status === 204) {\n return undefined as T;\n }\n return (await parseBody(response)) as T;\n }\n\n const responseBody = await parseBody(response);\n\n // Retry on retryable statuses, unless we've exhausted retries.\n if (isRetryable(response.status) && attempt < this.config.maxRetries) {\n lastError = new HtAgError(`HTTP ${response.status}`, {\n status: response.status,\n body: responseBody,\n url,\n });\n continue;\n }\n\n // Non-retryable or exhausted retries — throw typed error.\n throwForStatus(response.status, responseBody, url);\n } catch (err) {\n cleanup();\n\n // Re-throw our own typed errors.\n if (err instanceof HtAgError) {\n throw err;\n }\n\n // Handle abort / timeout.\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) {\n throw new HtAgError('Request aborted', { url, cause: err });\n }\n throw new HtAgError('Request timed out', { url, cause: err });\n }\n\n // Network / fetch errors — retry if we have attempts left.\n if (attempt < this.config.maxRetries) {\n lastError = err instanceof Error ? err : new Error(String(err));\n continue;\n }\n\n throw new HtAgError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n { url, cause: err },\n );\n }\n }\n\n // Should not reach here, but just in case.\n throw lastError ?? new HtAgError('Request failed after retries', { url });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n AddressSearchParams,\n AddressSearchResponse,\n AddressInsightsParams,\n AddressInsightsResponse,\n BatchStandardiseParams,\n BatchStandardiseResponse,\n} from './types.js';\n\n/**\n * Client for the Address API domain.\n *\n * ```ts\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class AddressClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for addresses matching a free-text query.\n *\n * `GET /v1/address/search`\n */\n async search(params: AddressSearchParams): Promise<AddressSearchResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressSearchResponse>(`/v1/address/search${qs}`, { signal });\n }\n\n /**\n * Retrieve detailed insights for one or more addresses.\n *\n * `GET /v1/address/insights`\n */\n async insights(params: AddressInsightsParams): Promise<AddressInsightsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressInsightsResponse>(`/v1/address/insights${qs}`, { signal });\n }\n\n /**\n * Standardise a batch of raw address strings into structured records.\n *\n * `POST /v1/address/standardise`\n */\n async standardise(params: BatchStandardiseParams): Promise<BatchStandardiseResponse> {\n const { signal, addresses } = params;\n return this.http.post<BatchStandardiseResponse>(\n '/v1/address/standardise',\n { addresses },\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n SoldSearchParams,\n SoldPropertiesResponse,\n} from './types.js';\n\n/**\n * Client for the Property API domain.\n *\n * ```ts\n * const sold = await client.property.soldSearch({ address: '100 George St Sydney', radius: 2000 });\n * ```\n */\nexport class PropertyClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for recently sold properties near a location.\n *\n * `GET /v1/property/sold/search`\n */\n async soldSearch(params: SoldSearchParams): Promise<SoldPropertiesResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<SoldPropertiesResponse>(`/v1/property/sold/search${qs}`, { signal });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n TrendsParams,\n TrendsWithBedroomsParams,\n PriceResponse,\n RentResponse,\n YieldResponse,\n SupplyDemandResponse,\n SearchIndexResponse,\n HoldPeriodResponse,\n PerformanceResponse,\n GrowthRatesResponse,\n DemandProfileResponse,\n} from './types.js';\n\n/**\n * Client for the Markets Trends API domain.\n *\n * Each method queries a specific time-series metric:\n *\n * ```ts\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * propertyType: ['house'],\n * });\n * ```\n */\nexport class TrendsClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Price history trends.\n *\n * `GET /internal-api/v1/markets/trends/price`\n */\n async price(params: TrendsWithBedroomsParams): Promise<PriceResponse> {\n return this.trend<PriceResponse>('price', params);\n }\n\n /**\n * Rent history trends.\n *\n * `GET /internal-api/v1/markets/trends/rent`\n */\n async rent(params: TrendsWithBedroomsParams): Promise<RentResponse> {\n return this.trend<RentResponse>('rent', params);\n }\n\n /**\n * Yield history trends.\n *\n * `GET /internal-api/v1/markets/trends/yield`\n */\n async yieldHistory(params: TrendsWithBedroomsParams): Promise<YieldResponse> {\n return this.trend<YieldResponse>('yield', params);\n }\n\n /**\n * Supply and demand (monthly frequency).\n *\n * `GET /internal-api/v1/markets/trends/supply-demand`\n */\n async supplyDemand(params: TrendsWithBedroomsParams): Promise<SupplyDemandResponse> {\n return this.trend<SupplyDemandResponse>('supply-demand', params);\n }\n\n /**\n * Search interest index (quarterly frequency).\n *\n * `GET /internal-api/v1/markets/trends/search-index`\n */\n async searchIndex(params: TrendsParams): Promise<SearchIndexResponse> {\n return this.trend<SearchIndexResponse>('search-index', params);\n }\n\n /**\n * Hold period (yearly frequency).\n *\n * `GET /internal-api/v1/markets/trends/hold-period`\n */\n async holdPeriod(params: TrendsParams): Promise<HoldPeriodResponse> {\n return this.trend<HoldPeriodResponse>('hold-period', params);\n }\n\n /**\n * Performance essentials.\n *\n * `GET /internal-api/v1/markets/trends/performance`\n */\n async performance(params: TrendsWithBedroomsParams): Promise<PerformanceResponse> {\n return this.trend<PerformanceResponse>('performance', params);\n }\n\n /**\n * Growth rate cycle.\n *\n * `GET /internal-api/v1/markets/trends/growth-rates`\n */\n async growthRates(params: TrendsParams): Promise<GrowthRatesResponse> {\n return this.trend<GrowthRatesResponse>('growth-rates', params);\n }\n\n /**\n * Demand profile breakdown.\n *\n * `GET /internal-api/v1/markets/trends/demand-profile`\n */\n async demandProfile(params: TrendsParams): Promise<DemandProfileResponse> {\n return this.trend<DemandProfileResponse>('demand-profile', params);\n }\n\n // -----------------------------------------------------------------------\n // Shared implementation\n // -----------------------------------------------------------------------\n\n private async trend<T>(metric: string, params: TrendsParams | TrendsWithBedroomsParams): Promise<T> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<T>(\n `/internal-api/v1/markets/trends/${metric}${qs}`,\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport { TrendsClient } from './trends.js';\nimport type {\n SnapshotsParams,\n SnapshotsResponse,\n AdvancedSearchBody,\n MarketQueryResponse,\n} from './types.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Client for the Markets API domain.\n *\n * ```ts\n * const snapshots = await client.markets.snapshots({\n * level: 'suburb',\n * propertyType: ['house'],\n * });\n *\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * });\n * ```\n */\nexport class MarketsClient {\n /** Sub-client for time-series trend endpoints. */\n readonly trends: TrendsClient;\n\n /** @internal */\n constructor(private readonly http: HttpClient) {\n this.trends = new TrendsClient(http);\n }\n\n /**\n * Retrieve market snapshot data with optional filters.\n *\n * `GET /internal-api/v1/markets/snapshots`\n */\n async snapshots(params: SnapshotsParams): Promise<SnapshotsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<SnapshotsResponse>(\n `/internal-api/v1/markets/snapshots${qs}`,\n { signal },\n );\n }\n\n /**\n * Advanced market query with logical filter expressions.\n *\n * `POST /internal-api/v1/markets/query`\n */\n async query(\n body: AdvancedSearchBody,\n options?: RequestOptions,\n ): Promise<MarketQueryResponse> {\n return this.http.internalPost<MarketQueryResponse>(\n '/internal-api/v1/markets/query',\n body,\n options,\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type { RequestOptions } from '../types.js';\nimport type {\n SubmitEventParams,\n ClassifiedEvent,\n QueryEventsParams,\n PaginatedEvents,\n CreateIntegrationParams,\n Integration,\n UpdateIntegrationParams,\n TestResult,\n CreateSubscriptionParams,\n Subscription,\n UpdateSubscriptionParams,\n EventCategory,\n EventType,\n TagInfo,\n} from './types.js';\n\n/**\n * Client for the Intent Hub API domain.\n *\n * ```ts\n * const event = await client.intentHub.submitEvent({\n * sourceType: 'AGENT',\n * sourceId: 'my-agent',\n * textContent: 'User wants to refinance their mortgage',\n * });\n * ```\n */\nexport class IntentHubClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n /**\n * Submit a raw event for classification.\n *\n * `POST /intent-hub/v1/events`\n */\n async submitEvent(params: SubmitEventParams): Promise<ClassifiedEvent> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<ClassifiedEvent>(\n '/events',\n {\n source_type: rest.sourceType,\n source_id: rest.sourceId,\n text_content: rest.textContent,\n payload: rest.payload,\n user_id: rest.userId,\n session_id: rest.sessionId,\n suggested_category: rest.suggestedCategory,\n suggested_intent: rest.suggestedIntent,\n idempotency_key: rest.idempotencyKey,\n event_type: rest.eventType,\n },\n { signal },\n );\n }\n\n /**\n * Retrieve a single classified event by ID.\n *\n * `GET /intent-hub/v1/events/:eventId`\n */\n async getEvent(eventId: string, options?: RequestOptions): Promise<ClassifiedEvent> {\n return this.http.intentHubGet<ClassifiedEvent>(\n `/events/${encodeURIComponent(eventId)}`,\n options,\n );\n }\n\n /**\n * Query classified events with optional filters.\n *\n * `GET /intent-hub/v1/events`\n */\n async queryEvents(params?: QueryEventsParams): Promise<PaginatedEvents> {\n if (!params) {\n return this.http.intentHubGet<PaginatedEvents>('/events');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<PaginatedEvents>(`/events${qs}`, { signal });\n }\n\n // -------------------------------------------------------------------------\n // Integrations\n // -------------------------------------------------------------------------\n\n /**\n * Create a new integration endpoint.\n *\n * `POST /intent-hub/v1/integrations`\n */\n async createIntegration(params: CreateIntegrationParams): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Integration>(\n '/integrations',\n {\n name: rest.name,\n type: rest.type,\n url: rest.url,\n secret: rest.secret,\n headers: rest.headers,\n config: rest.config,\n },\n { signal },\n );\n }\n\n /**\n * List all integrations for the current organisation.\n *\n * `GET /intent-hub/v1/integrations`\n */\n async listIntegrations(options?: RequestOptions): Promise<Integration[]> {\n return this.http.intentHubGet<Integration[]>('/integrations', options);\n }\n\n /**\n * Retrieve a single integration by ID.\n *\n * `GET /intent-hub/v1/integrations/:id`\n */\n async getIntegration(id: string, options?: RequestOptions): Promise<Integration> {\n return this.http.intentHubGet<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing integration.\n *\n * `PATCH /intent-hub/v1/integrations/:id`\n */\n async updateIntegration(\n id: string,\n params: UpdateIntegrationParams,\n ): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n {\n name: rest.name,\n url: rest.url,\n secret: rest.secret,\n status: rest.status,\n },\n { signal },\n );\n }\n\n /**\n * Delete an integration by ID.\n *\n * `DELETE /intent-hub/v1/integrations/:id`\n */\n async deleteIntegration(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Send a test event to an integration endpoint.\n *\n * `POST /intent-hub/v1/integrations/:id/test`\n */\n async testIntegration(id: string, options?: RequestOptions): Promise<TestResult> {\n return this.http.intentHubPost<TestResult>(\n `/integrations/${encodeURIComponent(id)}/test`,\n {},\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Subscriptions\n // -------------------------------------------------------------------------\n\n /**\n * Create a new subscription linking event patterns to an integration.\n *\n * `POST /intent-hub/v1/subscriptions`\n */\n async createSubscription(params: CreateSubscriptionParams): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Subscription>(\n '/subscriptions',\n {\n integration_id: rest.integrationId,\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n filters: rest.filters,\n },\n { signal },\n );\n }\n\n /**\n * List all subscriptions for the current organisation.\n *\n * `GET /intent-hub/v1/subscriptions`\n */\n async listSubscriptions(options?: RequestOptions): Promise<Subscription[]> {\n return this.http.intentHubGet<Subscription[]>('/subscriptions', options);\n }\n\n /**\n * Retrieve a single subscription by ID.\n *\n * `GET /intent-hub/v1/subscriptions/:id`\n */\n async getSubscription(id: string, options?: RequestOptions): Promise<Subscription> {\n return this.http.intentHubGet<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing subscription.\n *\n * `PATCH /intent-hub/v1/subscriptions/:id`\n */\n async updateSubscription(\n id: string,\n params: UpdateSubscriptionParams,\n ): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n {\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n integration_id: rest.integrationId,\n is_active: rest.isActive,\n },\n { signal },\n );\n }\n\n /**\n * Delete a subscription by ID.\n *\n * `DELETE /intent-hub/v1/subscriptions/:id`\n */\n async deleteSubscription(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Catalog\n // -------------------------------------------------------------------------\n\n /**\n * List all event categories in the taxonomy.\n *\n * `GET /intent-hub/v1/catalog/categories`\n */\n async listCategories(options?: RequestOptions): Promise<EventCategory[]> {\n return this.http.intentHubGet<EventCategory[]>('/catalog/categories', options);\n }\n\n /**\n * List event types, optionally filtered by category.\n *\n * `GET /intent-hub/v1/catalog/event-types`\n */\n async listEventTypes(\n params?: { category?: string } & RequestOptions,\n ): Promise<EventType[]> {\n if (!params) {\n return this.http.intentHubGet<EventType[]>('/catalog/event-types');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<EventType[]>(`/catalog/event-types${qs}`, { signal });\n }\n\n /**\n * List all tags with their usage counts.\n *\n * `GET /intent-hub/v1/catalog/tags`\n */\n async listTags(options?: RequestOptions): Promise<TagInfo[]> {\n return this.http.intentHubGet<TagInfo[]>('/catalog/tags', options);\n }\n}\n","import type { HtAgClientOptions, ResolvedConfig } from './types.js';\nimport { HttpClient } from './http.js';\nimport { AddressClient } from './address/client.js';\nimport { PropertyClient } from './property/client.js';\nimport { MarketsClient } from './markets/client.js';\nimport { IntentHubClient } from './intent-hub/client.js';\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_BASE_DELAY = 500; // ms\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds\n\n/**\n * Build the environment-derived base URLs.\n *\n * - `prod` -> `https://api.prod.htagai.com`\n * - `dev` -> `https://api.dev.htagai.com`\n */\nfunction resolveBaseUrls(options: HtAgClientOptions): {\n publicBaseUrl: string;\n internalBaseUrl: string;\n intentHubBaseUrl: string;\n} {\n if (options.baseUrl) {\n // Strip trailing slashes for consistency.\n const base = options.baseUrl.replace(/\\/+$/, '');\n return { publicBaseUrl: base, internalBaseUrl: base, intentHubBaseUrl: base };\n }\n\n const env = options.environment ?? 'prod';\n const base = `https://api.${env}.htagai.com`;\n return {\n publicBaseUrl: base,\n internalBaseUrl: base,\n intentHubBaseUrl: `${base}/intent-hub/v1`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// HtAgApiClient\n// ---------------------------------------------------------------------------\n\n/**\n * Top-level client for the HtAG Location Intelligence APIs.\n *\n * ```ts\n * import { HtAgApiClient } from '@htag/sdk';\n *\n * const client = new HtAgApiClient({\n * apiKey: process.env.HTAG_API_KEY!,\n * environment: 'prod',\n * });\n *\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class HtAgApiClient {\n /** Address search, insights and standardisation. */\n readonly address: AddressClient;\n\n /** Sold property search. */\n readonly property: PropertyClient;\n\n /** Market snapshots, advanced queries and time-series trends. */\n readonly markets: MarketsClient;\n\n /** Intent Hub: event classification, integrations and subscriptions. */\n readonly intentHub: IntentHubClient;\n\n constructor(options: HtAgClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'HtAgApiClient requires an apiKey. Pass it in the constructor options.',\n );\n }\n\n const { publicBaseUrl, internalBaseUrl, intentHubBaseUrl } = resolveBaseUrls(options);\n\n const config: ResolvedConfig = {\n apiKey: options.apiKey,\n publicBaseUrl,\n internalBaseUrl,\n intentHubBaseUrl,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n retryBaseDelay: options.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n };\n\n const http = new HttpClient(config);\n\n this.address = new AddressClient(http);\n this.property = new PropertyClient(http);\n this.markets = new MarketsClient(http);\n this.intentHub = new IntentHubClient(http);\n }\n}\n"],"mappings":"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","names":["base"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/address/client.ts","../src/property/client.ts","../src/markets/trends.ts","../src/markets/client.ts","../src/intent-hub/client.ts","../src/client.ts"],"sourcesContent":["/**\n * Base error class for all HtAG SDK errors.\n */\nexport class HtAgError extends Error {\n /** HTTP status code, if available. */\n readonly status: number | undefined;\n\n /** Raw response body, if available. */\n readonly body: unknown;\n\n /** The request URL that caused the error. */\n readonly url: string | undefined;\n\n constructor(\n message: string,\n options?: {\n status?: number;\n body?: unknown;\n url?: string;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options?.cause });\n this.name = 'HtAgError';\n this.status = options?.status;\n this.body = options?.body;\n this.url = options?.url;\n }\n}\n\n/**\n * Thrown when the server returns 401 or 403.\n */\nexport class AuthenticationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(\n `Authentication failed (HTTP ${options.status}). Check your API key.`,\n options,\n );\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Thrown when the server returns 429 after exhausting all retries.\n */\nexport class RateLimitError extends HtAgError {\n constructor(options: { body: unknown; url: string }) {\n super('Rate limit exceeded. Please retry after a short delay.', {\n status: 429,\n ...options,\n });\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Thrown when the server returns 400 or 422.\n */\nexport class ValidationError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n const detail = extractDetail(options.body);\n super(\n detail\n ? `Validation error (HTTP ${options.status}): ${detail}`\n : `Validation error (HTTP ${options.status})`,\n options,\n );\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Thrown when the server returns a 5xx status after exhausting all retries.\n */\nexport class ServerError extends HtAgError {\n constructor(options: { status: number; body: unknown; url: string }) {\n super(`Server error (HTTP ${options.status})`, options);\n this.name = 'ServerError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractDetail(body: unknown): string | undefined {\n if (body && typeof body === 'object' && 'detail' in body) {\n const detail = (body as Record<string, unknown>).detail;\n if (typeof detail === 'string') return detail;\n if (Array.isArray(detail)) {\n return detail\n .map((d) => {\n if (typeof d === 'string') return d;\n if (d && typeof d === 'object' && 'msg' in d) return String(d.msg);\n return JSON.stringify(d);\n })\n .join('; ');\n }\n return JSON.stringify(detail);\n }\n return undefined;\n}\n","import type { ResolvedConfig, RequestOptions } from './types.js';\nimport {\n HtAgError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n ServerError,\n} from './errors.js';\n\n// ---------------------------------------------------------------------------\n// camelCase -> snake_case conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a camelCase string to snake_case.\n *\n * Handles sequences of uppercase letters correctly:\n * - \"areaId\" -> \"area_id\"\n * - \"periodEndMin\" -> \"period_end_min\"\n * - \"IRSD\" -> \"irsd\" (all-caps treated as one token)\n */\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase();\n}\n\n// ---------------------------------------------------------------------------\n// Query-string builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build a URL query string from a params object, converting camelCase keys\n * to snake_case. Arrays are joined with commas. `undefined` and `null` values\n * are omitted.\n */\nexport function buildQueryString(\n params: Record<string, unknown>,\n): string {\n const parts: string[] = [];\n\n for (const [key, value] of Object.entries(params)) {\n // Skip internal SDK options that are not API params.\n if (key === 'signal') continue;\n if (value === undefined || value === null) continue;\n\n const snakeKey = toSnakeCase(key);\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(value.join(','))}`,\n );\n }\n } else {\n parts.push(\n `${encodeURIComponent(snakeKey)}=${encodeURIComponent(String(value))}`,\n );\n }\n }\n\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n}\n\n// ---------------------------------------------------------------------------\n// Retryable HTTP client\n// ---------------------------------------------------------------------------\n\nfunction isRetryable(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the body of a response. Returns the parsed JSON on success or a string\n * representation when parsing fails.\n */\nasync function parseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n return await response.json();\n } catch {\n return await response.text();\n }\n }\n return await response.text();\n}\n\n/**\n * Throw the appropriate typed error for the given HTTP status.\n */\nfunction throwForStatus(\n status: number,\n body: unknown,\n url: string,\n): never {\n if (status === 401 || status === 403) {\n throw new AuthenticationError({ status, body, url });\n }\n if (status === 429) {\n throw new RateLimitError({ body, url });\n }\n if (status === 400 || status === 422) {\n throw new ValidationError({ status, body, url });\n }\n if (status >= 500) {\n throw new ServerError({ status, body, url });\n }\n throw new HtAgError(`HTTP ${status}`, { status, body, url });\n}\n\n/**\n * Internal HTTP transport used by all domain clients.\n */\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n /**\n * Execute a GET request against the public API base.\n */\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the public API base.\n */\n async post<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the public API base.\n */\n async patch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.publicBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the public API base.\n */\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.publicBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a GET request against the internal API base.\n */\n async internalGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.internalBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the internal API base.\n */\n async internalPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.internalBaseUrl + path, body, options);\n }\n\n /**\n * Execute a GET request against the Intent Hub API base.\n */\n async intentHubGet<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n /**\n * Execute a POST request against the Intent Hub API base.\n */\n async intentHubPost<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('POST', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a PATCH request against the Intent Hub API base.\n */\n async intentHubPatch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n return this.request<T>('PATCH', this.config.intentHubBaseUrl + path, body, options);\n }\n\n /**\n * Execute a DELETE request against the Intent Hub API base.\n */\n async intentHubDelete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', this.config.intentHubBaseUrl + path, undefined, options);\n }\n\n // -----------------------------------------------------------------------\n // Core request implementation with retries and exponential backoff\n // -----------------------------------------------------------------------\n\n private async request<T>(\n method: string,\n url: string,\n body: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const headers: Record<string, string> = {\n 'x-api-key': this.config.apiKey,\n 'accept': 'application/json',\n };\n\n if (body !== undefined) {\n headers['content-type'] = 'application/json';\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n // If this is a retry, wait with exponential backoff + jitter.\n if (attempt > 0) {\n const base = this.config.retryBaseDelay * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base * 0.5;\n await sleep(base + jitter);\n }\n\n // Build an AbortController that combines the user signal with a timeout.\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n };\n\n // Wire up caller's abort signal.\n if (options?.signal) {\n if (options.signal.aborted) {\n throw new HtAgError('Request aborted', {\n url,\n cause: options.signal.reason,\n });\n }\n options.signal.addEventListener('abort', () => controller.abort(options.signal!.reason), {\n once: true,\n });\n }\n\n timeoutId = setTimeout(\n () => controller.abort(new Error('Request timed out')),\n this.config.timeout,\n );\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n cleanup();\n\n if (response.ok) {\n // 204 No Content — nothing to parse.\n if (response.status === 204) {\n return undefined as T;\n }\n return (await parseBody(response)) as T;\n }\n\n const responseBody = await parseBody(response);\n\n // Retry on retryable statuses, unless we've exhausted retries.\n if (isRetryable(response.status) && attempt < this.config.maxRetries) {\n lastError = new HtAgError(`HTTP ${response.status}`, {\n status: response.status,\n body: responseBody,\n url,\n });\n continue;\n }\n\n // Non-retryable or exhausted retries — throw typed error.\n throwForStatus(response.status, responseBody, url);\n } catch (err) {\n cleanup();\n\n // Re-throw our own typed errors.\n if (err instanceof HtAgError) {\n throw err;\n }\n\n // Handle abort / timeout.\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) {\n throw new HtAgError('Request aborted', { url, cause: err });\n }\n throw new HtAgError('Request timed out', { url, cause: err });\n }\n\n // Network / fetch errors — retry if we have attempts left.\n if (attempt < this.config.maxRetries) {\n lastError = err instanceof Error ? err : new Error(String(err));\n continue;\n }\n\n throw new HtAgError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n { url, cause: err },\n );\n }\n }\n\n // Should not reach here, but just in case.\n throw lastError ?? new HtAgError('Request failed after retries', { url });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n AddressSearchParams,\n AddressSearchResponse,\n AddressInsightsParams,\n AddressInsightsResponse,\n BatchStandardiseParams,\n BatchStandardiseResponse,\n} from './types.js';\n\n/**\n * Client for the Address API domain.\n *\n * ```ts\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class AddressClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for addresses matching a free-text query.\n *\n * `GET /v1/address/search`\n */\n async search(params: AddressSearchParams): Promise<AddressSearchResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressSearchResponse>(`/v1/address/search${qs}`, { signal });\n }\n\n /**\n * Retrieve detailed insights for one or more addresses.\n *\n * `GET /v1/address/insights`\n */\n async insights(params: AddressInsightsParams): Promise<AddressInsightsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<AddressInsightsResponse>(`/v1/address/insights${qs}`, { signal });\n }\n\n /**\n * Standardise a batch of raw address strings into structured records.\n *\n * `POST /v1/address/standardise`\n */\n async standardise(params: BatchStandardiseParams): Promise<BatchStandardiseResponse> {\n const { signal, addresses } = params;\n return this.http.post<BatchStandardiseResponse>(\n '/v1/address/standardise',\n { addresses },\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n SoldSearchParams,\n SoldPropertiesResponse,\n} from './types.js';\n\n/**\n * Client for the Property API domain.\n *\n * ```ts\n * const sold = await client.property.soldSearch({ address: '100 George St Sydney', radius: 2000 });\n * ```\n */\nexport class PropertyClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search for recently sold properties near a location.\n *\n * `GET /v1/property/sold/search`\n */\n async soldSearch(params: SoldSearchParams): Promise<SoldPropertiesResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<SoldPropertiesResponse>(`/v1/property/sold/search${qs}`, { signal });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type {\n TrendsParams,\n TrendsWithBedroomsParams,\n PriceResponse,\n RentResponse,\n YieldResponse,\n SupplyDemandResponse,\n SearchIndexResponse,\n HoldPeriodResponse,\n PerformanceResponse,\n GrowthRatesResponse,\n DemandProfileResponse,\n} from './types.js';\n\n/**\n * Client for the Markets Trends API domain.\n *\n * Each method queries a specific time-series metric:\n *\n * ```ts\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * propertyType: ['house'],\n * });\n * ```\n */\nexport class TrendsClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Price history trends.\n *\n * `GET /internal-api/v1/markets/trends/price`\n */\n async price(params: TrendsWithBedroomsParams): Promise<PriceResponse> {\n return this.trend<PriceResponse>('price', params);\n }\n\n /**\n * Rent history trends.\n *\n * `GET /v1/markets/trends/rent`\n */\n async rent(params: TrendsWithBedroomsParams): Promise<RentResponse> {\n return this.publicTrend<RentResponse>('rent', params);\n }\n\n /**\n * Yield history trends.\n *\n * `GET /v1/markets/trends/yield`\n */\n async yieldHistory(params: TrendsWithBedroomsParams): Promise<YieldResponse> {\n return this.publicTrend<YieldResponse>('yield', params);\n }\n\n /**\n * Supply and demand (monthly frequency).\n *\n * `GET /internal-api/v1/markets/trends/supply-demand`\n */\n async supplyDemand(params: TrendsWithBedroomsParams): Promise<SupplyDemandResponse> {\n return this.trend<SupplyDemandResponse>('supply-demand', params);\n }\n\n /**\n * Search interest index (quarterly frequency).\n *\n * `GET /internal-api/v1/markets/trends/search-index`\n */\n async searchIndex(params: TrendsParams): Promise<SearchIndexResponse> {\n return this.trend<SearchIndexResponse>('search-index', params);\n }\n\n /**\n * Hold period (yearly frequency).\n *\n * `GET /internal-api/v1/markets/trends/hold-period`\n */\n async holdPeriod(params: TrendsParams): Promise<HoldPeriodResponse> {\n return this.trend<HoldPeriodResponse>('hold-period', params);\n }\n\n /**\n * Performance essentials.\n *\n * `GET /internal-api/v1/markets/trends/performance`\n */\n async performance(params: TrendsWithBedroomsParams): Promise<PerformanceResponse> {\n return this.trend<PerformanceResponse>('performance', params);\n }\n\n /**\n * Growth rate cycle.\n *\n * `GET /v1/markets/trends/growth-rates`\n */\n async growthRates(params: TrendsParams): Promise<GrowthRatesResponse> {\n return this.publicTrend<GrowthRatesResponse>('growth-rates', params);\n }\n\n /**\n * Demand profile breakdown.\n *\n * `GET /v1/markets/trends/demand-profile`\n */\n async demandProfile(params: TrendsParams): Promise<DemandProfileResponse> {\n return this.publicTrend<DemandProfileResponse>('demand-profile', params);\n }\n\n // -----------------------------------------------------------------------\n // Shared implementation\n // -----------------------------------------------------------------------\n\n private async trend<T>(metric: string, params: TrendsParams | TrendsWithBedroomsParams): Promise<T> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<T>(\n `/internal-api/v1/markets/trends/${metric}${qs}`,\n { signal },\n );\n }\n\n private async publicTrend<T>(metric: string, params: TrendsParams | TrendsWithBedroomsParams): Promise<T> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.get<T>(\n `/v1/markets/trends/${metric}${qs}`,\n { signal },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport { TrendsClient } from './trends.js';\nimport type {\n SnapshotsParams,\n SnapshotsResponse,\n AdvancedSearchBody,\n MarketQueryResponse,\n} from './types.js';\nimport type { RequestOptions } from '../types.js';\n\n/**\n * Client for the Markets API domain.\n *\n * ```ts\n * const snapshots = await client.markets.snapshots({\n * level: 'suburb',\n * propertyType: ['house'],\n * });\n *\n * const prices = await client.markets.trends.price({\n * level: 'suburb',\n * areaId: ['SAL10001'],\n * });\n * ```\n */\nexport class MarketsClient {\n /** Sub-client for time-series trend endpoints. */\n readonly trends: TrendsClient;\n\n /** @internal */\n constructor(private readonly http: HttpClient) {\n this.trends = new TrendsClient(http);\n }\n\n /**\n * Retrieve market snapshot data with optional filters.\n *\n * `GET /internal-api/v1/markets/snapshots`\n */\n async snapshots(params: SnapshotsParams): Promise<SnapshotsResponse> {\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.internalGet<SnapshotsResponse>(\n `/internal-api/v1/markets/snapshots${qs}`,\n { signal },\n );\n }\n\n /**\n * Advanced market query with logical filter expressions.\n *\n * `POST /internal-api/v1/markets/query`\n */\n async query(\n body: AdvancedSearchBody,\n options?: RequestOptions,\n ): Promise<MarketQueryResponse> {\n return this.http.internalPost<MarketQueryResponse>(\n '/internal-api/v1/markets/query',\n body,\n options,\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { buildQueryString } from '../http.js';\nimport type { RequestOptions } from '../types.js';\nimport type {\n SubmitEventParams,\n ClassifiedEvent,\n QueryEventsParams,\n PaginatedEvents,\n CreateIntegrationParams,\n Integration,\n UpdateIntegrationParams,\n TestResult,\n CreateSubscriptionParams,\n Subscription,\n UpdateSubscriptionParams,\n EventCategory,\n EventType,\n TagInfo,\n} from './types.js';\n\n/**\n * Client for the Intent Hub API domain.\n *\n * ```ts\n * const event = await client.intentHub.submitEvent({\n * sourceType: 'AGENT',\n * sourceId: 'my-agent',\n * textContent: 'User wants to refinance their mortgage',\n * });\n * ```\n */\nexport class IntentHubClient {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n /**\n * Submit a raw event for classification.\n *\n * `POST /intent-hub/v1/events`\n */\n async submitEvent(params: SubmitEventParams): Promise<ClassifiedEvent> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<ClassifiedEvent>(\n '/events',\n {\n source_type: rest.sourceType,\n source_id: rest.sourceId,\n text_content: rest.textContent,\n payload: rest.payload,\n user_id: rest.userId,\n session_id: rest.sessionId,\n suggested_category: rest.suggestedCategory,\n suggested_intent: rest.suggestedIntent,\n idempotency_key: rest.idempotencyKey,\n event_type: rest.eventType,\n },\n { signal },\n );\n }\n\n /**\n * Retrieve a single classified event by ID.\n *\n * `GET /intent-hub/v1/events/:eventId`\n */\n async getEvent(eventId: string, options?: RequestOptions): Promise<ClassifiedEvent> {\n return this.http.intentHubGet<ClassifiedEvent>(\n `/events/${encodeURIComponent(eventId)}`,\n options,\n );\n }\n\n /**\n * Query classified events with optional filters.\n *\n * `GET /intent-hub/v1/events`\n */\n async queryEvents(params?: QueryEventsParams): Promise<PaginatedEvents> {\n if (!params) {\n return this.http.intentHubGet<PaginatedEvents>('/events');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<PaginatedEvents>(`/events${qs}`, { signal });\n }\n\n // -------------------------------------------------------------------------\n // Integrations\n // -------------------------------------------------------------------------\n\n /**\n * Create a new integration endpoint.\n *\n * `POST /intent-hub/v1/integrations`\n */\n async createIntegration(params: CreateIntegrationParams): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Integration>(\n '/integrations',\n {\n name: rest.name,\n type: rest.type,\n url: rest.url,\n secret: rest.secret,\n headers: rest.headers,\n config: rest.config,\n },\n { signal },\n );\n }\n\n /**\n * List all integrations for the current organisation.\n *\n * `GET /intent-hub/v1/integrations`\n */\n async listIntegrations(options?: RequestOptions): Promise<Integration[]> {\n return this.http.intentHubGet<Integration[]>('/integrations', options);\n }\n\n /**\n * Retrieve a single integration by ID.\n *\n * `GET /intent-hub/v1/integrations/:id`\n */\n async getIntegration(id: string, options?: RequestOptions): Promise<Integration> {\n return this.http.intentHubGet<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing integration.\n *\n * `PATCH /intent-hub/v1/integrations/:id`\n */\n async updateIntegration(\n id: string,\n params: UpdateIntegrationParams,\n ): Promise<Integration> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Integration>(\n `/integrations/${encodeURIComponent(id)}`,\n {\n name: rest.name,\n url: rest.url,\n secret: rest.secret,\n status: rest.status,\n },\n { signal },\n );\n }\n\n /**\n * Delete an integration by ID.\n *\n * `DELETE /intent-hub/v1/integrations/:id`\n */\n async deleteIntegration(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/integrations/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Send a test event to an integration endpoint.\n *\n * `POST /intent-hub/v1/integrations/:id/test`\n */\n async testIntegration(id: string, options?: RequestOptions): Promise<TestResult> {\n return this.http.intentHubPost<TestResult>(\n `/integrations/${encodeURIComponent(id)}/test`,\n {},\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Subscriptions\n // -------------------------------------------------------------------------\n\n /**\n * Create a new subscription linking event patterns to an integration.\n *\n * `POST /intent-hub/v1/subscriptions`\n */\n async createSubscription(params: CreateSubscriptionParams): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPost<Subscription>(\n '/subscriptions',\n {\n integration_id: rest.integrationId,\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n filters: rest.filters,\n },\n { signal },\n );\n }\n\n /**\n * List all subscriptions for the current organisation.\n *\n * `GET /intent-hub/v1/subscriptions`\n */\n async listSubscriptions(options?: RequestOptions): Promise<Subscription[]> {\n return this.http.intentHubGet<Subscription[]>('/subscriptions', options);\n }\n\n /**\n * Retrieve a single subscription by ID.\n *\n * `GET /intent-hub/v1/subscriptions/:id`\n */\n async getSubscription(id: string, options?: RequestOptions): Promise<Subscription> {\n return this.http.intentHubGet<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n /**\n * Update an existing subscription.\n *\n * `PATCH /intent-hub/v1/subscriptions/:id`\n */\n async updateSubscription(\n id: string,\n params: UpdateSubscriptionParams,\n ): Promise<Subscription> {\n const { signal, ...rest } = params;\n return this.http.intentHubPatch<Subscription>(\n `/subscriptions/${encodeURIComponent(id)}`,\n {\n event_type_slug: rest.eventTypeSlug,\n tag: rest.tag,\n intent_pattern: rest.intentPattern,\n integration_id: rest.integrationId,\n is_active: rest.isActive,\n },\n { signal },\n );\n }\n\n /**\n * Delete a subscription by ID.\n *\n * `DELETE /intent-hub/v1/subscriptions/:id`\n */\n async deleteSubscription(id: string, options?: RequestOptions): Promise<void> {\n return this.http.intentHubDelete<void>(\n `/subscriptions/${encodeURIComponent(id)}`,\n options,\n );\n }\n\n // -------------------------------------------------------------------------\n // Catalog\n // -------------------------------------------------------------------------\n\n /**\n * List all event categories in the taxonomy.\n *\n * `GET /intent-hub/v1/catalog/categories`\n */\n async listCategories(options?: RequestOptions): Promise<EventCategory[]> {\n return this.http.intentHubGet<EventCategory[]>('/catalog/categories', options);\n }\n\n /**\n * List event types, optionally filtered by category.\n *\n * `GET /intent-hub/v1/catalog/event-types`\n */\n async listEventTypes(\n params?: { category?: string } & RequestOptions,\n ): Promise<EventType[]> {\n if (!params) {\n return this.http.intentHubGet<EventType[]>('/catalog/event-types');\n }\n const { signal, ...query } = params;\n const qs = buildQueryString(query);\n return this.http.intentHubGet<EventType[]>(`/catalog/event-types${qs}`, { signal });\n }\n\n /**\n * List all tags with their usage counts.\n *\n * `GET /intent-hub/v1/catalog/tags`\n */\n async listTags(options?: RequestOptions): Promise<TagInfo[]> {\n return this.http.intentHubGet<TagInfo[]>('/catalog/tags', options);\n }\n}\n","import type { HtAgClientOptions, ResolvedConfig } from './types.js';\nimport { HttpClient } from './http.js';\nimport { AddressClient } from './address/client.js';\nimport { PropertyClient } from './property/client.js';\nimport { MarketsClient } from './markets/client.js';\nimport { IntentHubClient } from './intent-hub/client.js';\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_RETRY_BASE_DELAY = 500; // ms\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds\n\n/**\n * Build the environment-derived base URLs.\n *\n * - `prod` -> `https://api.prod.htagai.com`\n * - `dev` -> `https://api.dev.htagai.com`\n */\nfunction resolveBaseUrls(options: HtAgClientOptions): {\n publicBaseUrl: string;\n internalBaseUrl: string;\n intentHubBaseUrl: string;\n} {\n if (options.baseUrl) {\n // Strip trailing slashes for consistency.\n const base = options.baseUrl.replace(/\\/+$/, '');\n return { publicBaseUrl: base, internalBaseUrl: base, intentHubBaseUrl: base };\n }\n\n const env = options.environment ?? 'prod';\n const base = `https://api.${env}.htagai.com`;\n return {\n publicBaseUrl: base,\n internalBaseUrl: base,\n intentHubBaseUrl: `${base}/intent-hub/v1`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// HtAgApiClient\n// ---------------------------------------------------------------------------\n\n/**\n * Top-level client for the HtAG Location Intelligence APIs.\n *\n * ```ts\n * import { HtAgApiClient } from '@htag/sdk';\n *\n * const client = new HtAgApiClient({\n * apiKey: process.env.HTAG_API_KEY!,\n * environment: 'prod',\n * });\n *\n * const results = await client.address.search({ q: '100 George St Sydney' });\n * ```\n */\nexport class HtAgApiClient {\n /** Address search, insights and standardisation. */\n readonly address: AddressClient;\n\n /** Sold property search. */\n readonly property: PropertyClient;\n\n /** Market snapshots, advanced queries and time-series trends. */\n readonly markets: MarketsClient;\n\n /** Intent Hub: event classification, integrations and subscriptions. */\n readonly intentHub: IntentHubClient;\n\n constructor(options: HtAgClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'HtAgApiClient requires an apiKey. Pass it in the constructor options.',\n );\n }\n\n const { publicBaseUrl, internalBaseUrl, intentHubBaseUrl } = resolveBaseUrls(options);\n\n const config: ResolvedConfig = {\n apiKey: options.apiKey,\n publicBaseUrl,\n internalBaseUrl,\n intentHubBaseUrl,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n retryBaseDelay: options.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n };\n\n const http = new HttpClient(config);\n\n this.address = new AddressClient(http);\n this.property = new PropertyClient(http);\n this.markets = new MarketsClient(http);\n this.intentHub = new IntentHubClient(http);\n }\n}\n"],"mappings":"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","names":["base"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "htag-sdk",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Official TypeScript SDK for HtAG Location Intelligence APIs — address search, property data, and market analytics for Australia",
5
5
  "license": "MIT",
6
6
  "author": {