n8n-nodes-transcriptfetch 0.1.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.
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 TranscriptFetch
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# n8n-nodes-transcriptfetch
|
|
2
|
+
|
|
3
|
+
This is an n8n community node for [TranscriptFetch](https://transcriptfetch.com) - the video & web data API for AI.
|
|
4
|
+
|
|
5
|
+
Fetch transcripts from **YouTube, TikTok, Instagram, X (Twitter) & Facebook**, and convert **any web page to clean Markdown** - directly inside your n8n workflows. Structured JSON output with per-segment timestamps, built for RAG, agents, and LLM pipelines.
|
|
6
|
+
|
|
7
|
+
[n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation. Search for `n8n-nodes-transcriptfetch`.
|
|
12
|
+
|
|
13
|
+
## Credentials
|
|
14
|
+
|
|
15
|
+
Sign up at [transcriptfetch.com](https://transcriptfetch.com) and create an API key in the [dashboard](https://transcriptfetch.com/app). Add it as a **TranscriptFetch API** credential in n8n.
|
|
16
|
+
|
|
17
|
+
Billing is usage-based: 1 credit per successful response. Failed, blocked, or no-transcript fetches are never charged.
|
|
18
|
+
|
|
19
|
+
## Operations
|
|
20
|
+
|
|
21
|
+
### Transcript
|
|
22
|
+
|
|
23
|
+
- **Get Video Transcript** - transcript for a YouTube, TikTok, Instagram, X, or Facebook video (text + timestamped segments). When no captions exist, audio is transcribed automatically.
|
|
24
|
+
- **Get Transcripts (Batch)** - up to 50 video transcripts in one call.
|
|
25
|
+
- **List Channel Videos** - resolve a channel into a list of videos.
|
|
26
|
+
- **List Playlist Videos** - resolve a playlist into a list of videos.
|
|
27
|
+
- **Search Videos** - resolve a keyword search into a list of videos.
|
|
28
|
+
|
|
29
|
+
### Web
|
|
30
|
+
|
|
31
|
+
- **Scrape Page to Markdown** - any http(s) URL as clean Markdown (navigation, ads, and boilerplate removed).
|
|
32
|
+
- **Map Site Links** - list the same-site links reachable from a URL.
|
|
33
|
+
- **Crawl Site to Markdown** - breadth-first crawl returning Markdown for every readable page.
|
|
34
|
+
|
|
35
|
+
The node is also marked **usable as a tool**, so n8n AI Agent nodes can call it directly.
|
|
36
|
+
|
|
37
|
+
## Resources
|
|
38
|
+
|
|
39
|
+
- [TranscriptFetch API documentation](https://transcriptfetch.com/docs)
|
|
40
|
+
- [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
|
|
41
|
+
|
|
42
|
+
## License
|
|
43
|
+
|
|
44
|
+
[MIT](LICENSE.md)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TranscriptFetchApi = void 0;
|
|
4
|
+
class TranscriptFetchApi {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'transcriptFetchApi';
|
|
7
|
+
this.displayName = 'TranscriptFetch API';
|
|
8
|
+
this.documentationUrl = 'https://transcriptfetch.com/docs';
|
|
9
|
+
this.properties = [
|
|
10
|
+
{
|
|
11
|
+
displayName: 'API Key',
|
|
12
|
+
name: 'apiKey',
|
|
13
|
+
type: 'string',
|
|
14
|
+
typeOptions: { password: true },
|
|
15
|
+
default: '',
|
|
16
|
+
description: 'Your TranscriptFetch API key. Create one in the dashboard at https://transcriptfetch.com/app.',
|
|
17
|
+
},
|
|
18
|
+
];
|
|
19
|
+
this.authenticate = {
|
|
20
|
+
type: 'generic',
|
|
21
|
+
properties: {
|
|
22
|
+
headers: {
|
|
23
|
+
Authorization: '=Bearer {{$credentials.apiKey}}',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
this.test = {
|
|
28
|
+
request: {
|
|
29
|
+
baseURL: 'https://transcriptfetch.com',
|
|
30
|
+
url: '/api/v1/health',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.TranscriptFetchApi = TranscriptFetchApi;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TranscriptFetch = void 0;
|
|
4
|
+
class TranscriptFetch {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.description = {
|
|
7
|
+
displayName: 'TranscriptFetch',
|
|
8
|
+
name: 'transcriptFetch',
|
|
9
|
+
icon: 'file:transcriptfetch.svg',
|
|
10
|
+
group: ['transform'],
|
|
11
|
+
version: 1,
|
|
12
|
+
subtitle: '={{ $parameter["operation"] + ": " + $parameter["resource"] }}',
|
|
13
|
+
description: 'Video transcripts from YouTube, TikTok, Instagram, X & Facebook, plus any web page as clean Markdown',
|
|
14
|
+
defaults: {
|
|
15
|
+
name: 'TranscriptFetch',
|
|
16
|
+
},
|
|
17
|
+
usableAsTool: true,
|
|
18
|
+
inputs: ['main'],
|
|
19
|
+
outputs: ['main'],
|
|
20
|
+
credentials: [
|
|
21
|
+
{
|
|
22
|
+
name: 'transcriptFetchApi',
|
|
23
|
+
required: true,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
requestDefaults: {
|
|
27
|
+
baseURL: 'https://transcriptfetch.com',
|
|
28
|
+
headers: {
|
|
29
|
+
Accept: 'application/json',
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
properties: [
|
|
34
|
+
{
|
|
35
|
+
displayName: 'Resource',
|
|
36
|
+
name: 'resource',
|
|
37
|
+
type: 'options',
|
|
38
|
+
noDataExpression: true,
|
|
39
|
+
options: [
|
|
40
|
+
{ name: 'Transcript', value: 'transcript' },
|
|
41
|
+
{ name: 'Web', value: 'web' },
|
|
42
|
+
],
|
|
43
|
+
default: 'transcript',
|
|
44
|
+
},
|
|
45
|
+
// ── Transcript operations ─────────────────────────────────────────
|
|
46
|
+
{
|
|
47
|
+
displayName: 'Operation',
|
|
48
|
+
name: 'operation',
|
|
49
|
+
type: 'options',
|
|
50
|
+
noDataExpression: true,
|
|
51
|
+
displayOptions: { show: { resource: ['transcript'] } },
|
|
52
|
+
options: [
|
|
53
|
+
{
|
|
54
|
+
name: 'Get Video Transcript',
|
|
55
|
+
value: 'getVideo',
|
|
56
|
+
action: 'Get a video transcript',
|
|
57
|
+
description: 'Fetch the transcript for a YouTube, TikTok, Instagram, X (Twitter), or Facebook video (text + timestamped segments)',
|
|
58
|
+
routing: { request: { method: 'POST', url: '/api/v1/transcripts/video' } },
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'Get Transcripts (Batch)',
|
|
62
|
+
value: 'batch',
|
|
63
|
+
action: 'Get up to 50 transcripts in one call',
|
|
64
|
+
description: 'Fetch transcripts for up to 50 YouTube video IDs or URLs concurrently',
|
|
65
|
+
routing: { request: { method: 'POST', url: '/api/v1/transcripts/batch' } },
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'List Channel Videos',
|
|
69
|
+
value: 'channel',
|
|
70
|
+
action: 'List a channel s videos',
|
|
71
|
+
description: 'Resolve a YouTube channel into a list of videos (metadata only)',
|
|
72
|
+
routing: { request: { method: 'POST', url: '/api/v1/transcripts/channel' } },
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'List Playlist Videos',
|
|
76
|
+
value: 'playlist',
|
|
77
|
+
action: 'List a playlist s videos',
|
|
78
|
+
description: 'Resolve a YouTube playlist into a list of videos (metadata only)',
|
|
79
|
+
routing: { request: { method: 'POST', url: '/api/v1/transcripts/playlist' } },
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'Search Videos',
|
|
83
|
+
value: 'search',
|
|
84
|
+
action: 'Search you tube for videos',
|
|
85
|
+
description: 'Resolve a keyword search into a list of videos (metadata only)',
|
|
86
|
+
routing: { request: { method: 'POST', url: '/api/v1/transcripts/search' } },
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
default: 'getVideo',
|
|
90
|
+
},
|
|
91
|
+
// ── Web operations ────────────────────────────────────────────────
|
|
92
|
+
{
|
|
93
|
+
displayName: 'Operation',
|
|
94
|
+
name: 'operation',
|
|
95
|
+
type: 'options',
|
|
96
|
+
noDataExpression: true,
|
|
97
|
+
displayOptions: { show: { resource: ['web'] } },
|
|
98
|
+
options: [
|
|
99
|
+
{
|
|
100
|
+
name: 'Scrape Page to Markdown',
|
|
101
|
+
value: 'scrape',
|
|
102
|
+
action: 'Scrape a web page to markdown',
|
|
103
|
+
description: 'Fetch any http(s) URL and return the main readable content as clean Markdown',
|
|
104
|
+
routing: { request: { method: 'POST', url: '/api/v1/web' } },
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'Map Site Links',
|
|
108
|
+
value: 'map',
|
|
109
|
+
action: 'Map a site s links',
|
|
110
|
+
description: 'List the same-site links reachable from a URL',
|
|
111
|
+
routing: { request: { method: 'POST', url: '/api/v1/web/map' } },
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'Crawl Site to Markdown',
|
|
115
|
+
value: 'crawl',
|
|
116
|
+
action: 'Crawl a site to markdown',
|
|
117
|
+
description: 'Breadth-first crawl from a start URL, returning clean Markdown for every readable page (up to 25 per call)',
|
|
118
|
+
routing: { request: { method: 'POST', url: '/api/v1/web/crawl' } },
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
default: 'scrape',
|
|
122
|
+
},
|
|
123
|
+
// ── Transcript fields ─────────────────────────────────────────────
|
|
124
|
+
{
|
|
125
|
+
displayName: 'Video URL or ID',
|
|
126
|
+
name: 'video',
|
|
127
|
+
type: 'string',
|
|
128
|
+
required: true,
|
|
129
|
+
default: '',
|
|
130
|
+
placeholder: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
|
|
131
|
+
description: 'YouTube, TikTok, Instagram, X (Twitter), or Facebook video URL - or a bare YouTube video ID',
|
|
132
|
+
displayOptions: { show: { resource: ['transcript'], operation: ['getVideo'] } },
|
|
133
|
+
routing: { send: { type: 'body', property: 'video' } },
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
displayName: 'Video IDs or URLs',
|
|
137
|
+
name: 'videoIds',
|
|
138
|
+
type: 'string',
|
|
139
|
+
required: true,
|
|
140
|
+
default: '',
|
|
141
|
+
placeholder: 'dQw4w9WgXcQ, 9bZkp7q19f0',
|
|
142
|
+
description: 'Comma-separated list of up to 50 YouTube video IDs or URLs',
|
|
143
|
+
displayOptions: { show: { resource: ['transcript'], operation: ['batch'] } },
|
|
144
|
+
routing: {
|
|
145
|
+
send: {
|
|
146
|
+
type: 'body',
|
|
147
|
+
property: 'videoIds',
|
|
148
|
+
value: '={{ $parameter["videoIds"].split(",").map(v => v.trim()).filter(v => v.length > 0) }}',
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
displayName: 'Channel',
|
|
154
|
+
name: 'channel',
|
|
155
|
+
type: 'string',
|
|
156
|
+
required: true,
|
|
157
|
+
default: '',
|
|
158
|
+
placeholder: '@lexfridman',
|
|
159
|
+
description: 'Channel @handle, /channel/UC… URL, or UC… ID',
|
|
160
|
+
displayOptions: { show: { resource: ['transcript'], operation: ['channel'] } },
|
|
161
|
+
routing: { send: { type: 'body', property: 'channel' } },
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
displayName: 'Playlist',
|
|
165
|
+
name: 'playlist',
|
|
166
|
+
type: 'string',
|
|
167
|
+
required: true,
|
|
168
|
+
default: '',
|
|
169
|
+
placeholder: 'PLrAXtmRdnEQy6nuLMt9H1aZIuhcGOcZQ4',
|
|
170
|
+
description: 'Playlist URL or playlist ID',
|
|
171
|
+
displayOptions: { show: { resource: ['transcript'], operation: ['playlist'] } },
|
|
172
|
+
routing: { send: { type: 'body', property: 'playlist' } },
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
displayName: 'Query',
|
|
176
|
+
name: 'query',
|
|
177
|
+
type: 'string',
|
|
178
|
+
required: true,
|
|
179
|
+
default: '',
|
|
180
|
+
placeholder: 'how transformers work',
|
|
181
|
+
description: 'Keyword search query',
|
|
182
|
+
displayOptions: { show: { resource: ['transcript'], operation: ['search'] } },
|
|
183
|
+
routing: { send: { type: 'body', property: 'query' } },
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
displayName: 'Limit',
|
|
187
|
+
name: 'limit',
|
|
188
|
+
type: 'number',
|
|
189
|
+
typeOptions: { minValue: 1 },
|
|
190
|
+
default: 10,
|
|
191
|
+
description: 'Max number of results to return',
|
|
192
|
+
displayOptions: {
|
|
193
|
+
show: { resource: ['transcript'], operation: ['channel', 'playlist', 'search'] },
|
|
194
|
+
},
|
|
195
|
+
routing: { send: { type: 'body', property: 'limit' } },
|
|
196
|
+
},
|
|
197
|
+
// ── Web fields ────────────────────────────────────────────────────
|
|
198
|
+
{
|
|
199
|
+
displayName: 'URL',
|
|
200
|
+
name: 'url',
|
|
201
|
+
type: 'string',
|
|
202
|
+
required: true,
|
|
203
|
+
default: '',
|
|
204
|
+
placeholder: 'https://example.com/article',
|
|
205
|
+
description: 'The http(s) URL to fetch',
|
|
206
|
+
displayOptions: { show: { resource: ['web'] } },
|
|
207
|
+
routing: { send: { type: 'body', property: 'url' } },
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
displayName: 'Limit',
|
|
211
|
+
name: 'limit',
|
|
212
|
+
type: 'number',
|
|
213
|
+
typeOptions: { minValue: 1 },
|
|
214
|
+
default: 10,
|
|
215
|
+
description: 'Max number of links (map) or pages (crawl) to return',
|
|
216
|
+
displayOptions: { show: { resource: ['web'], operation: ['map', 'crawl'] } },
|
|
217
|
+
routing: { send: { type: 'body', property: 'limit' } },
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
exports.TranscriptFetch = TranscriptFetch;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80">
|
|
2
|
+
<rect width="80" height="80" rx="18" fill="#0f172a" />
|
|
3
|
+
<g fill="#f5f5f4">
|
|
4
|
+
<rect x="30" y="16" width="20" height="7" rx="3.5" />
|
|
5
|
+
<rect x="23" y="30" width="34" height="7" rx="3.5" />
|
|
6
|
+
<rect x="16" y="44" width="48" height="7" rx="3.5" />
|
|
7
|
+
<rect x="24" y="58" width="32" height="7" rx="3.5" />
|
|
8
|
+
</g>
|
|
9
|
+
</svg>
|
package/index.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-transcriptfetch",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "n8n community node for TranscriptFetch - video transcripts from YouTube, TikTok, Instagram, X & Facebook, plus any web page as clean Markdown.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"n8n-community-node-package",
|
|
7
|
+
"transcript",
|
|
8
|
+
"youtube",
|
|
9
|
+
"tiktok",
|
|
10
|
+
"instagram",
|
|
11
|
+
"captions",
|
|
12
|
+
"markdown",
|
|
13
|
+
"scraping",
|
|
14
|
+
"transcriptfetch"
|
|
15
|
+
],
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"homepage": "https://transcriptfetch.com",
|
|
18
|
+
"author": {
|
|
19
|
+
"name": "TranscriptFetch",
|
|
20
|
+
"email": "support@transcriptfetch.com"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "https://github.com/TranscriptFetch/n8n-nodes-transcriptfetch.git"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=20"
|
|
28
|
+
},
|
|
29
|
+
"main": "index.js",
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc && node -e \"require('fs').cpSync('nodes/TranscriptFetch/transcriptfetch.svg','dist/nodes/TranscriptFetch/transcriptfetch.svg')\"",
|
|
32
|
+
"dev": "tsc --watch",
|
|
33
|
+
"lint": "npx @n8n/scan-community-package ."
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist"
|
|
37
|
+
],
|
|
38
|
+
"n8n": {
|
|
39
|
+
"n8nNodesApiVersion": 1,
|
|
40
|
+
"credentials": [
|
|
41
|
+
"dist/credentials/TranscriptFetchApi.credentials.js"
|
|
42
|
+
],
|
|
43
|
+
"nodes": [
|
|
44
|
+
"dist/nodes/TranscriptFetch/TranscriptFetch.node.js"
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"n8n-workflow": "*",
|
|
49
|
+
"typescript": "^5.5.0"
|
|
50
|
+
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"n8n-workflow": "*"
|
|
53
|
+
}
|
|
54
|
+
}
|