orangeslice 2.1.5 → 2.4.0-beta.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.
Files changed (37) hide show
  1. package/README.md +20 -1
  2. package/dist/careers.d.ts +47 -0
  3. package/dist/careers.js +11 -0
  4. package/dist/cli.js +12 -1
  5. package/dist/index.d.ts +41 -0
  6. package/dist/index.js +29 -3
  7. package/dist/integrations.d.ts +60 -0
  8. package/dist/integrations.js +107 -0
  9. package/dist/ocean.d.ts +160 -0
  10. package/dist/ocean.js +23 -0
  11. package/dist/skills.d.ts +57 -0
  12. package/dist/skills.js +33 -0
  13. package/docs/data-enrichement/index.md +10 -2
  14. package/docs/integrations/gmail/createDraft.md +54 -0
  15. package/docs/integrations/gmail/fetchEmails.md +50 -0
  16. package/docs/integrations/gmail/fetchMessageByMessageId.md +36 -0
  17. package/docs/integrations/gmail/fetchMessageByThreadId.md +37 -0
  18. package/docs/integrations/gmail/getProfile.md +37 -0
  19. package/docs/integrations/gmail/index.md +19 -2
  20. package/docs/integrations/gmail/listLabels.md +34 -0
  21. package/docs/integrations/gmail/replyToThread.md +51 -0
  22. package/docs/integrations/index.md +14 -1
  23. package/docs/lookalike-search/index.md +24 -12
  24. package/docs/prospecting/index.md +2 -2
  25. package/docs/services/builtWith/index.md +2 -2
  26. package/docs/services/company/findCareersPage.md +137 -0
  27. package/docs/services/company/findCareersPage.ts +37 -0
  28. package/docs/services/company/linkedin/enrich.md +47 -1
  29. package/docs/services/company/scrapeCareersPage.md +150 -0
  30. package/docs/services/index.md +4 -2
  31. package/docs/services/integrations/index.md +128 -0
  32. package/docs/services/ocean/search/companies.ts +122 -119
  33. package/docs/services/person/linkedin/findUrl.md +2 -2
  34. package/docs/services/predictLeads/companyJobOpenings.ts +168 -94
  35. package/docs/services/skills/index.md +97 -0
  36. package/docs/services/web/search.md +29 -14
  37. package/package.json +1 -1
@@ -1,130 +1,133 @@
1
1
  interface OceanCompaniesFilters {
2
- /** Array of domains to find lookalike companies for (e.g., ["stripe.com", "shopify.com"]) */
3
- lookalikeDomains?: string[];
4
- /** Minimum similarity score (0-1) for lookalike matching */
5
- minScore?: number;
6
- /** Company size ranges to filter by */
7
- companySizes?: Array<"0-1" | "2-10" | "11-50" | "51-200" | "201-500" | "501-1000" | "1001-5000" | "5001-10000" | "10001+">;
8
- /** Two-letter country codes to filter by (e.g., ["us", "gb"]) */
9
- countries?: string[];
10
- /** Industry categories to filter by */
11
- industries?: string[];
12
- /** Technology names to filter by (e.g., ["React", "Salesforce"]) */
13
- technologies?: string[];
14
- /** Technology category names to filter by */
15
- technologyCategories?: string[];
16
- /** Keywords to search for */
17
- keywords?: string[];
18
- /** Revenue ranges to filter by (e.g., ["0-1M", "1M-10M"]) */
19
- revenueRanges?: string[];
20
- /** Filter for e-commerce companies */
21
- ecommerce?: boolean;
2
+ /** Array of domains to find lookalike companies for (e.g., ["stripe.com", "shopify.com"]) */
3
+ lookalikeDomains?: string[];
4
+ /** Company size ranges to filter by */
5
+ companySizes?: Array<
6
+ "0-1" | "2-10" | "11-50" | "51-200" | "201-500" | "501-1000" | "1001-5000" | "5001-10000" | "10001+"
7
+ >;
8
+ /** Two-letter country codes to filter by (e.g., ["us", "gb"]) */
9
+ countries?: string[];
10
+ /** Industry names to filter by */
11
+ industries?: string[];
12
+ /** Filter for e-commerce companies */
13
+ ecommerce?: boolean;
14
+ }
15
+
16
+ interface OceanPeopleFilters {
17
+ /** Seniority levels to filter by (e.g., ["C-Level", "VP", "Director", "Manager"]) */
18
+ seniorities?: string[];
19
+ /** Departments to filter by (e.g., ["Engineering", "Sales", "Marketing"]) */
20
+ departments?: string[];
21
+ /** Job title keywords to search for */
22
+ jobTitleKeywords?: string[];
23
+ /** Two-letter country codes to filter by */
24
+ countries?: string[];
25
+ /** Array of Ocean.io people IDs to find lookalikes for */
26
+ lookalikePeopleIds?: string[];
22
27
  }
23
28
 
24
29
  interface OceanCompanyResult {
25
- /** Company domain */
26
- domain: string;
27
- /** Company name */
28
- name?: string;
29
- /** Legal company name */
30
- legalName?: string;
31
- /** Company description */
32
- description?: string;
33
- /** Two-letter country codes where the company operates */
34
- countries?: string[];
35
- /** Primary country code */
36
- primaryCountry?: string;
37
- /** Company size range (e.g., "51-200") */
38
- companySize?: string;
39
- /** Industry categories */
40
- industryCategories?: string[];
41
- /** Industries */
42
- industries?: string[];
43
- /** LinkedIn industry classification */
44
- linkedinIndustry?: string;
45
- /** Whether the company is an e-commerce business */
46
- ecommerce?: boolean;
47
- /** Company keywords */
48
- keywords?: string[];
49
- /** Ocean.io employee count estimate */
50
- employeeCountOcean?: number;
51
- /** LinkedIn employee count */
52
- employeeCountLinkedin?: number;
53
- /** Revenue range (e.g., "1M-10M") */
54
- revenue?: string;
55
- /** Year founded */
56
- yearFounded?: number;
57
- /** Company email addresses */
58
- emails?: string[];
59
- /** Phone numbers with country and primary flag */
60
- phones?: Array<{ country?: string; number: string; primary?: boolean }>;
61
- /** Company logo URL */
62
- logo?: string;
63
- /** Technologies used */
64
- technologies?: string[];
65
- /** Technology categories */
66
- technologyCategories?: string[];
67
- /** Company website root URL */
68
- rootUrl?: string;
69
- /** Social media profiles */
70
- medias?: Record<string, { url?: string; handle?: string; name?: string }>;
71
- /** Office locations */
72
- locations?: Array<{
73
- primary?: boolean;
74
- latitude?: number;
75
- longitude?: number;
76
- country?: string;
77
- locality?: string;
78
- region?: string;
79
- postalCode?: string;
80
- streetAddress?: string;
81
- state?: string;
82
- }>;
83
- /** Department sizes */
84
- departmentSizes?: Array<{ department: string; size: number }>;
85
- /** Headcount growth metrics */
86
- headcountGrowth?: {
87
- threeMonths?: number;
88
- threeMonthsPercentage?: number;
89
- sixMonths?: number;
90
- sixMonthsPercentage?: number;
91
- twelveMonths?: number;
92
- twelveMonthsPercentage?: number;
93
- };
94
- /** Last update timestamp */
95
- updatedAt?: string;
30
+ /** Company domain */
31
+ domain: string;
32
+ /** Company name */
33
+ name?: string;
34
+ /** Legal company name */
35
+ legalName?: string;
36
+ /** Company description */
37
+ description?: string;
38
+ /** Two-letter country codes where the company operates */
39
+ countries?: string[];
40
+ /** Primary country code */
41
+ primaryCountry?: string;
42
+ /** Company size range (e.g., "51-200") */
43
+ companySize?: string;
44
+ /** Industry categories */
45
+ industryCategories?: string[];
46
+ /** Industries */
47
+ industries?: string[];
48
+ /** LinkedIn industry classification */
49
+ linkedinIndustry?: string;
50
+ /** Whether the company is an e-commerce business */
51
+ ecommerce?: boolean;
52
+ /** Company keywords */
53
+ keywords?: string[];
54
+ /** Ocean.io employee count estimate */
55
+ employeeCountOcean?: number;
56
+ /** LinkedIn employee count */
57
+ employeeCountLinkedin?: number;
58
+ /** Revenue range (e.g., "1M-10M") */
59
+ revenue?: string;
60
+ /** Year founded */
61
+ yearFounded?: number;
62
+ /** Company email addresses */
63
+ emails?: string[];
64
+ /** Phone numbers with country and primary flag */
65
+ phones?: Array<{ country?: string; number: string; primary?: boolean }>;
66
+ /** Company logo URL */
67
+ logo?: string;
68
+ /** Technologies used */
69
+ technologies?: string[];
70
+ /** Technology categories */
71
+ technologyCategories?: string[];
72
+ /** Company website root URL */
73
+ rootUrl?: string;
74
+ /** Social media profiles */
75
+ medias?: Record<string, { url?: string; handle?: string; name?: string }>;
76
+ /** Office locations */
77
+ locations?: Array<{
78
+ primary?: boolean;
79
+ latitude?: number;
80
+ longitude?: number;
81
+ country?: string;
82
+ locality?: string;
83
+ region?: string;
84
+ postalCode?: string;
85
+ streetAddress?: string;
86
+ state?: string;
87
+ }>;
88
+ /** Department sizes */
89
+ departmentSizes?: Array<{ department: string; size: number }>;
90
+ /** Headcount growth metrics */
91
+ headcountGrowth?: {
92
+ threeMonths?: number;
93
+ threeMonthsPercentage?: number;
94
+ sixMonths?: number;
95
+ sixMonthsPercentage?: number;
96
+ twelveMonths?: number;
97
+ twelveMonthsPercentage?: number;
98
+ };
99
+ /** Last update timestamp */
100
+ updatedAt?: string;
96
101
  }
97
102
 
98
103
  /**
99
104
  * Search for lookalike companies using Ocean.io.
100
105
  * Provide seed domains via companiesFilters.lookalikeDomains to find similar companies.
101
- * Filter by size, country, industry, technology, revenue, and more.
102
- * Returns up to `size` companies per call (default 10). Use `searchAfter` for pagination.
106
+ * Verified v3 filters: companySizes, countries, industries, ecommerce, and top-level peopleFilters.
107
+ * Use `searchAfter` for pagination. Do not send `from`, `includeDomains`, `excludeDomains`, or `minScore` because Ocean v3 rejects them with 422 errors.
103
108
  */
104
109
  type companies = (params: {
105
- /** Filters for company search (lookalike domains, size, country, industry, etc.) */
106
- companiesFilters?: OceanCompaniesFilters;
107
- /** Number of results to return (default 10, max 100) */
108
- size?: number;
109
- /** Pagination offset (use searchAfter for cursor-based pagination instead) */
110
- from?: number;
111
- /** Cursor token from a previous response for efficient pagination */
112
- searchAfter?: string;
113
- /** Domains to always include in results */
114
- includeDomains?: string[];
115
- /** Domains to exclude from results */
116
- excludeDomains?: string[];
117
- }) => Promise<{
118
- /** Total matching companies */
119
- total: number;
120
- /** Cursor for next page (pass as searchAfter) */
121
- searchAfter?: string;
122
- /** Matched companies with relevance scores */
123
- companies: Array<{
124
- company: OceanCompanyResult;
125
- /** Relevance grade (A = best match) */
126
- relevance?: string;
127
- }>;
128
- /** Domains that were redirected to canonical domains */
129
- redirectMap?: Record<string, string>;
130
- }>;
110
+ /** Filters for company search (lookalike domains, size, country, industry, ecommerce) */
111
+ companiesFilters?: OceanCompaniesFilters;
112
+ /** Optional people filters. Returns companies that have at least one matching person. */
113
+ peopleFilters?: OceanPeopleFilters;
114
+ /** Number of results to return (default 10, max 100) */
115
+ size?: number;
116
+ /** Cursor token from a previous response for efficient pagination */
117
+ searchAfter?: string;
118
+ }) => Promise<{
119
+ /** Ocean.io status detail (typically "OK") */
120
+ detail?: string;
121
+ /** Total matching companies */
122
+ total: number;
123
+ /** Cursor for next page (pass as searchAfter) */
124
+ searchAfter?: string;
125
+ /** Matched companies with relevance scores */
126
+ companies: Array<{
127
+ company: OceanCompanyResult;
128
+ /** Relevance grade (A = best match) */
129
+ relevance?: string;
130
+ }>;
131
+ /** Domains that were redirected to canonical domains */
132
+ redirectMap?: Record<string, string>;
133
+ }>;
@@ -1,4 +1,4 @@
1
- /\*_ Credits: 2 for the name + company search path, or 50 when reverse-email lookup is used. Charged only if a valid URL is returned. _/
1
+ /\*_ Credits: 2 for the search path, or 50 when reverse-email lookup is used. Charged only if a valid URL is returned. _/
2
2
 
3
3
  /\*\*
4
4
 
@@ -15,6 +15,6 @@
15
15
  keyword?: string;
16
16
  /\*_ Location string (e.g., city, state, country) to narrow search results _/
17
17
  location?: string;
18
- /\*_ Email address. If provided, the service tries name + company search first when possible, then falls back to reverse-email lookup. _/
18
+ /\*_ Email address. For work emails, the service may infer the name from the email, try search with that + the email domain, validate the result against B2B current-company domain data, then fall back to reverse-email lookup. _/
19
19
  email?: string;
20
20
  }) => Promise<string | undefined>;
@@ -1,102 +1,176 @@
1
1
  /**
2
2
  * Retrieve company's Job Openings
3
3
  * Returns a list of company's Job Openings.
4
+ *
5
+ * Use this as a prospecting/enrichment signal, not as source-of-truth validation
6
+ * that a known company is currently hiring. For current validation, prefer the
7
+ *
8
+ * company's official careers page / ATS via services.company.findCareersPage and
9
+ * services.company.scrapeCareersPage.
4
10
  * HTTP GET /companies/{company_id_or_domain}/job_openings
5
11
  */
6
12
  type companyJobOpenings = (params: {
7
- /** Company's ID or domain. */
8
- company_id_or_domain: string;
9
- /** Set to true if you'd like to receive JobOpenings that are not closed, have last_seen_at more recent than 5 days and were found in the last year. */
10
- active_only?: boolean;
11
- /** Similar to `active_only`, but without considering `last_seen_at` timestamp. */
12
- not_closed?: boolean;
13
- /** Only return `JobOpenings` first seen after given date (ISO 8601). */
14
- first_seen_at_from?: string;
15
- /** Only return `JobOpenings` first seen before given date (ISO 8601). */
16
- first_seen_at_until?: string;
17
- /** Only return `JobOpenings` last seen after given date (ISO 8601). */
18
- last_seen_at_from?: string;
19
- /** Only return `JobOpenings` last seen before given date (ISO 8601). */
20
- last_seen_at_until?: string;
21
- /** Only return JobOpenings that have description. */
22
- with_description_only?: boolean;
23
- /** Only return JobOpenings that have location. */
24
- with_location_only?: boolean;
25
- /** Comma-separated (,) `JobOpening` categories. */
26
- categories?: Array<"administration" | "consulting" | "data_analysis" | "design" | "directors" | "education" | "engineering" | "finance" | "healthcare_services" | "human_resources" | "information_technology" | "internship" | "legal" | "management" | "marketing" | "military_and_protective_services" | "operations" | "purchasing" | "product_management" | "quality_assurance" | "real_estate" | "research" | "sales" | "software_development" | "support" | "manual_work" | "food">;
27
- /** Page number of shown items. **NOTE**: If the parameter is not provided, the meta property `count` will be omitted from response for performance reasons. */
28
- page?: number;
29
- /** Limit the number of shown items per page. */
30
- limit?: number;
13
+ /** Company's ID or domain. */
14
+ company_id_or_domain: string;
15
+ /** Set to true if you'd like to receive JobOpenings that are not closed, have last_seen_at more recent than 5 days and were found in the last year. */
16
+ active_only?: boolean;
17
+ /** Similar to `active_only`, but without considering `last_seen_at` timestamp. */
18
+ not_closed?: boolean;
19
+ /** Only return `JobOpenings` first seen after given date (ISO 8601). */
20
+ first_seen_at_from?: string;
21
+ /** Only return `JobOpenings` first seen before given date (ISO 8601). */
22
+ first_seen_at_until?: string;
23
+ /** Only return `JobOpenings` last seen after given date (ISO 8601). */
24
+ last_seen_at_from?: string;
25
+ /** Only return `JobOpenings` last seen before given date (ISO 8601). */
26
+ last_seen_at_until?: string;
27
+ /** Only return JobOpenings that have description. */
28
+ with_description_only?: boolean;
29
+ /** Only return JobOpenings that have location. */
30
+ with_location_only?: boolean;
31
+ /** Comma-separated (,) `JobOpening` categories. */
32
+ categories?: Array<
33
+ | "administration"
34
+ | "consulting"
35
+ | "data_analysis"
36
+ | "design"
37
+ | "directors"
38
+ | "education"
39
+ | "engineering"
40
+ | "finance"
41
+ | "healthcare_services"
42
+ | "human_resources"
43
+ | "information_technology"
44
+ | "internship"
45
+ | "legal"
46
+ | "management"
47
+ | "marketing"
48
+ | "military_and_protective_services"
49
+ | "operations"
50
+ | "purchasing"
51
+ | "product_management"
52
+ | "quality_assurance"
53
+ | "real_estate"
54
+ | "research"
55
+ | "sales"
56
+ | "software_development"
57
+ | "support"
58
+ | "manual_work"
59
+ | "food"
60
+ >;
61
+ /** Page number of shown items. **NOTE**: If the parameter is not provided, the meta property `count` will be omitted from response for performance reasons. */
62
+ page?: number;
63
+ /** Limit the number of shown items per page. */
64
+ limit?: number;
31
65
  }) => Promise<{
32
- data: Array<{
33
- id: string;
34
- type: "job_opening";
35
- attributes: {
36
- title: string;
37
- description: string | null;
38
- url: string;
39
- first_seen_at: string;
40
- last_seen_at: string;
41
- last_processed_at: string;
42
- contract_types: Array<Record<string, unknown>>;
43
- categories: Array<"administration" | "consulting" | "data_analysis" | "design" | "directors" | "education" | "engineering" | "finance" | "healthcare_services" | "human_resources" | "information_technology" | "internship" | "legal" | "management" | "marketing" | "military_and_protective_services" | "operations" | "purchasing" | "product_management" | "quality_assurance" | "real_estate" | "research" | "sales" | "software_development" | "support" | "manual_work" | "food">;
44
- onet_data: {
45
- code: string | null;
46
- family: string | null;
47
- occupation_name: string | null;
48
- };
49
- posted_at: string | null;
50
- recruiter_data: {
51
- name: string | null;
52
- title: string | null;
53
- contact: string | null;
54
- };
55
- salary: string | null;
56
- salary_data: {
57
- salary_low: number | null;
58
- salary_high: number | null;
59
- salary_currency: string | null;
60
- salary_low_usd: number | null;
61
- salary_high_usd: number | null;
62
- salary_time_unit: "hour" | "day" | "week" | "month" | "year" | null;
63
- };
64
- seniority: "not_set" | "founder" | "c_level" | "partner" | "president" | "vice_president" | "head" | "director" | "manager" | "mid_senior" | "junior" | "non_manager";
65
- status: "closed" | null;
66
- language: string | null;
67
- location: string | null;
68
- location_data: Array<{
69
- city: unknown;
70
- state: unknown;
71
- zip_code: unknown;
72
- country: unknown;
73
- region: unknown;
74
- continent: unknown;
75
- fuzzy_match: unknown;
66
+ data: Array<{
67
+ id: string;
68
+ type: "job_opening";
69
+ attributes: {
70
+ title: string;
71
+ description: string | null;
72
+ url: string;
73
+ first_seen_at: string;
74
+ last_seen_at: string;
75
+ last_processed_at: string;
76
+ contract_types: Array<Record<string, unknown>>;
77
+ categories: Array<
78
+ | "administration"
79
+ | "consulting"
80
+ | "data_analysis"
81
+ | "design"
82
+ | "directors"
83
+ | "education"
84
+ | "engineering"
85
+ | "finance"
86
+ | "healthcare_services"
87
+ | "human_resources"
88
+ | "information_technology"
89
+ | "internship"
90
+ | "legal"
91
+ | "management"
92
+ | "marketing"
93
+ | "military_and_protective_services"
94
+ | "operations"
95
+ | "purchasing"
96
+ | "product_management"
97
+ | "quality_assurance"
98
+ | "real_estate"
99
+ | "research"
100
+ | "sales"
101
+ | "software_development"
102
+ | "support"
103
+ | "manual_work"
104
+ | "food"
105
+ >;
106
+ onet_data: {
107
+ code: string | null;
108
+ family: string | null;
109
+ occupation_name: string | null;
110
+ };
111
+ posted_at: string | null;
112
+ recruiter_data: {
113
+ name: string | null;
114
+ title: string | null;
115
+ contact: string | null;
116
+ };
117
+ salary: string | null;
118
+ salary_data: {
119
+ salary_low: number | null;
120
+ salary_high: number | null;
121
+ salary_currency: string | null;
122
+ salary_low_usd: number | null;
123
+ salary_high_usd: number | null;
124
+ salary_time_unit: "hour" | "day" | "week" | "month" | "year" | null;
125
+ };
126
+ seniority:
127
+ | "not_set"
128
+ | "founder"
129
+ | "c_level"
130
+ | "partner"
131
+ | "president"
132
+ | "vice_president"
133
+ | "head"
134
+ | "director"
135
+ | "manager"
136
+ | "mid_senior"
137
+ | "junior"
138
+ | "non_manager";
139
+ status: "closed" | null;
140
+ language: string | null;
141
+ location: string | null;
142
+ location_data: Array<{
143
+ city: unknown;
144
+ state: unknown;
145
+ zip_code: unknown;
146
+ country: unknown;
147
+ region: unknown;
148
+ continent: unknown;
149
+ fuzzy_match: unknown;
150
+ }>;
151
+ tags: Array<Record<string, unknown>>;
152
+ };
153
+ relationships: {
154
+ company: {
155
+ data: {
156
+ id: string;
157
+ type: "company";
158
+ };
159
+ };
160
+ };
161
+ }>;
162
+ included: Array<{
163
+ id: string;
164
+ type: "company";
165
+ attributes: {
166
+ domain: string;
167
+ company_name: string | null;
168
+ ticker: string | null;
169
+ };
170
+ }>;
171
+ meta?: {
172
+ schema_version: string;
173
+ record_state: "active";
174
+ count?: number;
175
+ };
76
176
  }>;
77
- tags: Array<Record<string, unknown>>;
78
- };
79
- relationships: {
80
- company: {
81
- data: {
82
- id: string;
83
- type: "company";
84
- };
85
- };
86
- };
87
- }>;
88
- included: Array<{
89
- id: string;
90
- type: "company";
91
- attributes: {
92
- domain: string;
93
- company_name: string | null;
94
- ticker: string | null;
95
- };
96
- }>;
97
- meta?: {
98
- schema_version: string;
99
- record_state: "active";
100
- count?: number;
101
- };
102
- }>;
@@ -0,0 +1,97 @@
1
+ ---
2
+ description: Create and manage knowledge skills — reusable knowledge snippets that guide AI agents
3
+ ---
4
+
5
+ # skills — Knowledge Skills
6
+
7
+ Create, read, update, and delete knowledge skills. Skills are reusable knowledge snippets (company context, ICP descriptions, email templates, product info) that agents reference during research and outreach.
8
+
9
+ ## Quick start
10
+
11
+ ```typescript
12
+ import { skills } from "orangeslice";
13
+
14
+ // Create a skill
15
+ const skill = await skills.create({
16
+ title: "ICP description",
17
+ description: "Ideal customer profile for outbound targeting",
18
+ content: "We sell to B2B SaaS companies, 50-500 employees, Series A-C..."
19
+ });
20
+
21
+ // List all skills
22
+ const { skills: all } = await skills.list();
23
+ console.log(all.map((s) => `${s.title}: ${s.content.slice(0, 50)}...`));
24
+
25
+ // Update a skill
26
+ await skills.update(skill.id, { content: "Updated ICP: ..." });
27
+
28
+ // Delete a skill
29
+ await skills.delete(skill.id);
30
+ ```
31
+
32
+ ## Methods
33
+
34
+ ### `skills.list(opts?)`
35
+
36
+ List knowledge skills for the current account.
37
+
38
+ **Parameters:**
39
+
40
+ - `opts.spreadsheetId` — Filter to a specific spreadsheet's skills
41
+
42
+ **Returns:** `{ skills: Skill[] }`
43
+
44
+ ### `skills.get(id)`
45
+
46
+ Get a single skill by ID.
47
+
48
+ **Returns:** `Skill`
49
+
50
+ ### `skills.create(opts)`
51
+
52
+ Create a new knowledge skill.
53
+
54
+ **Parameters:**
55
+
56
+ - `opts.title` — Skill title (e.g. "ICP description", "Email template")
57
+ - `opts.description` — Short description of what the skill provides
58
+ - `opts.content` — The knowledge content
59
+ - `opts.autoInject` — Optional boolean, auto-inject into agent context (default `false`)
60
+ - `opts.spreadsheetId` — Optional, scope to a specific spreadsheet
61
+
62
+ **Returns:** `Skill`
63
+
64
+ ### `skills.update(id, fields)`
65
+
66
+ Update an existing skill.
67
+
68
+ **Parameters:**
69
+
70
+ - `fields.title` — New title
71
+ - `fields.description` — New description
72
+ - `fields.content` — New content
73
+ - `fields.autoInject` — Update auto-inject setting
74
+
75
+ **Returns:** `Skill`
76
+
77
+ ### `skills.delete(id)`
78
+
79
+ Delete a skill by ID.
80
+
81
+ **Returns:** `{ success: boolean }`
82
+
83
+ ## Skill object
84
+
85
+ ```typescript
86
+ {
87
+ id: string;
88
+ title: string;
89
+ description: string;
90
+ content: string;
91
+ autoInject: boolean;
92
+ createdAt: string;
93
+ updatedAt: string;
94
+ scope: "account" | "spreadsheet";
95
+ spreadsheetId: string | null;
96
+ }
97
+ ```