orangeslice 1.8.2 → 1.8.4

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/README.md CHANGED
@@ -44,10 +44,9 @@ const [companies, searchPage, ai] = await Promise.all([
44
44
 
45
45
  ## Service map
46
46
 
47
- - `services.company.linkedin.search/findUrl/enrich`
48
- - `services.person.linkedin.search/findUrl/enrich`
49
- - `services.person.contact.get`
50
- - `services.company.getEmployeesFromLinkedin`
47
+ - `services.company.linkedin.search/enrich`
48
+ - `services.company.getEmployeesFromLinkedin` (database-only B2B path)
49
+ - `services.person.linkedin.search/enrich`
51
50
  - `services.web.search/batchSearch`
52
51
  - `services.ai.generateObject`
53
52
  - `services.scrape.website`
@@ -55,21 +54,16 @@ const [companies, searchPage, ai] = await Promise.all([
55
54
  - `services.apify.runActor`
56
55
  - `services.googleMaps.scrape`
57
56
  - `services.geo.parseAddress`
58
- - `services.healthcare.npi`
59
57
  - `services.builtWith.lookupDomain/relationships/searchByTech`
60
58
 
61
59
  ## How routing works today
62
60
 
63
61
  All service calls go through `post()` in `src/api.ts`.
64
62
 
65
- - Default path: `https://enrichly-production.up.railway.app/function`
66
- - Direct path: `https://orangeslice.ai/api/function` (only when a call passes `direct: true`)
67
- - Polling split for pending/`202`:
68
- - `batch-native` (`b2b`, `batchserp`, `generateObject`) polls batch-service result endpoint.
69
- - `bridge` functions poll `https://orangeslice.ai/api/function/bridge-result`.
70
- - Inngest secrets are server-side only (Next.js route env vars), never in the npm package.
71
-
72
- The current endpoint-to-backend mapping is documented in `docs/runtime-routing.md`.
63
+ - Submit path: `https://enrichly-production.up.railway.app/function`
64
+ - Pending responses (`pending: true` / `202`) poll batch-service result endpoints.
65
+ - Polling timeout supports long-running workflows (up to 10 minutes).
66
+ - This package now exposes only batch-backed services.
73
67
 
74
68
  ## Docs installed by CLI
75
69
 
package/dist/api.d.ts CHANGED
@@ -1,9 +1,5 @@
1
- export type FunctionType = "batch-native" | "bridge";
2
- export declare const BATCH_NATIVE_FUNCTION_IDS: Set<string>;
3
1
  interface PostOptions {
4
2
  direct?: boolean;
5
3
  }
6
- export declare function getFunctionType(functionId: string): FunctionType;
7
- export declare function getBridgeResultEventName(functionId: string): string | undefined;
8
4
  export declare function post<T>(functionId: string, payload: Record<string, unknown>, options?: PostOptions): Promise<T>;
9
5
  export {};
package/dist/api.js CHANGED
@@ -1,47 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BATCH_NATIVE_FUNCTION_IDS = void 0;
4
- exports.getFunctionType = getFunctionType;
5
- exports.getBridgeResultEventName = getBridgeResultEventName;
6
3
  exports.post = post;
7
4
  /**
8
- * Runtime routing:
9
- * - Non-direct calls submit to Railway batch-service /function
10
- * - Direct calls submit to orangeslice.ai /api/function
11
- * - Pending polling splits by function type:
12
- * - default: poll batch-service /function/result
13
- * - bridge: poll Next.js bridge-result route only when backend provides bridge metadata
5
+ * Batch-only routing:
6
+ * - Submit all calls to Railway batch-service /function
7
+ * - Poll batch-service /function/result on pending responses
14
8
  */
15
9
  const BASE_URL = "https://enrichly-production.up.railway.app/function";
16
- const DIRECT_BASE_URL = "https://orangeslice.ai/api/function";
17
- const BRIDGE_POLL_URL = "https://orangeslice.ai/api/function/bridge-result";
18
- const POLL_TIMEOUT_MS = 120000;
10
+ const POLL_TIMEOUT_MS = 600000;
19
11
  const DEFAULT_POLL_INTERVAL_MS = 1000;
20
- exports.BATCH_NATIVE_FUNCTION_IDS = new Set(["b2b", "batchserp", "generateObject"]);
21
- const BRIDGE_RESULT_EVENT_BY_FUNCTION_ID = {
22
- firecrawl: "proxy/firecrawl.result",
23
- kernel: "proxy/kernel.result",
24
- apify: "proxy/apify.result",
25
- contact: "proxy/invoke.result",
26
- "linkedin/find-profile-url": "proxy/linkedin-profile-url.result",
27
- "find-linkedin-company-url": "proxy/linkedin-company-url.result",
28
- "b2b-get-employees-for-company": "proxy/invoke.result",
29
- geo: "proxy/invoke.result",
30
- npi: "proxy/invoke.result",
31
- googleMaps: "proxy/invoke.result",
32
- builtwithLookupDomain: "proxy/invoke.result",
33
- builtwithRelationships: "proxy/invoke.result",
34
- builtwithSearchByTech: "proxy/invoke.result",
35
- };
36
12
  function sleep(ms) {
37
13
  return new Promise((resolve) => setTimeout(resolve, ms));
38
14
  }
39
- function getFunctionType(functionId) {
40
- return exports.BATCH_NATIVE_FUNCTION_IDS.has(functionId) ? "batch-native" : "bridge";
41
- }
42
- function getBridgeResultEventName(functionId) {
43
- return BRIDGE_RESULT_EVENT_BY_FUNCTION_ID[functionId];
44
- }
45
15
  async function readResponseBody(res) {
46
16
  const text = await res.text();
47
17
  if (!text)
@@ -131,40 +101,16 @@ async function pollBatchUntilComplete(baseUrl, functionId, pending) {
131
101
  }
132
102
  throw new Error(`[orangeslice] ${functionId}: polling timed out after ${POLL_TIMEOUT_MS}ms`);
133
103
  }
134
- async function pollBridgeUntilComplete(functionId, callbackEventId, eventName, firstPollAfterMs) {
135
- const timeoutAt = Date.now() + POLL_TIMEOUT_MS;
136
- let pollAfterMs = typeof firstPollAfterMs === "number" && firstPollAfterMs > 0 ? firstPollAfterMs : DEFAULT_POLL_INTERVAL_MS;
137
- while (Date.now() < timeoutAt) {
138
- await sleep(pollAfterMs);
139
- const url = `${BRIDGE_POLL_URL}?callbackEventId=${encodeURIComponent(callbackEventId)}&eventName=${encodeURIComponent(eventName)}`;
140
- const res = await fetch(url, { method: "GET", headers: { "Content-Type": "application/json" } });
141
- const data = await readResponseBody(res);
142
- if (isPendingResponse(data) || res.status === 202) {
143
- const next = data.pollAfterMs;
144
- pollAfterMs = typeof next === "number" && next > 0 ? next : DEFAULT_POLL_INTERVAL_MS;
145
- continue;
146
- }
147
- if (!res.ok) {
148
- const message = asErrorMessage(data) || JSON.stringify(data);
149
- throw new Error(`[orangeslice] ${functionId}: ${res.status} ${message}`);
150
- }
151
- const message = asErrorMessage(data);
152
- if (message) {
153
- throw new Error(`[orangeslice] ${functionId}: ${message}`);
154
- }
155
- return data;
156
- }
157
- throw new Error(`[orangeslice] ${functionId}: bridge polling timed out after ${POLL_TIMEOUT_MS}ms`);
158
- }
159
104
  async function post(functionId, payload, options = {}) {
160
- const baseUrl = options.direct ? DIRECT_BASE_URL : BASE_URL;
161
- const functionType = options.direct ? "batch-native" : getFunctionType(functionId);
105
+ // Kept for backwards compatibility with older call sites.
106
+ void options;
107
+ const baseUrl = BASE_URL;
162
108
  const url = `${baseUrl}?functionId=${functionId}`;
163
109
  const body = JSON.stringify(payload);
164
110
  const res = await fetchWithRedirect(url, {
165
111
  method: "POST",
166
112
  headers: { "Content-Type": "application/json" },
167
- body,
113
+ body
168
114
  });
169
115
  if (!res.ok) {
170
116
  let message = `${res.status}`;
@@ -174,14 +120,6 @@ async function post(functionId, payload, options = {}) {
174
120
  }
175
121
  const data = await readResponseBody(res);
176
122
  if (isPendingResponse(data)) {
177
- if (functionType === "bridge") {
178
- const bridgePending = data;
179
- const resolvedCallbackId = bridgePending.callbackEventId;
180
- const resolvedEventName = bridgePending.eventName || getBridgeResultEventName(functionId);
181
- if (resolvedCallbackId && resolvedEventName) {
182
- return pollBridgeUntilComplete(functionId, resolvedCallbackId, resolvedEventName, bridgePending.pollAfterMs);
183
- }
184
- }
185
123
  return pollBatchUntilComplete(baseUrl, functionId, data);
186
124
  }
187
125
  const errorMessage = asErrorMessage(data);
package/dist/cli.js CHANGED
@@ -132,9 +132,9 @@ async function main() {
132
132
  console.log(" 2) ./orangeslice-docs/services/index.md");
133
133
  console.log(' Then tell it: "Use these docs as source of truth for all orangeslice operations."\n');
134
134
  console.log(" Routing note:");
135
- console.log(" - LinkedIn SQL (functionId=b2b) is routed direct");
136
- console.log(" - batch-native: b2b/batchserp/generateObject poll batch-service results");
137
- console.log(" - bridge functions poll a server route (Inngest keys are server-side only)\n");
135
+ console.log(" - all services submit to the batch-service /function endpoint");
136
+ console.log(" - pending jobs poll batch-service /function/result endpoints");
137
+ console.log(" - this package currently includes only batch-backed services\n");
138
138
  console.log(" // LinkedIn B2B SQL");
139
139
  console.log(' const { rows } = await services.company.linkedin.search({ sql: "SELECT * FROM linkedin_company LIMIT 10" });\n');
140
140
  console.log(" // Web search");
@@ -1,11 +1,37 @@
1
- export declare function personLinkedinFindUrl(params: Record<string, unknown>): Promise<unknown>;
1
+ export interface CompanyGetEmployeesFromLinkedinParams {
2
+ companySlug?: string;
3
+ linkedinUrl?: string;
4
+ searchStrategy?: "database" | "web";
5
+ titleVariations?: string[];
6
+ titleSqlFilter?: string;
7
+ sqlFilterClause?: string;
8
+ limit?: number;
9
+ onlyCurrent?: boolean;
10
+ usOnly?: boolean;
11
+ minConnections?: number;
12
+ offset?: number;
13
+ }
14
+ export interface CompanyEmployeeFromB2B {
15
+ lp_first_name: string | null;
16
+ lp_last_name: string | null;
17
+ lp_formatted_name: string | null;
18
+ lp_headline: string | null;
19
+ lp_location_name: string | null;
20
+ lp_public_profile_url: string | null;
21
+ lp_title: string | null;
22
+ lp_company_name: string | null;
23
+ lp_start_date: string | null;
24
+ lp_connections: number | null;
25
+ }
26
+ export interface CompanyGetEmployeesFromLinkedinResult {
27
+ employees: CompanyEmployeeFromB2B[];
28
+ nextPage: number | null;
29
+ totalResults: number | null;
30
+ }
2
31
  export declare function personLinkedinEnrich(params: Record<string, unknown>): Promise<unknown>;
3
- export declare function personContactGet(params: Record<string, unknown>): Promise<unknown>;
4
- export declare function companyLinkedinFindUrl(params: Record<string, unknown>): Promise<unknown>;
5
32
  export declare function companyLinkedinEnrich(params: Record<string, unknown>): Promise<unknown>;
6
- export declare function companyGetEmployeesFromLinkedin(params: Record<string, unknown>): Promise<unknown>;
33
+ export declare function companyGetEmployeesFromLinkedin(params: CompanyGetEmployeesFromLinkedinParams): Promise<CompanyGetEmployeesFromLinkedinResult>;
7
34
  export declare function geoParseAddress(params: Record<string, unknown>): Promise<unknown>;
8
- export declare function healthcareNpi(params: Record<string, unknown>): Promise<unknown>;
9
35
  export declare function builtWithLookupDomain(params: Record<string, unknown>): Promise<unknown>;
10
36
  export declare function builtWithRelationships(params: Record<string, unknown>): Promise<unknown>;
11
37
  export declare function builtWithSearchByTech(params: Record<string, unknown>): Promise<unknown>;
package/dist/expansion.js CHANGED
@@ -1,13 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.personLinkedinFindUrl = personLinkedinFindUrl;
4
3
  exports.personLinkedinEnrich = personLinkedinEnrich;
5
- exports.personContactGet = personContactGet;
6
- exports.companyLinkedinFindUrl = companyLinkedinFindUrl;
7
4
  exports.companyLinkedinEnrich = companyLinkedinEnrich;
8
5
  exports.companyGetEmployeesFromLinkedin = companyGetEmployeesFromLinkedin;
9
6
  exports.geoParseAddress = geoParseAddress;
10
- exports.healthcareNpi = healthcareNpi;
11
7
  exports.builtWithLookupDomain = builtWithLookupDomain;
12
8
  exports.builtWithRelationships = builtWithRelationships;
13
9
  exports.builtWithSearchByTech = builtWithSearchByTech;
@@ -22,9 +18,6 @@ function extractLinkedinUsername(url) {
22
18
  const slug = match[1].trim();
23
19
  return slug.length > 0 ? slug : undefined;
24
20
  }
25
- async function personLinkedinFindUrl(params) {
26
- return (0, api_1.post)("linkedin/find-profile-url", params);
27
- }
28
21
  async function personLinkedinEnrich(params) {
29
22
  const url = typeof params.url === "string" ? params.url.trim() : "";
30
23
  const username = typeof params.username === "string" && params.username.trim().length > 0
@@ -70,27 +63,6 @@ async function personLinkedinEnrich(params) {
70
63
  const data = await (0, api_1.post)("b2b", { sql }, { direct: true });
71
64
  return data.rows?.[0] ?? null;
72
65
  }
73
- async function personContactGet(params) {
74
- return (0, api_1.post)("contact", params);
75
- }
76
- async function companyLinkedinFindUrl(params) {
77
- const companyName = typeof params.companyName === "string" && params.companyName.trim().length > 0
78
- ? params.companyName.trim()
79
- : typeof params.name === "string" && params.name.trim().length > 0
80
- ? params.name.trim()
81
- : undefined;
82
- const website = typeof params.website === "string" && params.website.trim().length > 0
83
- ? params.website.trim()
84
- : typeof params.domain === "string" && params.domain.trim().length > 0
85
- ? params.domain.trim()
86
- : undefined;
87
- const payload = {
88
- ...params,
89
- ...(companyName ? { companyName } : {}),
90
- ...(website ? { website } : {}),
91
- };
92
- return (0, api_1.post)("find-linkedin-company-url", payload);
93
- }
94
66
  async function companyLinkedinEnrich(params) {
95
67
  const shorthand = typeof params.shorthand === "string" ? params.shorthand.trim() : "";
96
68
  const url = typeof params.url === "string" ? params.url.trim() : "";
@@ -114,16 +86,11 @@ async function companyLinkedinEnrich(params) {
114
86
  return data.rows?.[0] ?? null;
115
87
  }
116
88
  async function companyGetEmployeesFromLinkedin(params) {
117
- // Route through the dedicated backend function, which uses optimized query plans.
118
- // The raw SQL fallback can hit 60s statement timeouts on large companies.
119
89
  return (0, api_1.post)("b2b-get-employees-for-company", params);
120
90
  }
121
91
  async function geoParseAddress(params) {
122
92
  return (0, api_1.post)("geo", params);
123
93
  }
124
- async function healthcareNpi(params) {
125
- return (0, api_1.post)("npi", params);
126
- }
127
94
  async function builtWithLookupDomain(params) {
128
95
  return (0, api_1.post)("builtwithLookupDomain", params);
129
96
  }
package/dist/index.d.ts CHANGED
@@ -12,7 +12,8 @@ export { runApifyActor } from "./apify";
12
12
  export type { RunActorParams, RunActorResult, DatasetListParams } from "./apify";
13
13
  export { googleMapsScrape } from "./googleMaps";
14
14
  export type { GoogleMapsScrapeParams } from "./googleMaps";
15
- export { personLinkedinFindUrl, personLinkedinEnrich, personContactGet, companyLinkedinFindUrl, companyLinkedinEnrich, companyGetEmployeesFromLinkedin, geoParseAddress, healthcareNpi, builtWithLookupDomain, builtWithRelationships, builtWithSearchByTech, } from "./expansion";
15
+ export { personLinkedinEnrich, companyLinkedinEnrich, companyGetEmployeesFromLinkedin, geoParseAddress, builtWithLookupDomain, builtWithRelationships, builtWithSearchByTech } from "./expansion";
16
+ export type { CompanyGetEmployeesFromLinkedinParams, CompanyGetEmployeesFromLinkedinResult, CompanyEmployeeFromB2B } from "./expansion";
16
17
  import { linkedinSearch } from "./b2b";
17
18
  import { webBatchSearch, webSearch } from "./serp";
18
19
  import { generateObject } from "./generateObject";
@@ -20,11 +21,10 @@ import { scrapeWebsite } from "./firecrawl";
20
21
  import { browserExecute } from "./browser";
21
22
  import { runApifyActor } from "./apify";
22
23
  import { googleMapsScrape } from "./googleMaps";
23
- import { personLinkedinFindUrl, personLinkedinEnrich, personContactGet, companyLinkedinFindUrl, companyLinkedinEnrich, companyGetEmployeesFromLinkedin, geoParseAddress, healthcareNpi, builtWithLookupDomain, builtWithRelationships, builtWithSearchByTech } from "./expansion";
24
+ import { personLinkedinEnrich, companyLinkedinEnrich, companyGetEmployeesFromLinkedin, geoParseAddress, builtWithLookupDomain, builtWithRelationships, builtWithSearchByTech } from "./expansion";
24
25
  export declare const services: {
25
26
  company: {
26
27
  linkedin: {
27
- findUrl: typeof companyLinkedinFindUrl;
28
28
  enrich: typeof companyLinkedinEnrich;
29
29
  search: typeof linkedinSearch;
30
30
  };
@@ -32,13 +32,9 @@ export declare const services: {
32
32
  };
33
33
  person: {
34
34
  linkedin: {
35
- findUrl: typeof personLinkedinFindUrl;
36
35
  enrich: typeof personLinkedinEnrich;
37
36
  search: typeof linkedinSearch;
38
37
  };
39
- contact: {
40
- get: typeof personContactGet;
41
- };
42
38
  };
43
39
  web: {
44
40
  search: typeof webSearch;
@@ -59,9 +55,6 @@ export declare const services: {
59
55
  geo: {
60
56
  parseAddress: typeof geoParseAddress;
61
57
  };
62
- healthcare: {
63
- npi: typeof healthcareNpi;
64
- };
65
58
  googleMaps: {
66
59
  scrape: typeof googleMapsScrape;
67
60
  };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.services = exports.builtWithSearchByTech = exports.builtWithRelationships = exports.builtWithLookupDomain = exports.healthcareNpi = exports.geoParseAddress = exports.companyGetEmployeesFromLinkedin = exports.companyLinkedinEnrich = exports.companyLinkedinFindUrl = exports.personContactGet = exports.personLinkedinEnrich = exports.personLinkedinFindUrl = exports.googleMapsScrape = exports.runApifyActor = exports.browserExecute = exports.scrapeWebsite = exports.generateObject = exports.webBatchSearch = exports.webSearch = exports.linkedinSearch = void 0;
3
+ exports.services = exports.builtWithSearchByTech = exports.builtWithRelationships = exports.builtWithLookupDomain = exports.geoParseAddress = exports.companyGetEmployeesFromLinkedin = exports.companyLinkedinEnrich = exports.personLinkedinEnrich = exports.googleMapsScrape = exports.runApifyActor = exports.browserExecute = exports.scrapeWebsite = exports.generateObject = exports.webBatchSearch = exports.webSearch = exports.linkedinSearch = void 0;
4
4
  var b2b_1 = require("./b2b");
5
5
  Object.defineProperty(exports, "linkedinSearch", { enumerable: true, get: function () { return b2b_1.linkedinSearch; } });
6
6
  var serp_1 = require("./serp");
@@ -17,14 +17,10 @@ Object.defineProperty(exports, "runApifyActor", { enumerable: true, get: functio
17
17
  var googleMaps_1 = require("./googleMaps");
18
18
  Object.defineProperty(exports, "googleMapsScrape", { enumerable: true, get: function () { return googleMaps_1.googleMapsScrape; } });
19
19
  var expansion_1 = require("./expansion");
20
- Object.defineProperty(exports, "personLinkedinFindUrl", { enumerable: true, get: function () { return expansion_1.personLinkedinFindUrl; } });
21
20
  Object.defineProperty(exports, "personLinkedinEnrich", { enumerable: true, get: function () { return expansion_1.personLinkedinEnrich; } });
22
- Object.defineProperty(exports, "personContactGet", { enumerable: true, get: function () { return expansion_1.personContactGet; } });
23
- Object.defineProperty(exports, "companyLinkedinFindUrl", { enumerable: true, get: function () { return expansion_1.companyLinkedinFindUrl; } });
24
21
  Object.defineProperty(exports, "companyLinkedinEnrich", { enumerable: true, get: function () { return expansion_1.companyLinkedinEnrich; } });
25
22
  Object.defineProperty(exports, "companyGetEmployeesFromLinkedin", { enumerable: true, get: function () { return expansion_1.companyGetEmployeesFromLinkedin; } });
26
23
  Object.defineProperty(exports, "geoParseAddress", { enumerable: true, get: function () { return expansion_1.geoParseAddress; } });
27
- Object.defineProperty(exports, "healthcareNpi", { enumerable: true, get: function () { return expansion_1.healthcareNpi; } });
28
24
  Object.defineProperty(exports, "builtWithLookupDomain", { enumerable: true, get: function () { return expansion_1.builtWithLookupDomain; } });
29
25
  Object.defineProperty(exports, "builtWithRelationships", { enumerable: true, get: function () { return expansion_1.builtWithRelationships; } });
30
26
  Object.defineProperty(exports, "builtWithSearchByTech", { enumerable: true, get: function () { return expansion_1.builtWithSearchByTech; } });
@@ -39,51 +35,43 @@ const expansion_2 = require("./expansion");
39
35
  exports.services = {
40
36
  company: {
41
37
  linkedin: {
42
- findUrl: expansion_2.companyLinkedinFindUrl,
43
38
  enrich: expansion_2.companyLinkedinEnrich,
44
- search: b2b_2.linkedinSearch,
39
+ search: b2b_2.linkedinSearch
45
40
  },
46
- getEmployeesFromLinkedin: expansion_2.companyGetEmployeesFromLinkedin,
41
+ getEmployeesFromLinkedin: expansion_2.companyGetEmployeesFromLinkedin
47
42
  },
48
43
  person: {
49
44
  linkedin: {
50
- findUrl: expansion_2.personLinkedinFindUrl,
51
45
  enrich: expansion_2.personLinkedinEnrich,
52
- search: b2b_2.linkedinSearch,
53
- },
54
- contact: {
55
- get: expansion_2.personContactGet,
56
- },
46
+ search: b2b_2.linkedinSearch
47
+ }
57
48
  },
58
49
  web: {
59
50
  search: serp_2.webSearch,
60
- batchSearch: serp_2.webBatchSearch,
51
+ batchSearch: serp_2.webBatchSearch
61
52
  },
62
53
  ai: {
63
- generateObject: generateObject_2.generateObject,
54
+ generateObject: generateObject_2.generateObject
64
55
  },
65
56
  scrape: {
66
- website: firecrawl_2.scrapeWebsite,
57
+ website: firecrawl_2.scrapeWebsite
67
58
  },
68
59
  browser: {
69
- execute: browser_2.browserExecute,
60
+ execute: browser_2.browserExecute
70
61
  },
71
62
  apify: {
72
- runActor: apify_2.runApifyActor,
63
+ runActor: apify_2.runApifyActor
73
64
  },
74
65
  geo: {
75
- parseAddress: expansion_2.geoParseAddress,
76
- },
77
- healthcare: {
78
- npi: expansion_2.healthcareNpi,
66
+ parseAddress: expansion_2.geoParseAddress
79
67
  },
80
68
  googleMaps: {
81
- scrape: googleMaps_2.googleMapsScrape,
69
+ scrape: googleMaps_2.googleMapsScrape
82
70
  },
83
71
  builtWith: {
84
72
  lookupDomain: expansion_2.builtWithLookupDomain,
85
73
  relationships: expansion_2.builtWithRelationships,
86
- searchByTech: expansion_2.builtWithSearchByTech,
87
- },
74
+ searchByTech: expansion_2.builtWithSearchByTech
75
+ }
88
76
  };
89
77
  exports.default = exports.services;
@@ -7,11 +7,11 @@ description: Technographic data enrichment — discover what technologies, frame
7
7
 
8
8
  ## Available Methods
9
9
 
10
- | Method | Description | Credits |
11
- | --------------- | -------------------------------------- | -------- |
12
- | `lookupDomain` | Get full technology stack for a domain | 1 |
13
- | `relationships` | Find related/connected domains | 1 |
14
- | `searchByTech` | Find companies using a specific tech | 1/result |
10
+ | Method | Description | Credits |
11
+ | --------------- | -------------------------------------- | ---------------------------- |
12
+ | `lookupDomain` | Get full technology stack for a domain | 1 |
13
+ | `relationships` | Find related/connected domains | 1 |
14
+ | `searchByTech` | Find companies using a specific tech | 1/result (up to 900/page) |
15
15
 
16
16
  ## Use Cases
17
17
 
@@ -31,6 +31,7 @@ description: Technographic data enrichment — discover what technologies, frame
31
31
 
32
32
  - **Case-sensitive**: Use "Hubspot" not "HubSpot"
33
33
  - **Find exact names**: Use `lookupDomain` on a site to see correct tech names
34
+ - **Pagination**: Each page returns up to 900 results (= 900 credits per page). Use `offset` from previous response to get next page.
34
35
 
35
36
  ## Example Workflows
36
37
 
@@ -1,4 +1,4 @@
1
- /** Credits: 1 per result returned. */
1
+ /** Credits: 1 per result returned. Each page returns up to 900 results (= up to 900 credits per page). */
2
2
 
3
3
  /**
4
4
  * Find companies/domains that use a specific technology.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orangeslice",
3
- "version": "1.8.2",
3
+ "version": "1.8.4",
4
4
  "description": "B2B LinkedIn database prospector - 1.15B profiles, 85M companies",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -15,8 +15,7 @@
15
15
  "scripts": {
16
16
  "sync-docs": "node scripts/sync-docs.mjs",
17
17
  "build": "tsc",
18
- "prepublishOnly": "npm run sync-docs && npm run build",
19
- "test": "npx tsx test.ts"
18
+ "prepublishOnly": "npm run sync-docs && npm run build"
20
19
  },
21
20
  "keywords": [
22
21
  "b2b",