autotouch-cli 0.2.72__tar.gz → 0.2.73__tar.gz

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.
Files changed (53) hide show
  1. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/PKG-INFO +4 -1
  2. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/README.md +3 -0
  3. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/cli.py +6 -0
  4. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/linkedin.py +186 -1
  5. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/data/CLI_REFERENCE.md +139 -5
  6. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/data/cli-manifest.json +819 -3
  7. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/parser.py +3 -0
  8. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli.egg-info/PKG-INFO +4 -1
  9. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_shared/linkedin_contract.py +62 -1
  10. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/pyproject.toml +1 -1
  11. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/MANIFEST.in +0 -0
  12. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/__init__.py +0 -0
  13. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/cli_contracts.py +0 -0
  14. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/__init__.py +0 -0
  15. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/agents.py +0 -0
  16. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/auth.py +0 -0
  17. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/cells.py +0 -0
  18. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/columns.py +0 -0
  19. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/jobs.py +0 -0
  20. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/leads.py +0 -0
  21. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/prompts.py +0 -0
  22. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/rows.py +0 -0
  23. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/search.py +0 -0
  24. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/sequences.py +0 -0
  25. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/tables.py +0 -0
  26. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/tasks.py +0 -0
  27. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/webhooks.py +0 -0
  28. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/commands/workspace_secrets.py +0 -0
  29. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/core/__init__.py +0 -0
  30. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/core/auth.py +0 -0
  31. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/core/config.py +0 -0
  32. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/core/csv_import.py +0 -0
  33. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/core/http.py +0 -0
  34. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/core/io.py +0 -0
  35. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/core/output.py +0 -0
  36. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/core/polling.py +0 -0
  37. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/core/run.py +0 -0
  38. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/core/validation.py +0 -0
  39. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/exceptions.py +0 -0
  40. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/mongo_status.py +0 -0
  41. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/parser_groups.py +0 -0
  42. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/sequence_support.py +0 -0
  43. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli/templates.py +0 -0
  44. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli.egg-info/SOURCES.txt +0 -0
  45. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli.egg-info/dependency_links.txt +0 -0
  46. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli.egg-info/entry_points.txt +0 -0
  47. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli.egg-info/requires.txt +0 -0
  48. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_cli.egg-info/top_level.txt +0 -0
  49. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_shared/__init__.py +0 -0
  50. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_shared/linkedin_filters.py +0 -0
  51. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_shared/provider_registry.py +0 -0
  52. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/autotouch_shared/search_contract.py +0 -0
  53. {autotouch_cli-0.2.72 → autotouch_cli-0.2.73}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: autotouch-cli
3
- Version: 0.2.72
3
+ Version: 0.2.73
4
4
  Summary: Autotouch Smart Table CLI
5
5
  Project-URL: Homepage, https://app.autotouch.ai
6
6
  Project-URL: Documentation, https://github.com/nicolonic/autotouch_main/tree/main/docs/research-table/reference
@@ -134,6 +134,7 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
134
134
  - Create a workflow column: `autotouch columns recipe`, `autotouch columns create`
135
135
  - Run provider-hidden search: `autotouch search companies`, `autotouch search people`
136
136
  - Inspect LinkedIn/Sales Nav filters: `autotouch linkedin filters --api sales_navigator --category people`
137
+ - Build a paced LinkedIn people list: `autotouch linkedin list-build create --company-query 'SaaS startups' --headcount 1-10 --people-query 'Account Executive OR SDR' --num-results 250 --wait`
137
138
  - Run one LinkedIn search page/debug replay: `autotouch linkedin search`
138
139
  - Run controlled slices: `autotouch columns run-next`
139
140
  - Poll authoritative state: `autotouch jobs get`
@@ -148,6 +149,8 @@ For automation or agent-driven setup, use:
148
149
  - `autotouch cli-reference` for the shipped parser-generated reference
149
150
  - `autotouch capabilities --output json` for provider/workflow contracts
150
151
  - `autotouch linkedin filters --output json` for LinkedIn/Sales Navigator filter tokens such as headcount, industry, location, role, function, and seniority
152
+ - `autotouch linkedin list-build create` for durable LinkedIn/Sales Navigator list building with paced provider requests, visible progress, and cooldown status
153
+ - `autotouch linkedin search` for one-page LinkedIn/Sales Navigator replay/debug searches; it is not the recommended path for large lists
151
154
  - `autotouch rows list` / `autotouch rows get` / `autotouch cells get` for read-back and audit
152
155
  - `autotouch sequences ...` and `autotouch tasks ...` for sequence/task workflows
153
156
  - `pip install 'autotouch-cli[mongo]'` if you need the Mongo-backed `status` / `watch` commands
@@ -109,6 +109,7 @@ autotouch rows get --table-id "$TABLE_ID" --row-id "$ROW_ID" --output json
109
109
  - Create a workflow column: `autotouch columns recipe`, `autotouch columns create`
110
110
  - Run provider-hidden search: `autotouch search companies`, `autotouch search people`
111
111
  - Inspect LinkedIn/Sales Nav filters: `autotouch linkedin filters --api sales_navigator --category people`
112
+ - Build a paced LinkedIn people list: `autotouch linkedin list-build create --company-query 'SaaS startups' --headcount 1-10 --people-query 'Account Executive OR SDR' --num-results 250 --wait`
112
113
  - Run one LinkedIn search page/debug replay: `autotouch linkedin search`
113
114
  - Run controlled slices: `autotouch columns run-next`
114
115
  - Poll authoritative state: `autotouch jobs get`
@@ -123,6 +124,8 @@ For automation or agent-driven setup, use:
123
124
  - `autotouch cli-reference` for the shipped parser-generated reference
124
125
  - `autotouch capabilities --output json` for provider/workflow contracts
125
126
  - `autotouch linkedin filters --output json` for LinkedIn/Sales Navigator filter tokens such as headcount, industry, location, role, function, and seniority
127
+ - `autotouch linkedin list-build create` for durable LinkedIn/Sales Navigator list building with paced provider requests, visible progress, and cooldown status
128
+ - `autotouch linkedin search` for one-page LinkedIn/Sales Navigator replay/debug searches; it is not the recommended path for large lists
126
129
  - `autotouch rows list` / `autotouch rows get` / `autotouch cells get` for read-back and audit
127
130
  - `autotouch sequences ...` and `autotouch tasks ...` for sequence/task workflows
128
131
  - `pip install 'autotouch-cli[mongo]'` if you need the Mongo-backed `status` / `watch` commands
@@ -95,6 +95,9 @@ from autotouch_cli.commands.linkedin import (
95
95
  cmd_linkedin_comments as cmd_linkedin_comments_impl,
96
96
  cmd_linkedin_filters as cmd_linkedin_filters_impl,
97
97
  cmd_linkedin_limits as cmd_linkedin_limits_impl,
98
+ cmd_linkedin_list_build_create as cmd_linkedin_list_build_create_impl,
99
+ cmd_linkedin_list_build_results as cmd_linkedin_list_build_results_impl,
100
+ cmd_linkedin_list_build_status as cmd_linkedin_list_build_status_impl,
98
101
  cmd_linkedin_post as cmd_linkedin_post_impl,
99
102
  cmd_linkedin_posts as cmd_linkedin_posts_impl,
100
103
  cmd_linkedin_reactions as cmd_linkedin_reactions_impl,
@@ -1546,6 +1549,9 @@ _register("linkedin_limits", cmd_linkedin_limits_impl, _linkedin_command_runtime
1546
1549
  _register("linkedin_search", cmd_linkedin_search_impl, _linkedin_command_runtime)
1547
1550
  _register("linkedin_search_params", cmd_linkedin_search_params_impl, _linkedin_command_runtime)
1548
1551
  _register("linkedin_filters", cmd_linkedin_filters_impl, _linkedin_command_runtime)
1552
+ _register("linkedin_list_build_create", cmd_linkedin_list_build_create_impl, _linkedin_command_runtime)
1553
+ _register("linkedin_list_build_status", cmd_linkedin_list_build_status_impl, _linkedin_command_runtime)
1554
+ _register("linkedin_list_build_results", cmd_linkedin_list_build_results_impl, _linkedin_command_runtime)
1549
1555
  _register("linkedin_posts", cmd_linkedin_posts_impl, _linkedin_command_runtime)
1550
1556
  _register("linkedin_post", cmd_linkedin_post_impl, _linkedin_command_runtime)
1551
1557
  _register("linkedin_comments", cmd_linkedin_comments_impl, _linkedin_command_runtime)
@@ -2,8 +2,9 @@ from __future__ import annotations
2
2
 
3
3
  import argparse
4
4
  import json
5
+ import time
5
6
  from dataclasses import dataclass
6
- from typing import Any, Callable, Dict, Optional, Sequence
7
+ from typing import Any, Callable, Dict, List, Optional, Sequence
7
8
 
8
9
  from autotouch_shared.linkedin_filters import linkedin_filter_catalog
9
10
  from autotouch_cli.exceptions import AutotouchInputError
@@ -118,6 +119,155 @@ def cmd_linkedin_search_params(args: argparse.Namespace, *, runtime: LinkedInCom
118
119
  runtime.print_json(data, args.compact)
119
120
 
120
121
 
122
+ def _load_optional_json_object(raw: Optional[str], *, context: str) -> Optional[Dict[str, Any]]:
123
+ if not raw:
124
+ return None
125
+ try:
126
+ parsed = json.loads(raw)
127
+ except Exception as exc:
128
+ raise AutotouchInputError(f"invalid JSON for {context}: {exc}") from exc
129
+ if not isinstance(parsed, dict):
130
+ raise AutotouchInputError(f"{context} must be a JSON object")
131
+ return parsed
132
+
133
+
134
+ def _split_repeated_values(values: Optional[List[str]]) -> List[str]:
135
+ output: List[str] = []
136
+ for raw in values or []:
137
+ for part in str(raw).replace("\n", ",").split(","):
138
+ value = part.strip()
139
+ if value:
140
+ output.append(value)
141
+ return output
142
+
143
+
144
+ def _normalize_linkedin_list_build_payload(args: argparse.Namespace, *, runtime: LinkedInCommandRuntime) -> Dict[str, Any]:
145
+ explicit = runtime.load_json_input(
146
+ inline_json=getattr(args, "data_json", None),
147
+ file_path=getattr(args, "data_file", None),
148
+ context="data",
149
+ default=None,
150
+ )
151
+ if explicit is not None:
152
+ if not isinstance(explicit, dict):
153
+ raise AutotouchInputError("linkedin list-build payload must be a JSON object")
154
+ return explicit
155
+
156
+ company_query = str(getattr(args, "company_query", "") or "").strip()
157
+ if not company_query:
158
+ raise AutotouchInputError("linkedin list-build create requires --company-query or --data-file")
159
+
160
+ payload: Dict[str, Any] = {
161
+ "mode": str(getattr(args, "mode", "company-first-people") or "company-first-people").strip(),
162
+ "company_query": company_query,
163
+ "headcount": str(getattr(args, "headcount", "1-10") or "1-10").strip(),
164
+ "num_results": max(1, min(int(getattr(args, "num_results", 100) or 100), 1000)),
165
+ }
166
+ people_query = str(getattr(args, "people_query", "") or "").strip()
167
+ if people_query:
168
+ payload["people_query"] = people_query
169
+ linkedin_api = str(getattr(args, "linkedin_api", "auto") or "auto").strip()
170
+ if linkedin_api and linkedin_api != "auto":
171
+ payload["linkedin_api"] = linkedin_api
172
+ excluded_titles = _split_repeated_values(getattr(args, "excluded_title", None))
173
+ if excluded_titles:
174
+ payload["excluded_titles"] = excluded_titles
175
+ for arg_name, payload_key, context in (
176
+ ("extra_params_json", "extra_params", "extra-params"),
177
+ ("company_extra_params_json", "company_extra_params", "company-extra-params"),
178
+ ("people_extra_params_json", "people_extra_params", "people-extra-params"),
179
+ ):
180
+ parsed = _load_optional_json_object(getattr(args, arg_name, None), context=context)
181
+ if parsed is not None:
182
+ payload[payload_key] = parsed
183
+ return payload
184
+
185
+
186
+ def _wait_for_linkedin_list_build(
187
+ job_id: str,
188
+ args: argparse.Namespace,
189
+ *,
190
+ runtime: LinkedInCommandRuntime,
191
+ token: Optional[str],
192
+ ) -> Dict[str, Any]:
193
+ started = time.time()
194
+ interval = max(1, int(getattr(args, "poll_interval", 5) or 5))
195
+ timeout = max(0, int(getattr(args, "wait_timeout", 0) or 0))
196
+ terminal = {"completed", "error", "cancelled"}
197
+ latest: Dict[str, Any] = {}
198
+
199
+ while True:
200
+ latest = runtime.request_api(
201
+ "GET",
202
+ f"/api/integrations/linkedin/list-builds/{job_id}",
203
+ base_url=args.base_url,
204
+ token=token,
205
+ use_x_api_key=args.use_x_api_key,
206
+ timeout=args.timeout,
207
+ verbose=args.verbose,
208
+ )
209
+ status = str(latest.get("status") or "").strip().lower() if isinstance(latest, dict) else ""
210
+ if status in terminal:
211
+ return latest
212
+ if timeout and (time.time() - started) >= timeout:
213
+ return latest
214
+ time.sleep(interval)
215
+
216
+
217
+ def cmd_linkedin_list_build_create(args: argparse.Namespace, *, runtime: LinkedInCommandRuntime) -> None:
218
+ token = runtime.resolve_token(args.token, required=True)
219
+ payload = _normalize_linkedin_list_build_payload(args, runtime=runtime)
220
+ data = runtime.request_api(
221
+ "POST",
222
+ "/api/integrations/linkedin/list-builds",
223
+ base_url=args.base_url,
224
+ token=token,
225
+ use_x_api_key=args.use_x_api_key,
226
+ payload=payload,
227
+ timeout=args.timeout,
228
+ verbose=args.verbose,
229
+ )
230
+ if getattr(args, "wait", False) and isinstance(data, dict) and data.get("job_id"):
231
+ data = _wait_for_linkedin_list_build(str(data["job_id"]), args, runtime=runtime, token=token)
232
+ runtime.print_json(data, args.compact)
233
+
234
+
235
+ def cmd_linkedin_list_build_status(args: argparse.Namespace, *, runtime: LinkedInCommandRuntime) -> None:
236
+ token = runtime.resolve_token(args.token, required=True)
237
+ job_id = str(args.job_id).strip()
238
+ data = runtime.request_api(
239
+ "GET",
240
+ f"/api/integrations/linkedin/list-builds/{job_id}",
241
+ base_url=args.base_url,
242
+ token=token,
243
+ use_x_api_key=args.use_x_api_key,
244
+ timeout=args.timeout,
245
+ verbose=args.verbose,
246
+ )
247
+ runtime.print_json(data, args.compact)
248
+
249
+
250
+ def cmd_linkedin_list_build_results(args: argparse.Namespace, *, runtime: LinkedInCommandRuntime) -> None:
251
+ token = runtime.resolve_token(args.token, required=True)
252
+ job_id = str(args.job_id).strip()
253
+ params: Dict[str, Any] = {
254
+ "type": str(getattr(args, "type", "people") or "people"),
255
+ "page": max(1, int(getattr(args, "page", 1) or 1)),
256
+ "page_size": max(1, min(int(getattr(args, "page_size", 50) or 50), 500)),
257
+ }
258
+ data = runtime.request_api(
259
+ "GET",
260
+ f"/api/integrations/linkedin/list-builds/{job_id}/results",
261
+ base_url=args.base_url,
262
+ token=token,
263
+ use_x_api_key=args.use_x_api_key,
264
+ params=params,
265
+ timeout=args.timeout,
266
+ verbose=args.verbose,
267
+ )
268
+ runtime.print_json(data, args.compact)
269
+
270
+
121
271
  def cmd_linkedin_filters(args: argparse.Namespace, *, runtime: LinkedInCommandRuntime) -> None:
122
272
  output = linkedin_filter_catalog(
123
273
  api_mode=getattr(args, "api", None),
@@ -293,6 +443,41 @@ def register_linkedin_subcommands(
293
443
  add_api_common_arguments(filters_parser)
294
444
  filters_parser.set_defaults(func=handlers["filters"])
295
445
 
446
+ list_build_parser = linkedin_sub.add_parser("list-build", help="Create and inspect paced LinkedIn list-build jobs")
447
+ list_build_sub = list_build_parser.add_subparsers(dest="linkedin_list_build_cmd", required=True)
448
+
449
+ list_build_create = list_build_sub.add_parser("create", help="Create a paced background LinkedIn list-build job")
450
+ list_build_create.add_argument("--data-json", help="Explicit list-build payload JSON (overrides individual flags)")
451
+ list_build_create.add_argument("--data-file", help="Path to list-build payload JSON file")
452
+ list_build_create.add_argument("--mode", choices=["company-first-people"], default="company-first-people", help="List build mode")
453
+ list_build_create.add_argument("--linkedin-api", choices=["auto", "classic", "sales_navigator"], default="auto", help="API mode (default: auto; uses connected account mode)")
454
+ list_build_create.add_argument("--company-query", help="Company-search query used to build the seed account set")
455
+ list_build_create.add_argument("--people-query", help="People-search query/title terms")
456
+ list_build_create.add_argument("--headcount", default="1-10", help="Company headcount range, e.g. 1-10 or 11-50")
457
+ list_build_create.add_argument("--num-results", type=int, default=100, help="Target number of people results, 1-1000")
458
+ list_build_create.add_argument("--excluded-title", action="append", help="Title to exclude after results return; repeat or comma-separate")
459
+ list_build_create.add_argument("--extra-params-json", help="JSON object applied to both company and people searches")
460
+ list_build_create.add_argument("--company-extra-params-json", help="JSON object applied only to company search")
461
+ list_build_create.add_argument("--people-extra-params-json", help="JSON object applied only to people search")
462
+ list_build_create.add_argument("--wait", action="store_true", help="Poll until the job reaches completed, error, or cancelled")
463
+ list_build_create.add_argument("--poll-interval", type=int, default=5, help="Polling interval seconds for --wait")
464
+ list_build_create.add_argument("--wait-timeout", type=int, default=0, help="Max seconds to wait (0 = no timeout)")
465
+ add_api_common_arguments(list_build_create)
466
+ list_build_create.set_defaults(func=handlers["list_build_create"])
467
+
468
+ list_build_status = list_build_sub.add_parser("status", help="Get LinkedIn list-build job status")
469
+ list_build_status.add_argument("--job-id", required=True, help="LinkedIn list-build job id")
470
+ add_api_common_arguments(list_build_status)
471
+ list_build_status.set_defaults(func=handlers["list_build_status"])
472
+
473
+ list_build_results = list_build_sub.add_parser("results", help="Get LinkedIn list-build results")
474
+ list_build_results.add_argument("--job-id", required=True, help="LinkedIn list-build job id")
475
+ list_build_results.add_argument("--type", choices=["people", "companies", "all"], default="people", help="Result type")
476
+ list_build_results.add_argument("--page", type=int, default=1, help="Results page")
477
+ list_build_results.add_argument("--page-size", type=int, default=50, help="Results per page, 1-500")
478
+ add_api_common_arguments(list_build_results)
479
+ list_build_results.set_defaults(func=handlers["list_build_results"])
480
+
296
481
  posts_parser = linkedin_sub.add_parser("posts", help="List LinkedIn posts for a user")
297
482
  posts_parser.add_argument("--identifier", required=True, help="LinkedIn profile URL, public ID, or URN")
298
483
  posts_parser.add_argument("--cursor", help="Pagination cursor from previous response")
@@ -1,6 +1,6 @@
1
1
  # Autotouch CLI Reference
2
2
 
3
- Generated from the installed parser for `autotouch-cli` `0.2.72`.
3
+ Generated from the installed parser for `autotouch-cli` `0.2.73`.
4
4
  Manifest schema version: `2`.
5
5
 
6
6
  ## Output Modes
@@ -2243,10 +2243,10 @@ LinkedIn list-building operations
2243
2243
  - Auth: `varies_by_subcommand`
2244
2244
  - Stability: `stable`
2245
2245
  - Destructive: `no`
2246
- - Subcommands: `recipe, status, limits, search, search-params, filters, posts, post, comments, reactions`
2246
+ - Subcommands: `recipe, status, limits, search, search-params, filters, list-build, posts, post, comments, reactions`
2247
2247
  - Example:
2248
2248
  - `autotouch linkedin [-h]
2249
- {recipe,status,limits,search,search-params,filters,posts,post,comments,reactions} ...`
2249
+ {recipe,status,limits,search,search-params,filters,list-build,posts,post,comments,reactions} ...`
2250
2250
 
2251
2251
  #### `autotouch linkedin comments`
2252
2252
 
@@ -2336,6 +2336,140 @@ View LinkedIn send limits and usage
2336
2336
  - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
2337
2337
  - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
2338
2338
 
2339
+ #### `autotouch linkedin list-build`
2340
+
2341
+ Create and inspect paced LinkedIn list-build jobs
2342
+
2343
+ - Auth: `varies_by_subcommand`
2344
+ - Stability: `stable`
2345
+ - Destructive: `no`
2346
+ - Subcommands: `create, status, results`
2347
+ - Example:
2348
+ - `autotouch linkedin list-build [-h] {create,status,results} ...`
2349
+
2350
+ #### `autotouch linkedin list-build create`
2351
+
2352
+ Create a paced background LinkedIn list-build job
2353
+
2354
+ - Auth: `developer_key_or_user_session`
2355
+ - Stability: `stable`
2356
+ - Destructive: `no`
2357
+ - Output modes: `json, ndjson, human`
2358
+ - Example:
2359
+ - `autotouch linkedin list-build create [-h] [--data-json DATA_JSON]
2360
+ [--data-file DATA_FILE]
2361
+ [--mode {company-first-people}]
2362
+ [--linkedin-api {auto,classic,sales_navigator}]
2363
+ [--company-query COMPANY_QUERY]
2364
+ [--people-query PEOPLE_QUERY]
2365
+ [--headcount HEADCOUNT]
2366
+ [--num-results NUM_RESULTS]
2367
+ [--excluded-title EXCLUDED_TITLE]
2368
+ [--extra-params-json EXTRA_PARAMS_JSON]
2369
+ [--company-extra-params-json COMPANY_EXTRA_PARAMS_JSON]
2370
+ [--people-extra-params-json PEOPLE_EXTRA_PARAMS_JSON]
2371
+ [--wait]
2372
+ [--poll-interval POLL_INTERVAL]
2373
+ [--wait-timeout WAIT_TIMEOUT]
2374
+ [--base-url BASE_URL]
2375
+ [--token TOKEN] [--use-x-api-key]
2376
+ [--timeout TIMEOUT]
2377
+ [--output {json,ndjson,human}]
2378
+ [--compact] [--select SELECT |
2379
+ --json-pointer JSON_POINTER]
2380
+ [--verbose]`
2381
+ - Options:
2382
+ - `--data-json` (kind=json; input=json): Explicit list-build payload JSON (overrides individual flags)
2383
+ - `--data-file` (kind=file; input=file): Path to list-build payload JSON file
2384
+ - `--mode` (kind=string; choices=company-first-people; default=company-first-people): List build mode
2385
+ - `--linkedin-api` (kind=string; choices=auto,classic,sales_navigator; default=auto): API mode (default: auto; uses connected account mode)
2386
+ - `--company-query` (kind=string): Company-search query used to build the seed account set
2387
+ - `--people-query` (kind=string): People-search query/title terms
2388
+ - `--headcount` (kind=string; default=1-10): Company headcount range, e.g. 1-10 or 11-50
2389
+ - `--num-results` (kind=integer; default=100): Target number of people results, 1-1000
2390
+ - `--excluded-title` (kind=string; repeatable): Title to exclude after results return; repeat or comma-separate
2391
+ - `--extra-params-json` (kind=json; input=json): JSON object applied to both company and people searches
2392
+ - `--company-extra-params-json` (kind=json; input=json): JSON object applied only to company search
2393
+ - `--people-extra-params-json` (kind=json; input=json): JSON object applied only to people search
2394
+ - `--wait` (kind=boolean; when omitted=False; when present=True): Poll until the job reaches completed, error, or cancelled
2395
+ - `--poll-interval` (kind=integer; default=5): Polling interval seconds for --wait
2396
+ - `--wait-timeout` (kind=integer; default=0): Max seconds to wait (0 = no timeout)
2397
+ - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
2398
+ - `--token` (kind=string; sensitive): Developer API key / JWT token
2399
+ - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
2400
+ - `--timeout` (kind=integer; default=30): HTTP timeout in seconds
2401
+ - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
2402
+ - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
2403
+ - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
2404
+ - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
2405
+ - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
2406
+
2407
+ #### `autotouch linkedin list-build results`
2408
+
2409
+ Get LinkedIn list-build results
2410
+
2411
+ - Auth: `developer_key_or_user_session`
2412
+ - Stability: `stable`
2413
+ - Destructive: `no`
2414
+ - Required flags: `--job-id`
2415
+ - Output modes: `json, ndjson, human`
2416
+ - Example:
2417
+ - `autotouch linkedin list-build results [-h] --job-id JOB_ID
2418
+ [--type {people,companies,all}]
2419
+ [--page PAGE]
2420
+ [--page-size PAGE_SIZE]
2421
+ [--base-url BASE_URL]
2422
+ [--token TOKEN] [--use-x-api-key]
2423
+ [--timeout TIMEOUT]
2424
+ [--output {json,ndjson,human}]
2425
+ [--compact] [--select SELECT |
2426
+ --json-pointer JSON_POINTER]
2427
+ [--verbose]`
2428
+ - Options:
2429
+ - `--job-id` (required; kind=string): LinkedIn list-build job id
2430
+ - `--type` (kind=string; choices=people,companies,all; default=people): Result type
2431
+ - `--page` (kind=integer; default=1): Results page
2432
+ - `--page-size` (kind=integer; default=50): Results per page, 1-500
2433
+ - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
2434
+ - `--token` (kind=string; sensitive): Developer API key / JWT token
2435
+ - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
2436
+ - `--timeout` (kind=integer; default=30): HTTP timeout in seconds
2437
+ - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
2438
+ - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
2439
+ - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
2440
+ - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
2441
+ - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
2442
+
2443
+ #### `autotouch linkedin list-build status`
2444
+
2445
+ Get LinkedIn list-build job status
2446
+
2447
+ - Auth: `developer_key_or_user_session`
2448
+ - Stability: `stable`
2449
+ - Destructive: `no`
2450
+ - Required flags: `--job-id`
2451
+ - Output modes: `json, ndjson, human`
2452
+ - Example:
2453
+ - `autotouch linkedin list-build status [-h] --job-id JOB_ID
2454
+ [--base-url BASE_URL]
2455
+ [--token TOKEN] [--use-x-api-key]
2456
+ [--timeout TIMEOUT]
2457
+ [--output {json,ndjson,human}]
2458
+ [--compact] [--select SELECT |
2459
+ --json-pointer JSON_POINTER]
2460
+ [--verbose]`
2461
+ - Options:
2462
+ - `--job-id` (required; kind=string): LinkedIn list-build job id
2463
+ - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
2464
+ - `--token` (kind=string; sensitive): Developer API key / JWT token
2465
+ - `--use-x-api-key` (kind=boolean; when omitted=False; when present=True): Send token via X-API-Key header
2466
+ - `--timeout` (kind=integer; default=30): HTTP timeout in seconds
2467
+ - `--output` (kind=string; choices=json,ndjson,human; default=json): Output mode
2468
+ - `--compact` (kind=boolean; when omitted=False; when present=True): Print compact JSON
2469
+ - `--select` (kind=string): Extract a dotted field path from the final result (for example: id or items.0.id)
2470
+ - `--json-pointer` (kind=string): Extract a JSON pointer from the final result (for example: /id)
2471
+ - `--verbose` (kind=boolean; when omitted=False; when present=True): Print request metadata to stderr
2472
+
2339
2473
  #### `autotouch linkedin post`
2340
2474
 
2341
2475
  Get full details for a single LinkedIn post
@@ -2436,7 +2570,7 @@ Print LinkedIn payload recipes for search and list-building
2436
2570
  - Output modes: `json, ndjson, human`
2437
2571
  - Example:
2438
2572
  - `autotouch linkedin recipe [-h]
2439
- [--type {all,search,search_url,search_params,posts,comments,reactions}]
2573
+ [--type {all,list_build_company_first_people,search,search_url,search_params,posts,comments,reactions}]
2440
2574
  [--out-file OUT_FILE] [--base-url BASE_URL]
2441
2575
  [--token TOKEN] [--use-x-api-key]
2442
2576
  [--timeout TIMEOUT]
@@ -2444,7 +2578,7 @@ Print LinkedIn payload recipes for search and list-building
2444
2578
  [--select SELECT |
2445
2579
  --json-pointer JSON_POINTER] [--verbose]`
2446
2580
  - Options:
2447
- - `--type` (kind=string; choices=all,search,search_url,search_params,posts,comments,reactions; default=all)
2581
+ - `--type` (kind=string; choices=all,list_build_company_first_people,search,search_url,search_params,posts,comments,reactions; default=all)
2448
2582
  - `--out-file` (kind=file; input=file): Optional path to save the selected payload JSON
2449
2583
  - `--base-url` (kind=string; default=https://app.autotouch.ai): API base URL (default: https://app.autotouch.ai)
2450
2584
  - `--token` (kind=string; sensitive): Developer API key / JWT token