n8n-nodes-innotes 2.0.10 → 2.0.12
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 +64 -275
- package/dist/package.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,311 +1,100 @@
|
|
|
1
|
-
#
|
|
1
|
+
# n8n-nodes-innotes
|
|
2
2
|
|
|
3
|
-
An
|
|
3
|
+
An n8n community node for the [InNotes](https://innotes.me) LinkedIn CRM API:
|
|
4
|
+
contacts, notes, jobs, statuses, tags, the current user, and the job-automation
|
|
5
|
+
callback.
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
## Features
|
|
9
|
-
|
|
10
|
-
- **Complete CRUD Operations**: Create, read, update, and delete operations for all InNotes resources
|
|
11
|
-
- **LinkedIn CRM Integration**: Specifically designed for LinkedIn-based contact management
|
|
12
|
-
- **Comprehensive Resource Support**:
|
|
13
|
-
- Contacts (LinkedIn profiles, emails, phone numbers)
|
|
14
|
-
- Notes (conversation logs, meeting notes, follow-ups)
|
|
15
|
-
- Jobs (job applications, opportunities, tracking)
|
|
16
|
-
- Statuses (contact status management)
|
|
17
|
-
- Tags (categorization and organization)
|
|
18
|
-
- Users (user account management)
|
|
19
|
-
- **Advanced Filtering**: Search and filter capabilities for efficient data retrieval
|
|
20
|
-
- **Pagination Support**: Handle large datasets with built-in pagination
|
|
21
|
-
- **Error Handling**: Robust error handling with meaningful error messages
|
|
22
|
-
- **Authentication**: Secure API authentication using a Bearer token
|
|
7
|
+
The LinkedIn scraper node is a separate package,
|
|
8
|
+
[`n8n-nodes-linkedin-scraper`](https://github.com/mrc527/InNotes/tree/main/n8n_linkedin_scraper_node).
|
|
23
9
|
|
|
24
10
|
## Installation
|
|
25
11
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
- N8N instance (self-hosted or cloud)
|
|
29
|
-
- Node.js 18+ and yarn package manager
|
|
30
|
-
- Access to InNotes API credentials
|
|
31
|
-
|
|
32
|
-
### Building the Node
|
|
33
|
-
|
|
34
|
-
1. Clone or download this node package to your local machine
|
|
35
|
-
2. Install dependencies:
|
|
36
|
-
```bash
|
|
37
|
-
yarn install
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
3. Build the node:
|
|
41
|
-
```bash
|
|
42
|
-
yarn build
|
|
43
|
-
```
|
|
12
|
+
In n8n: **Settings → Community Nodes → Install** → `n8n-nodes-innotes`.
|
|
44
13
|
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
# For local N8N development
|
|
48
|
-
yarn link
|
|
49
|
-
cd /path/to/your/n8n
|
|
50
|
-
yarn link n8n-nodes-innotes
|
|
51
|
-
|
|
52
|
-
# Or copy the dist folder to your N8N custom nodes directory
|
|
53
|
-
cp -r dist/* ~/.n8n/custom/
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Development
|
|
57
|
-
|
|
58
|
-
For development and testing:
|
|
14
|
+
Manual build from source (Node >= 18.10, yarn 1):
|
|
59
15
|
|
|
60
16
|
```bash
|
|
61
|
-
# Install dependencies
|
|
62
17
|
yarn install
|
|
63
|
-
|
|
64
|
-
# Run linting
|
|
65
|
-
yarn lint
|
|
66
|
-
|
|
67
|
-
# Run tests
|
|
68
|
-
yarn test
|
|
69
|
-
|
|
70
|
-
# Watch mode for development
|
|
71
|
-
yarn dev
|
|
72
|
-
|
|
73
|
-
# Build for production
|
|
74
18
|
yarn build
|
|
19
|
+
cp -r dist/* ~/.n8n/custom/ # then restart n8n
|
|
75
20
|
```
|
|
76
21
|
|
|
77
|
-
##
|
|
78
|
-
|
|
79
|
-
### API Credentials
|
|
80
|
-
|
|
81
|
-
Before using the InNotes node, you need to configure your API credentials:
|
|
82
|
-
|
|
83
|
-
1. In N8N, go to **Credentials** → **Create New**
|
|
84
|
-
2. Search for **InNotes API** and select it
|
|
85
|
-
3. Fill in the required fields:
|
|
86
|
-
- **Bearer Token**: Generate one in your InNotes dashboard, under settings
|
|
87
|
-
- **Base URL**: Your InNotes instance URL (e.g., `https://app.innotes.com`)
|
|
88
|
-
|
|
89
|
-
> Versions before 2.0.0 also offered "Username/Password (Legacy)". That
|
|
90
|
-
> scheme has been removed from InNotes; regenerate the credential with a
|
|
91
|
-
> Bearer token.
|
|
92
|
-
|
|
93
|
-
### Node Setup
|
|
94
|
-
|
|
95
|
-
1. Add the **InNotes** node to your workflow
|
|
96
|
-
2. Select your configured credentials
|
|
97
|
-
3. Choose the **Resource** (Contact, Note, Job, Status, Tag, User)
|
|
98
|
-
4. Select the desired **Operation** (Get, Create, Update, Delete, etc.)
|
|
99
|
-
5. Configure the specific parameters for your operation
|
|
100
|
-
|
|
101
|
-
## Usage Examples
|
|
102
|
-
|
|
103
|
-
### Managing Contacts
|
|
104
|
-
|
|
105
|
-
#### Get All Contacts
|
|
106
|
-
- **Resource**: Contact
|
|
107
|
-
- **Operation**: Get All
|
|
108
|
-
- **Parameters**:
|
|
109
|
-
- Limit: Number of contacts to retrieve (default: 50)
|
|
110
|
-
- Return All: Whether to return all contacts or paginate
|
|
111
|
-
|
|
112
|
-
#### Create New Contact
|
|
113
|
-
- **Resource**: Contact
|
|
114
|
-
- **Operation**: Create
|
|
115
|
-
- **Required Fields**:
|
|
116
|
-
- Name: Contact's full name
|
|
117
|
-
- LinkedIn URL: LinkedIn profile URL
|
|
118
|
-
- **Optional Fields**:
|
|
119
|
-
- Email, Phone, Company, Position, etc.
|
|
120
|
-
|
|
121
|
-
#### Update Contact
|
|
122
|
-
- **Resource**: Contact
|
|
123
|
-
- **Operation**: Update
|
|
124
|
-
- **Required Fields**:
|
|
125
|
-
- Contact ID: ID of the contact to update
|
|
126
|
-
- **Update Fields**: Any contact fields you want to modify
|
|
22
|
+
## Credentials
|
|
127
23
|
|
|
128
|
-
|
|
129
|
-
- **Resource**: Contact
|
|
130
|
-
- **Operation**: Search
|
|
131
|
-
- **Parameters**:
|
|
132
|
-
- Query: Search term (name, email, company)
|
|
133
|
-
- Filters: Additional filtering options
|
|
24
|
+
Create an **InNotes API** credential:
|
|
134
25
|
|
|
135
|
-
|
|
26
|
+
| Field | Notes |
|
|
27
|
+
|---|---|
|
|
28
|
+
| Base URL | Your InNotes instance. Default `https://innotes.me` |
|
|
29
|
+
| Bearer Token | Generate in the InNotes dashboard settings |
|
|
30
|
+
| Callback Secret | Required — the node refuses to run **Automation → Report Job Created** without a value. InNotes fills it in when it provisions your automation; setting the credential up by hand, any non-empty value works, because the callback authenticates with the Bearer token above |
|
|
31
|
+
| Allowed Domains | `*` for all |
|
|
136
32
|
|
|
137
|
-
|
|
138
|
-
- **Resource**: Note
|
|
139
|
-
- **Operation**: Create
|
|
140
|
-
- **Required Fields**:
|
|
141
|
-
- Contact ID: ID of the associated contact
|
|
142
|
-
- Content: Note content (supports rich text)
|
|
143
|
-
- **Optional Fields**:
|
|
144
|
-
- Type: Note type (meeting, call, email, etc.)
|
|
145
|
-
- Tags: Associated tags
|
|
33
|
+
The credential is tested against `GET /api/user`.
|
|
146
34
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
- **Operation**: Get All
|
|
150
|
-
- **Parameters**:
|
|
151
|
-
- Contact ID: Filter notes by contact
|
|
152
|
-
- Date Range: Filter by creation date
|
|
35
|
+
Username/password auth was removed in 2.0.0. Regenerate any older credential
|
|
36
|
+
with a Bearer token.
|
|
153
37
|
|
|
154
|
-
|
|
38
|
+
## Resources and operations
|
|
155
39
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
40
|
+
| Resource | Operations |
|
|
41
|
+
|---|---|
|
|
42
|
+
| Automation | Get Config, Report Job Created |
|
|
43
|
+
| Contact | Create, Get, Get Many, Update, Delete |
|
|
44
|
+
| Note | Create, Get (both broken — see below) |
|
|
45
|
+
| Job | Create, Get, Get All, Search, Update, Delete, Exists, Batch Exists |
|
|
46
|
+
| Status | Get All, Create |
|
|
47
|
+
| Tag | Get All |
|
|
48
|
+
| User | Get, Get CV |
|
|
164
49
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
- **Operation**: Update
|
|
168
|
-
- **Fields**:
|
|
169
|
-
- Job ID: ID of the job to update
|
|
170
|
-
- Status: New status (applied, interviewing, offer, etc.)
|
|
50
|
+
Required fields: Contact create needs **Name** and **LinkedIn Key**; Job create
|
|
51
|
+
needs **Job Name** and **Company Name**.
|
|
171
52
|
|
|
172
|
-
|
|
53
|
+
**The Note resource is broken.** Its required fields are **External ID** and
|
|
54
|
+
**Note Text**, but the executor reads `content`/`contactId` on create and
|
|
55
|
+
`noteId` on get — declared nowhere — so a UI-filled node throws on the missing
|
|
56
|
+
parameter, and *Get* would call `/api/note/{noteId}` rather than look up by
|
|
57
|
+
external ID.
|
|
173
58
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
-
|
|
177
|
-
- **Fields**:
|
|
178
|
-
- Name: Tag name
|
|
179
|
-
- Color: Tag color (hex code)
|
|
59
|
+
Job **Search** takes a search method: `general`, `ext_id`, `title`, `company`,
|
|
60
|
+
`location`, `description`. **Batch Exists** takes a comma-separated list of
|
|
61
|
+
external IDs and posts them to `/api/job/batch-exists` in chunks of 200.
|
|
180
62
|
|
|
181
|
-
|
|
182
|
-
- **Resource**: Status
|
|
183
|
-
- **Operation**: Create/Update
|
|
184
|
-
- **Fields**:
|
|
185
|
-
- Contact ID: Associated contact
|
|
186
|
-
- Status: Status value
|
|
187
|
-
- Type: Status type
|
|
63
|
+
### Pagination
|
|
188
64
|
|
|
189
|
-
|
|
65
|
+
Contact *Get Many* takes **Return All** or a **Limit** (default 24). The limit
|
|
66
|
+
is capped at 200 because `GET /api/contacts` clamps `pageSize` there — without
|
|
67
|
+
the cap a request for 500 returns 200 rows with a 200 status and nothing to say
|
|
68
|
+
it was truncated.
|
|
190
69
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
3. **Filter**: Process only contacts without recent notes
|
|
195
|
-
4. **InNotes Node**: Create follow-up notes
|
|
196
|
-
5. **Email/LinkedIn Node**: Send personalized messages
|
|
70
|
+
Job *Get All* offers neither: it exposes only Search Term and External ID, while
|
|
71
|
+
the executor reads an undeclared `returnAll`/`limit`, so every call requests
|
|
72
|
+
`pageSize=24, page=1` and cannot be changed.
|
|
197
73
|
|
|
198
|
-
###
|
|
199
|
-
1. **Trigger**: New job posting (webhook/RSS)
|
|
200
|
-
2. **InNotes Node**: Create new job entry
|
|
201
|
-
3. **InNotes Node**: Link to relevant contacts
|
|
202
|
-
4. **InNotes Node**: Create application tracking note
|
|
203
|
-
5. **Calendar Node**: Schedule follow-up reminders
|
|
74
|
+
### Options
|
|
204
75
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
2. **External API**: Enrich contact data (company info, etc.)
|
|
208
|
-
3. **InNotes Node**: Update contact with enriched data
|
|
209
|
-
4. **InNotes Node**: Create initial contact note
|
|
210
|
-
5. **InNotes Node**: Apply relevant tags
|
|
76
|
+
A node-level **Options** collection with **Batch Size** (default 10, max 100)
|
|
77
|
+
and **Timeout Between Batches** in ms (default 1000), to stay under rate limits.
|
|
211
78
|
|
|
212
|
-
##
|
|
79
|
+
## Errors
|
|
213
80
|
|
|
214
|
-
|
|
81
|
+
Failures raise `NodeApiError` with the operation and the request parameters.
|
|
82
|
+
Contact creation reports only the **count** of `contact_details` entries, never
|
|
83
|
+
the values — n8n persists execution data, and those are a third party's phone
|
|
84
|
+
numbers and email addresses.
|
|
215
85
|
|
|
216
|
-
|
|
217
|
-
|----------|------------|-------------|
|
|
218
|
-
| Contact | Get All, Get, Create, Update, Delete, Search | LinkedIn contact management |
|
|
219
|
-
| Note | Get All, Get, Create, Update, Delete | Conversation and meeting notes |
|
|
220
|
-
| Job | Get All, Get, Create, Update, Delete | Job application tracking |
|
|
221
|
-
| Status | Get All, Get, Create, Update, Delete | Contact status management |
|
|
222
|
-
| Tag | Get All, Get, Create, Update, Delete | Categorization and organization |
|
|
223
|
-
| User | Get, Update | User account management |
|
|
224
|
-
|
|
225
|
-
### Common Parameters
|
|
226
|
-
|
|
227
|
-
- **Limit**: Maximum number of items to return (pagination)
|
|
228
|
-
- **Return All**: Override limit and return all items
|
|
229
|
-
- **Sort By**: Field to sort results by
|
|
230
|
-
- **Sort Order**: Ascending or descending sort
|
|
231
|
-
- **Filters**: Resource-specific filtering options
|
|
232
|
-
|
|
233
|
-
### Error Handling
|
|
234
|
-
|
|
235
|
-
The node provides comprehensive error handling:
|
|
236
|
-
|
|
237
|
-
- **Authentication Errors**: Invalid credentials or expired sessions
|
|
238
|
-
- **Validation Errors**: Missing required fields or invalid data
|
|
239
|
-
- **API Errors**: Server errors or rate limiting
|
|
240
|
-
- **Network Errors**: Connection issues or timeouts
|
|
241
|
-
|
|
242
|
-
All errors include detailed messages to help with troubleshooting.
|
|
243
|
-
|
|
244
|
-
## Contributing
|
|
245
|
-
|
|
246
|
-
### Development Setup
|
|
247
|
-
|
|
248
|
-
1. Fork the repository
|
|
249
|
-
2. Install dependencies: `yarn install`
|
|
250
|
-
3. Make your changes
|
|
251
|
-
4. Run tests: `yarn test`
|
|
252
|
-
5. Run linting: `yarn lint`
|
|
253
|
-
6. Build: `yarn build`
|
|
254
|
-
7. Submit a pull request
|
|
255
|
-
|
|
256
|
-
### Code Style
|
|
257
|
-
|
|
258
|
-
- Follow TypeScript best practices
|
|
259
|
-
- Use ESLint configuration provided
|
|
260
|
-
- Add JSDoc comments for public methods
|
|
261
|
-
- Include unit tests for new features
|
|
262
|
-
- Follow existing naming conventions
|
|
263
|
-
|
|
264
|
-
### Testing
|
|
86
|
+
## Development
|
|
265
87
|
|
|
266
88
|
```bash
|
|
267
|
-
|
|
268
|
-
yarn
|
|
269
|
-
|
|
270
|
-
#
|
|
271
|
-
yarn
|
|
272
|
-
|
|
273
|
-
# Run tests with coverage
|
|
274
|
-
yarn test:coverage
|
|
89
|
+
yarn install
|
|
90
|
+
yarn lint # eslint (flat config, eslint.config.mjs)
|
|
91
|
+
yarn test # jest
|
|
92
|
+
yarn build # gulp: tsc -> dist/, plus icons, credentials, package.json
|
|
93
|
+
yarn dev # build + watch
|
|
275
94
|
```
|
|
276
95
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
### Documentation
|
|
280
|
-
- [InNotes API Documentation](https://docs.innotes.com)
|
|
281
|
-
- [N8N Documentation](https://docs.n8n.io)
|
|
282
|
-
|
|
283
|
-
### Issues
|
|
284
|
-
If you encounter any issues or have feature requests, please:
|
|
285
|
-
1. Check existing issues in the repository
|
|
286
|
-
2. Create a new issue with detailed description
|
|
287
|
-
3. Include error messages and steps to reproduce
|
|
288
|
-
|
|
289
|
-
### Community
|
|
290
|
-
- Join the N8N Community Discord
|
|
291
|
-
- Check the InNotes user community
|
|
96
|
+
Publishing is automated — see `CI_SETUP.md`. Do not `npm publish` by hand.
|
|
292
97
|
|
|
293
98
|
## License
|
|
294
99
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
## Changelog
|
|
298
|
-
|
|
299
|
-
### Version 1.0.0
|
|
300
|
-
- Initial release
|
|
301
|
-
- Support for all InNotes resources (Contact, Note, Job, Status, Tag, User)
|
|
302
|
-
- Complete CRUD operations
|
|
303
|
-
- Search and filtering capabilities
|
|
304
|
-
- Pagination support
|
|
305
|
-
- Comprehensive error handling
|
|
306
|
-
- Full TypeScript support
|
|
307
|
-
|
|
308
|
-
---
|
|
309
|
-
|
|
310
|
-
**Author**: marco
|
|
311
|
-
**Last Updated**: 2025-06-01
|
|
100
|
+
MIT.
|
package/dist/package.json
CHANGED