Built a simple Make webhook → Apify → YouTube transcript pipeline (JSON included)

I put together a small Make (Integromat) workflow to automatically fetch YouTube transcripts using Apify, and thought it might be useful for others here.

What it does:

  • Accepts a YouTube URL via webhook
  • Sends it to an Apify actor (YouTube transcript extractor)
  • Fetches the dataset output
  • Returns structured data (title, video info, transcript, etc.) as a response

Flow breakdown:

  1. Custom Webhook → receives videoUrl
  2. Apify Actor (run sync) → extracts transcript
  3. Fetch Dataset Items → gets results in JSON
  4. Webhook Response → returns clean structured output

Output example includes:

  • video_id
  • video_url
  • video_title
  • published_at
  • thumbnail
  • full transcript

Why this is useful:

  • Plug into AI pipelines (summarization, content repurposing, etc.)
  • Automate transcript extraction without dealing with YouTube APIs
  • Works well for bulk or real-time processing

json make template:

{
    "name": "Integration Webhooks, Apify",
    "flow": [
        {
            "id": 1,
            "module": "gateway:CustomWebHook",
            "version": 1,
            "parameters": {
                "hook": 2692381,
                "maxResults": 1
            },
            "mapper": {},
            "metadata": {
                "designer": {
                    "x": 0,
                    "y": 0
                },
                "restore": {
                    "parameters": {
                        "hook": {
                            "data": {
                                "editable": "true"
                            },
                            "label": "youtube-transcript-extractor-apify"
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "hook",
                        "type": "hook:gateway-webhook",
                        "label": "Webhook",
                        "required": true
                    },
                    {
                        "name": "maxResults",
                        "type": "number",
                        "label": "Maximum number of results"
                    }
                ]
            }
        },
        {
            "id": 2,
            "module": "apify:runActorNew",
            "version": 1,
            "parameters": {
                "__IMTCONN__": 4429358
            },
            "mapper": {
                "actorId": "bbqmsPr0r519A0ZaV",
                "runSync": true,
                "actor_search_type": "user",
                "inputBodybbqmsPr0r519A0ZaV": "{\n    \"videoUrl\": \"{{1.url}}\",\n    \"language\": \"en\"\n}"
            },
            "metadata": {
                "designer": {
                    "x": 300,
                    "y": 0
                },
                "restore": {
                    "expect": {
                        "memory": {
                            "mode": "chose",
                            "label": "Empty"
                        },
                        "actorId": {
                            "mode": "chose",
                            "label": "YouTube Transcript Scraper- Fast & Accurate (akash9078/youtube-transcript-extractor)"
                        },
                        "runSync": {
                            "mode": "chose"
                        },
                        "actor_search_type": {
                            "label": "Recently used Actors"
                        }
                    },
                    "parameters": {
                        "__IMTCONN__": {
                            "data": {
                                "scoped": "true",
                                "connection": "apify"
                            },
                            "label": "healthy.living (healthyliving.workout@gmail.com)"
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "__IMTCONN__",
                        "type": "account:apify2,apify",
                        "label": "Connection",
                        "required": true
                    }
                ],
                "expect": [
                    {
                        "name": "actor_search_type",
                        "type": "select",
                        "label": "Search Actors from",
                        "required": true,
                        "validate": {
                            "enum": [
                                "user",
                                "store"
                            ]
                        }
                    },
                    {
                        "name": "runSync",
                        "type": "boolean",
                        "label": "Run synchronously",
                        "required": true
                    },
                    {
                        "name": "build",
                        "type": "text",
                        "label": "Build"
                    },
                    {
                        "name": "timeout",
                        "type": "uinteger",
                        "label": "Timeout"
                    },
                    {
                        "name": "memory",
                        "type": "select",
                        "label": "Memory",
                        "validate": {
                            "enum": [
                                128,
                                256,
                                512,
                                1024,
                                2048,
                                4096,
                                8192,
                                16384,
                                32768
                            ]
                        }
                    },
                    {
                        "name": "actorId",
                        "type": "select",
                        "label": "Actor",
                        "required": true
                    },
                    {
                        "name": "inputBodybbqmsPr0r519A0ZaV",
                        "type": "text",
                        "label": "Input JSON",
                        "required": true
                    },
                    {
                        "name": "maxTotalChargeUsd",
                        "type": "number",
                        "label": "Maximum cost per run"
                    },
                    {
                        "name": "maxItems",
                        "type": "hidden",
                        "label": "Maximum charged results"
                    }
                ]
            }
        },
        {
            "id": 6,
            "module": "apify:fetchDatasetItems",
            "version": 1,
            "parameters": {
                "__IMTCONN__": 4429358
            },
            "filter": null,
            "mapper": {
                "type": "clean",
                "limit": "100",
                "format": "json",
                "datasetId": "{{2.defaultDatasetId}}"
            },
            "metadata": {
                "designer": {
                    "x": 600,
                    "y": 0
                },
                "restore": {
                    "expect": {
                        "type": {
                            "mode": "chose",
                            "label": "Clean"
                        },
                        "format": {
                            "mode": "chose",
                            "label": "JSON"
                        }
                    },
                    "parameters": {
                        "__IMTCONN__": {
                            "data": {
                                "scoped": "true",
                                "connection": "apify"
                            },
                            "label": "healthy.living (healthyliving.workout@gmail.com)"
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "__IMTCONN__",
                        "type": "account:apify2,apify",
                        "label": "Connection",
                        "required": true
                    }
                ],
                "expect": [
                    {
                        "name": "datasetId",
                        "type": "text",
                        "label": "Dataset ID",
                        "required": true
                    },
                    {
                        "name": "type",
                        "type": "select",
                        "label": "Data transformation",
                        "required": true,
                        "validate": {
                            "enum": [
                                "clean",
                                "simplified",
                                "none"
                            ]
                        }
                    },
                    {
                        "name": "format",
                        "type": "select",
                        "label": "Format",
                        "required": true,
                        "validate": {
                            "enum": [
                                "json",
                                "csv",
                                "html",
                                "xml",
                                "rss",
                                "xlsx"
                            ]
                        }
                    },
                    {
                        "name": "limit",
                        "type": "uinteger",
                        "label": "Limit",
                        "validate": {
                            "max": 100000,
                            "min": 1
                        }
                    },
                    {
                        "name": "offset",
                        "type": "uinteger",
                        "label": "Offset",
                        "validate": {
                            "min": 0
                        }
                    },
                    {
                        "name": "fields",
                        "type": "text",
                        "label": "Fields"
                    },
                    {
                        "name": "omit",
                        "type": "text",
                        "label": "Omit Fields"
                    }
                ]
            }
        },
        {
            "id": 5,
            "module": "gateway:WebhookRespond",
            "version": 1,
            "parameters": {},
            "mapper": {
                "body": "video_id: {{6.video_id}}\nvideo_url: {{6.video_url}}\nvideo_title: {{6.video_title}}\npublished_at: {{6.published_at}}\nthumbnail: {{6.thumbnail_max_hd_url}}\ntranscript: {{6.transcript}}",
                "status": "200",
                "headers": []
            },
            "metadata": {
                "designer": {
                    "x": 900,
                    "y": 0
                },
                "restore": {
                    "expect": {
                        "headers": {
                            "mode": "chose"
                        }
                    }
                },
                "expect": [
                    {
                        "name": "status",
                        "type": "uinteger",
                        "label": "Status",
                        "required": true,
                        "validate": {
                            "min": 100
                        }
                    },
                    {
                        "name": "body",
                        "type": "any",
                        "label": "Body"
                    },
                    {
                        "name": "headers",
                        "spec": [
                            {
                                "name": "key",
                                "type": "text",
                                "label": "Key",
                                "required": true,
                                "validate": {
                                    "max": 256
                                }
                            },
                            {
                                "name": "value",
                                "type": "text",
                                "label": "Value",
                                "required": true,
                                "validate": {
                                    "max": 4096
                                }
                            }
                        ],
                        "type": "array",
                        "label": "Custom headers",
                        "validate": {
                            "maxItems": 16
                        }
                    }
                ]
            }
        }
    ],
    "metadata": {
        "instant": true,
        "version": 1,
        "scenario": {
            "roundtrips": 1,
            "maxErrors": 3,
            "autoCommit": true,
            "autoCommitTriggerLast": true,
            "sequential": false,
            "slots": null,
            "confidential": false,
            "dataloss": false,
            "dlq": false,
            "freshVariables": false
        },
        "designer": {
            "orphans": []
        },
        "zone": "us1.make.com",
        "notes": []
    }
}
1 Like

Connecting Make to Apify for YouTube transcript extraction is a solid pattern and the webhook trigger approach you described is exactly right.

The key things to get right: first, make sure your Make webhook is set to immediately return a response after accepting the payload, then use a separate HTTP module to call Apify’s Actor run endpoint asynchronously. If you try to do the Apify call synchronously inside the same webhook response window, you risk timeouts for longer videos.

Second, when Apify finishes, it can call back to a second Make webhook with the transcript result - this gives you a clean async pipeline. In the second scenario, parse the Apify output with the JSON Parse module; the transcript usually comes as an array of objects with text and timestamp fields.

Use an Iterator to go through them, then a Text Aggregator with newline separator to combine into a single readable block.

For the blueprint structure:

1. Webhook trigger - HTTP Apify run - Webhook Response (202 accepted)

2. Second scenario: Webhook trigger - JSON Parse - Iterator - Text Aggregator - your downstream module

I built a tested blueprint for exactly this pattern - happy to share.