@signaliz/sdk 1.0.60 → 1.0.62

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
@@ -58,6 +58,11 @@ const resumedVerification = await signaliz.verifyEmail('jane@example.com', {
58
58
  verificationRunId: queuedVerification.verificationRunId,
59
59
  });
60
60
 
61
+ // Recovery is zero-current-spend. When the original provider call had a
62
+ // receipt, Find Email and Verify Email retain it separately for audit.
63
+ console.log(resumedVerification.billingMetadata?.result_returned_from); // run_recovery
64
+ console.log(resumedVerification.historicalBillingMetadata?.result_returned_from);
65
+
61
66
  const signals = await signaliz.enrichCompanySignals({
62
67
  companyDomain: 'example.com',
63
68
  researchPrompt: 'expansion priorities',
@@ -73,6 +78,12 @@ const signalDiscovery = await signaliz.discoverSignals({
73
78
  limit: 100,
74
79
  sources: ['web', 'news'],
75
80
  });
81
+ const painSignalDiscovery = await signaliz.discoverSignals({
82
+ query: 'companies showing signals they need account-signal automation',
83
+ icpContext: 'B2B SaaS companies with outbound sales teams and manual account research',
84
+ limit: 100,
85
+ sources: ['web', 'news'],
86
+ });
76
87
  const completedDiscovery = signalDiscovery.signalSearchRunId
77
88
  ? await signaliz.discoverSignals({ signalSearchRunId: signalDiscovery.signalSearchRunId })
78
89
  : signalDiscovery;
@@ -105,6 +116,20 @@ const foundBatch = await signaliz.findEmails(contacts, { concurrency: 20 });
105
116
  const signalBatch = await signaliz.enrichCompanies(companies, { concurrency: 5 });
106
117
  const copyBatch = await signaliz.createSignalCopyBatch(copyRequests, { concurrency: 5 });
107
118
 
119
+ // If a timeout or interrupted client returns a durable job ID, resume only
120
+ // that job. These methods never submit `requests` or repeat provider work.
121
+ const resumedFoundBatch = await signaliz.resumeFindEmailBatch('job_...');
122
+ const resumedVerifiedBatch = await signaliz.resumeVerifyEmailBatch('job_...');
123
+ const resumedSignalBatch = await signaliz.resumeCompanySignalBatch('job_...');
124
+ const resumedCopyBatch = await signaliz.resumeSignalCopyBatch('job_...');
125
+
126
+ // Long Company/Copy batches can return immediately with the actual durable
127
+ // job ID and idempotency key. Persist both before yielding the agent turn.
128
+ const signalJob = await signaliz.enrichCompanies(companies, {
129
+ waitForResult: false,
130
+ });
131
+ // { jobId, idempotencyKey, status, total, ... }
132
+
108
133
  // Keep one full result for exact repeats and return duplicateOf references for
109
134
  // the rest. This is lossless and avoids multiplying evidence-rich payloads.
110
135
  const compactSignals = await signaliz.enrichCompanies(companies, {
@@ -134,32 +159,48 @@ SDK, and CLI calls for the same workspace and logical input. Chunked batches
134
159
  derive a stable key from each row's original input index, including after exact
135
160
  duplicate compaction and rate-limit retries.
136
161
 
137
- Each batch accepts up to 5,000 items. For the four row-oriented core products, batches larger
138
- than 25 use one recoverable REST job; the SDK waits for completion and retrieves
139
- every result page before returning, so callers never receive queued work or
140
- polling instructions. Find Email, Verify Email, and Signal to Copy use 500-row
141
- result pages, while Company Signals uses 25-row result pages.
162
+ Each batch accepts up to 5,000 items. For the four row-oriented core products,
163
+ batches larger than 25 use one recoverable REST job. The SDK waits by default
164
+ and retrieves every result page. Large Company Signals and Signal to Copy calls
165
+ can instead set `waitForResult: false` to receive `jobId` plus the actual
166
+ `idempotencyKey`, then resume with `resumeCompanySignalBatch` or
167
+ `resumeSignalCopyBatch`. Company/Copy polling has no fixed SDK deadline unless
168
+ `maxWaitMs` is explicitly supplied; timeout errors retain both recovery fields.
169
+ Find Email, Verify Email, and Company Signals use bounded 25-row result pages;
170
+ Signal to Copy uses 100-row durable pages.
171
+ Retrieve completed Company/Copy pages within seven days. After cleanup, recovery
172
+ fails with non-retryable `BATCH_RESULTS_EXPIRED`; do not automatically resubmit
173
+ provider work, and require an explicit review before starting a new job.
142
174
  Company Signal `signal_run_id` recovery rows remain direct batches of at most
143
175
  25, matching the recovery-read API contract instead of starting a new durable
144
176
  research job.
145
- Exact duplicate tasks are single-flighted across each full batch without
146
- changing input order or result cardinality. Set `compactDuplicates: true` to
147
- return repeated successful rows as `duplicateOf` references to the zero-based
148
- canonical input index; the default remains expanded for compatibility. Signal
149
- to Copy durable jobs use available company-signal data only. If any copy row
150
- explicitly requests `skipCache` or `enableDeepSearch`, the SDK preserves that
151
- fresh-research behavior by using synchronous client-side chunks of at most 25.
177
+ Large Company Signal jobs persist bounded result pages and intentionally omit
178
+ rejected candidate-evidence diagnostics. Requests with
179
+ `includeCandidateEvidence: true` must be split into batches of at most 25.
180
+ Exact duplicate tasks are single-flighted for synchronous batches. Durable
181
+ Company/Copy submissions preserve every input row and its index so the server's
182
+ idempotency identity remains stable across REST, MCP, SDK, and CLI recovery.
183
+ Set `compactDuplicates: true` to return repeated successful rows as
184
+ `duplicateOf` references; the default remains expanded for compatibility.
185
+ Signal to Copy durable jobs use persisted, eligible company-signal data only
186
+ and never start live providers or deep research. Rows without qualifying
187
+ evidence return the terminal row error `SIGNAL_DATA_REQUIRED`. Batches larger
188
+ than 25 reject fresh/deep/synchronous row controls before HTTP; callers must
189
+ split explicitly fresh requests into batches of at most 25.
152
190
  Signal to Copy also shares company research across copy recipients.
153
191
 
154
192
  Signals Everything is query-first rather than a row batch. It defaults to 100
155
193
  distinct companies and supports up to 1,000. Every returned signal contains a
156
194
  company name, company domain, dated evidence, and a source URL. The typed
157
- `costGuardrail` reports both projected and observed source acquisition cost;
195
+ `costGuardrail` reports projected and observed source acquisition cost plus
196
+ identity-resolution cost, receipt source, and fallback-provider request count;
158
197
  Signaliz returns signals only when cost stays strictly below $0.01 per qualified
159
198
  company. A request is a ceiling, not a promise: it can return fewer results
160
199
  when public evidence cannot verify both a date and company identity. It is
161
- included on Team and Agency plans and can be resumed with
162
- `signalSearchRunId` without duplicate source acquisition.
200
+ included on Builder, Team, and Agency plans and can be resumed with
201
+ `signalSearchRunId` without duplicate source acquisition. Pass `icpContext` to
202
+ ground an open-ended request such as “companies showing signals they need our
203
+ product” in the user's target market.
163
204
 
164
205
  Company Signal Enrichment defaults `online` and `enableDeepSearch` to `true`
165
206
  unless the caller explicitly disables them. Its `searchMode` defaults to
@@ -170,6 +211,13 @@ complete, evidence-backed email variations when supported signals are available.
170
211
  Signal to Copy is cache-first and defaults `enableDeepSearch` to `false` so it
171
212
  normally finishes within an agent turn; set `skipCache` or `enableDeepSearch`
172
213
  only when fresh or deeper research is required.
214
+ Every core request uses the authenticated workspace. Find Email and Verify Email
215
+ honor that workspace's configured cache window; eligible hits cost 0 credits,
216
+ while fresh discovery or verification is charged on every plan. Builder, Team,
217
+ Agency, and Pay-As-You-Go include fresh Company Signals and Signal to Copy. Those plans
218
+ still check eligible workspace signal data first even when Company Signals is
219
+ set to No cache. `lookbackDays` remains a hard evidence-age bound for both
220
+ cached and fresh Company Signals and Signal to Copy results.
173
221
  Unclassified evidence is returned by signal enrichment but is not used to
174
222
  generate outreach copy.
175
223
  Each normalized signal keeps `date` separate from crawl-time `detectedAt` and