Optimisation des Processus d'Extraction de Schémas API

Ce workflow n8n automatisé permet aux entreprises de rationaliser la recherche, l'extraction et la génération de schémas d'API à partir de documentations disponibles en ligne. En utilisant des outils puissants comme Apify pour le scraping web et Google Sheets pour le stockage des données, ce processus garantit une collecte rapide et précise des informations d'API critiques, optimisant ainsi les efforts de développement et améliorant l'efficacité opérationnelle.

161,438 vues
35,844 copies
Automatisation

Documentation Complète

📋 Optimisation des Processus d'Extraction de Schémas API

💡 Description

Ce workflow n8n automatisé permet aux entreprises de rationaliser la recherche, l'extraction et la génération de schémas d'API à partir de documentations disponibles en ligne. En utilisant des outils puissants comme Apify pour le scraping web et Google Sheets pour le stockage des données, ce processus garantit une collecte rapide et précise des informations d'API critiques, optimisant ainsi les efforts de développement et améliorant l'efficacité opérationnelle.

📈 Impact & ROI: En automatisant la découverte et l'extraction des schémas API, ce workflow peut réduire considérablement le temps passé par les développeurs sur ces tâches répétitives, permettant un retour sur investissement rapide grâce à une efficacité accrue et une réduction des erreurs.

🚀 Fonctionnalités Clés

  • ✅ Recherche automatisée de documentations API - Améliore l'efficacité
  • ✅ Extraction précise des opérations API - Réduit les erreurs manuelles
  • ✅ Génération de schémas personnalisés - Facilite l'intégration
  • ✅ Stockage structuré dans Google Sheets - Accès simplifié aux données

📊 Architecture Technique

88
Nodes
75
Connexions
4
Services

🔌 Services Intégrés

ApifyGoogle SheetsGoogle DriveQdrant

🔧 Composition du Workflow

NodeTypeDescription
When clicking ‘Test workflow’manualTriggerTraitement des données
Web Search For API SchemahttpRequestRequête HTTP vers une API externe
Scrape Webpage ContentshttpRequestRequête HTTP vers une API externe
Results to ListsplitOutDivision des données en plusieurs branches
Recursive Character Text Splitter1@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitterDivision des données en plusieurs branches
Content Chunking @ 50k CharssetTraitement des données
Split Out ChunkssplitOutDivision des données en plusieurs branches
Default Data Loader@n8n/n8n-nodes-langchain.documentDefaultDataLoaderTraitement des données
Set Embedding VariablessetTraitement des données
Execute Workflow TriggerexecuteWorkflowTriggerTraitement des données
Execution DataexecutionDataTraitement des données
EventRouterswitchTraitement des données
Google Gemini Chat Model@n8n/n8n-nodes-langchain.lmChatGoogleGeminiTraitement des données
Successful RunsfilterTraitement des données
For Each Document...splitInBatchesDivision des données en plusieurs branches
Embeddings Google Gemini@n8n/n8n-nodes-langchain.embeddingsGoogleGeminiTraitement des données
Has API Documentation?@n8n/n8n-nodes-langchain.textClassifierCondition logique pour router le flux
Store Document Embeddings@n8n/n8n-nodes-langchain.vectorStoreQdrantTraitement des données
Embeddings Google Gemini1@n8n/n8n-nodes-langchain.embeddingsGoogleGeminiTraitement des données
Google Gemini Chat Model1@n8n/n8n-nodes-langchain.lmChatGoogleGeminiTraitement des données
Extract API Operations@n8n/n8n-nodes-langchain.informationExtractorTraitement des données
Search in Relevant Docs@n8n/n8n-nodes-langchain.vectorStoreQdrantTraitement des données
WaitwaitTraitement des données
Remove DupesremoveDuplicatesTraitement des données
Filter ResultsfilterTraitement des données
ResearchexecuteWorkflowTraitement des données
Has Results?ifCondition logique pour router le flux
Response EmptysetTraitement des données
Response OKsetTraitement des données
Combine DocsaggregateTraitement des données
Template to ListsplitOutDivision des données en plusieurs branches
Query TemplatessetTraitement des données
Google Gemini Chat Model2@n8n/n8n-nodes-langchain.lmChatGoogleGeminiTraitement des données
For Each Template...splitInBatchesDivision des données en plusieurs branches
Query & DocssetTraitement des données
Identify Service Products@n8n/n8n-nodes-langchain.informationExtractorTraitement des données
Extract API TemplatessetTraitement des données
Embeddings Google Gemini2@n8n/n8n-nodes-langchain.embeddingsGoogleGeminiTraitement des données
Search in Relevant Docs1@n8n/n8n-nodes-langchain.vectorStoreQdrantTraitement des données
Combine Docs1aggregateTraitement des données
Query & Docs1setTraitement des données
For Each Template...1splitInBatchesDivision des données en plusieurs branches
Merge ListscodeTraitement des données
Remove DuplicatesremoveDuplicatesTraitement des données
Append RowgoogleSheetsTraitement des données
Response OK1setTraitement des données
Has Operations?ifCondition logique pour router le flux
Response Empty1setTraitement des données
Research PendinggoogleSheetsTraitement des données
Research ResultgoogleSheetsTraitement des données
Research ErrorgoogleSheetsTraitement des données
Extract PendinggoogleSheetsTraitement des données
Research EventsetTraitement des données
Extract EventsetTraitement des données
ExtractexecuteWorkflowTraitement des données
Extract ResultgoogleSheetsTraitement des données
Extract ErrorgoogleSheetsTraitement des données
Get API OperationsgoogleSheetsTraitement des données
Contruct JSON SchemacodeTraitement des données
Upload to DrivegoogleDriveTraitement des données
Set Upload FieldssetTraitement des données
Response OK2setTraitement des données
Generate EventsetTraitement des données
Generate PendinggoogleSheetsTraitement des données
GenerateexecuteWorkflowTraitement des données
Generate ErrorgoogleSheetsTraitement des données
Generate ResultgoogleSheetsTraitement des données
Get All ExtractgoogleSheetsTraitement des données
Get All ResearchgoogleSheetsTraitement des données
For Each Research...splitInBatchesDivision des données en plusieurs branches
For Each Extract...splitInBatchesDivision des données en plusieurs branches
Wait1waitTraitement des données
All Research Done?ifCondition logique pour router le flux
All Extract Done?ifCondition logique pour router le flux
Get All GenerategoogleSheetsTraitement des données
All Generate Done?ifCondition logique pour router le flux
For Each Generate...splitInBatchesDivision des données en plusieurs branches
Wait2waitTraitement des données
Has Results?1ifCondition logique pour router le flux
Response Scrape ErrorsetTraitement des données
Has Results?3ifCondition logique pour router le flux
Response No API DocssetTraitement des données
Sticky NotestickyNoteTraitement des données
Sticky Note1stickyNoteTraitement des données
Sticky Note2stickyNoteTraitement des données
Sticky Note3stickyNoteTraitement des données
Sticky Note4stickyNoteTraitement des données
Sticky Note5stickyNoteTraitement des données

📖 Guide d'Implémentation

  1. Import du workflow: Téléchargez le fichier JSON et importez-le dans votre instance n8n
  2. Configuration des credentials: Configurez les accès pour chaque service utilisé
  3. Personnalisation: Adaptez les paramètres selon vos besoins spécifiques
  4. Test: Exécutez le workflow en mode test pour vérifier le bon fonctionnement
  5. Activation: Activez le workflow pour une exécution automatique

🏷️ Tags

APIScrapingAutomatisationGoogle SheetsApify

Structure JSON

Voir le code JSON complet
{
    "nodes": [
        {
            "id": "2498bb93-176f-458c-acee-f541859df770",
            "name": "When clicking ‘Test workflow’",
            "type": "n8n-nodes-base.manualTrigger",
            "position": [
                2460,
                2820
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "c08bcf84-9336-44f9-b452-0c9469f18f48",
            "name": "Web Search For API Schema",
            "type": "n8n-nodes-base.httpRequest",
            "onError": "continueRegularOutput",
            "position": [
                3100,
                3820
            ],
            "parameters": {
                "url": "https:\/\/api.apify.com\/v2\/acts\/serping~fast-google-search-results-scraper\/run-sync-get-dataset-items",
                "method": "POST",
                "options": [],
                "sendBody": true,
                "authentication": "genericCredentialType",
                "bodyParameters": {
                    "parameters": [
                        {
                            "name": "searchTerms",
                            "value": "={{\n[\n  `site:${$json.data.url.replace(\/^http[s]:\\\/\\\/\/, '').replace(\/\\\/$\/, '').replace('www.', '')} \"${$json.data.service}\" api developer (intext:reference OR intext:resource) (-inurl:support OR -inurl:help) (inurl:api OR intitle:api) -filetype:pdf`\n]\n}}"
                        },
                        {
                            "name": "resultsPerPage",
                            "value": "={{ 10 }}"
                        }
                    ]
                },
                "genericAuthType": "httpHeaderAuth"
            },
            "typeVersion": 4.2
        },
        {
            "id": "d5b19e3a-acd0-4b06-8d77-42de1f797dba",
            "name": "Scrape Webpage Contents",
            "type": "n8n-nodes-base.httpRequest",
            "position": [
                3940,
                3720
            ],
            "parameters": {
                "url": "https:\/\/api.apify.com\/v2\/acts\/apify~web-scraper\/run-sync-get-dataset-items",
                "options": {
                    "batching": {
                        "batch": {
                            "batchSize": 2,
                            "batchInterval": 30000
                        }
                    }
                },
                "jsonBody": "={\n  \"startUrls\": [\n    {\n      \"url\": \"{{ $json.source.link }}\",\n      \"method\": \"GET\"\n    }\n  ],\n  \"breakpointLocation\": \"NONE\",\n  \"browserLog\": false,\n  \"closeCookieModals\": false,\n  \"debugLog\": false,\n  \"downloadCss\": false,\n  \"downloadMedia\": false,\n  \"excludes\": [\n    {\n      \"glob\": \"\/**\/*.{png,jpg,jpeg,pdf}\"\n    }\n  ],\n  \"headless\": true,\n  \"ignoreCorsAndCsp\": false,\n  \"ignoreSslErrors\": false,\n  \n  \"injectJQuery\": true,\n  \"keepUrlFragments\": false,\n  \"linkSelector\": \"a[href]\",\n  \"maxCrawlingDepth\": 1,\n  \"maxPagesPerCrawl\": 1,\n  \"maxRequestRetries\": 1,\n  \"maxResultsPerCrawl\": 1,\n  \"pageFunction\": \"\/\/ The function accepts a single argument: the \\\"context\\\" object.\\n\/\/ For a complete list of its properties and functions,\\n\/\/ see https:\/\/apify.com\/apify\/web-scraper#page-function \\nasync function pageFunction(context) {\\n\\n    await new Promise(res => { setTimeout(res, 6000) });\\n    \/\/ This statement works as a breakpoint when you're trying to debug your code. Works only with Run mode: DEVELOPMENT!\\n    \/\/ debugger; \\n\\n    \/\/ jQuery is handy for finding DOM elements and extracting data from them.\\n    \/\/ To use it, make sure to enable the \\\"Inject jQuery\\\" option.\\n    const $ = context.jQuery;\\n    const title = $('title').first().text();\\n\\n    \/\/ Clone the body to avoid modifying the original content\\n    const bodyClone = $('body').clone();\\n    bodyClone.find('iframe, img, script, style, object, embed, noscript, svg, video, audio').remove();\\n    const body = bodyClone.html();\\n\\n    \/\/ Return an object with the data extracted from the page.\\n    \/\/ It will be stored to the resulting dataset.\\n    return {\\n        url: context.request.url,\\n        title,\\n        body\\n    };\\n}\",\n  \"postNavigationHooks\": \"\/\/ We need to return array of (possibly async) functions here.\\n\/\/ The functions accept a single argument: the \\\"crawlingContext\\\" object.\\n[\\n    async (crawlingContext) => {\\n        \/\/ ...\\n    },\\n]\",\n  \"preNavigationHooks\": \"\/\/ We need to return array of (possibly async) functions here.\\n\/\/ The functions accept two arguments: the \\\"crawlingContext\\\" object\\n\/\/ and \\\"gotoOptions\\\".\\n[\\n    async (crawlingContext, gotoOptions) => {\\n        \/\/ ...\\n    },\\n]\\n\",\n  \"proxyConfiguration\": {\n    \"useApifyProxy\": true\n  },\n  \"runMode\": \"PRODUCTION\",\n  \n  \"useChrome\": false,\n  \"waitUntil\": [\n    \"domcontentloaded\"\n  ],\n  \"globs\": [],\n  \"pseudoUrls\": [],\n  \"proxyRotation\": \"RECOMMENDED\",\n  \"maxConcurrency\": 50,\n  \"pageLoadTimeoutSecs\": 60,\n  \"pageFunctionTimeoutSecs\": 60,\n  \"maxScrollHeightPixels\": 5000,\n  \"customData\": {}\n}",
                "sendBody": true,
                "sendQuery": true,
                "specifyBody": "json",
                "authentication": "genericCredentialType",
                "genericAuthType": "httpQueryAuth",
                "queryParameters": {
                    "parameters": [
                        {
                            "name": "memory",
                            "value": "2048"
                        }
                    ]
                }
            },
            "typeVersion": 4.2
        },
        {
            "id": "5853ba7e-4068-4792-be5c-b8cf81ee89cb",
            "name": "Results to List",
            "type": "n8n-nodes-base.splitOut",
            "position": [
                3460,
                3720
            ],
            "parameters": {
                "options": [],
                "fieldToSplitOut": "origin_search.results"
            },
            "typeVersion": 1
        },
        {
            "id": "8ed2e8ec-b2e3-474b-b19d-f38b518f274b",
            "name": "Recursive Character Text Splitter1",
            "type": "@n8n\/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
            "position": [
                5800,
                4020
            ],
            "parameters": {
                "options": [],
                "chunkSize": 4000
            },
            "typeVersion": 1
        },
        {
            "id": "e2a8137b-7da3-4032-bca2-c14465356f02",
            "name": "Content Chunking @ 50k Chars",
            "type": "n8n-nodes-base.set",
            "position": [
                5380,
                3740
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "7753a4f4-3ec2-4c05-81df-3d5e8979a478",
                            "name": "=data",
                            "type": "array",
                            "value": "={{ new Array(Math.round($json.content.length \/ Math.min($json.content.length, 50000))).fill('').map((_,idx) => $json.content.substring(idx * 50000, idx * 50000 + 50000)) }}"
                        },
                        {
                            "id": "7973bcb4-f239-4619-85fc-c76e20386375",
                            "name": "service",
                            "type": "string",
                            "value": "={{ $json.service }}"
                        },
                        {
                            "id": "b46e44bc-ad01-4cf0-8b07-25eeb1fb5874",
                            "name": "url",
                            "type": "string",
                            "value": "={{ $json.url }}"
                        }
                    ]
                }
            },
            "typeVersion": 3.3
        },
        {
            "id": "6ef5866a-d992-4472-9221-27efbec8e7be",
            "name": "Split Out Chunks",
            "type": "n8n-nodes-base.splitOut",
            "position": [
                5540,
                3740
            ],
            "parameters": {
                "include": "allOtherFields",
                "options": [],
                "fieldToSplitOut": "data"
            },
            "typeVersion": 1
        },
        {
            "id": "5e43b4d8-cebf-43ed-866d-0b4cb2997853",
            "name": "Default Data Loader",
            "type": "@n8n\/n8n-nodes-langchain.documentDefaultDataLoader",
            "position": [
                5800,
                3900
            ],
            "parameters": {
                "options": {
                    "metadata": {
                        "metadataValues": [
                            {
                                "name": "service",
                                "value": "={{ $json.service }}"
                            },
                            {
                                "name": "url",
                                "value": "={{ $json.url }}"
                            }
                        ]
                    }
                },
                "jsonData": "={{ $json.data }}",
                "jsonMode": "expressionData"
            },
            "typeVersion": 1
        },
        {
            "id": "d4b34767-be50-44ee-b778-18842034c276",
            "name": "Set Embedding Variables",
            "type": "n8n-nodes-base.set",
            "position": [
                4980,
                3580
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "4008ae44-7998-4a6f-88c9-686f8b02e92b",
                            "name": "content",
                            "type": "string",
                            "value": "={{ $json.body }}"
                        },
                        {
                            "id": "f7381ac6-ef40-463c-ad2b-df2c31d3e828",
                            "name": "service",
                            "type": "string",
                            "value": "={{ $('EventRouter').first().json.data.service }}"
                        },
                        {
                            "id": "7eae99fd-75c7-4974-a128-641b8ada0cc2",
                            "name": "url",
                            "type": "string",
                            "value": "={{ $json.url }}"
                        }
                    ]
                }
            },
            "typeVersion": 3.4
        },
        {
            "id": "109b6c3a-9b16-40cc-9186-5045df387b52",
            "name": "Execute Workflow Trigger",
            "type": "n8n-nodes-base.executeWorkflowTrigger",
            "position": [
                2420,
                4200
            ],
            "parameters": [],
            "typeVersion": 1
        },
        {
            "id": "31556ff2-6358-4bd4-8ec4-2797d993256e",
            "name": "Execution Data",
            "type": "n8n-nodes-base.executionData",
            "position": [
                2620,
                4200
            ],
            "parameters": {
                "dataToSave": {
                    "values": [
                        {
                            "key": "eventType",
                            "value": "={{ $json.eventType }}"
                        },
                        {
                            "key": "executedById",
                            "value": "={{ $json.executedById }}"
                        },
                        {
                            "key": "service",
                            "value": "={{ $json.data.service }}"
                        }
                    ]
                }
            },
            "typeVersion": 1
        },
        {
            "id": "b65b3d4d-f667-4f8f-a06f-847c3d7b83e0",
            "name": "EventRouter",
            "type": "n8n-nodes-base.switch",
            "position": [
                2800,
                4200
            ],
            "parameters": {
                "rules": {
                    "values": [
                        {
                            "outputKey": "research",
                            "conditions": {
                                "options": {
                                    "version": 2,
                                    "leftValue": "",
                                    "caseSensitive": true,
                                    "typeValidation": "strict"
                                },
                                "combinator": "and",
                                "conditions": [
                                    {
                                        "operator": {
                                            "type": "string",
                                            "operation": "equals"
                                        },
                                        "leftValue": "={{ $json.eventType }}",
                                        "rightValue": "research"
                                    }
                                ]
                            },
                            "renameOutput": true
                        },
                        {
                            "outputKey": "extraction",
                            "conditions": {
                                "options": {
                                    "version": 2,
                                    "leftValue": "",
                                    "caseSensitive": true,
                                    "typeValidation": "strict"
                                },
                                "combinator": "and",
                                "conditions": [
                                    {
                                        "id": "5418515e-ef6a-42e0-aeb9-8d0d35b898ca",
                                        "operator": {
                                            "name": "filter.operator.equals",
                                            "type": "string",
                                            "operation": "equals"
                                        },
                                        "leftValue": "={{ $json.eventType }}",
                                        "rightValue": "extract"
                                    }
                                ]
                            },
                            "renameOutput": true
                        },
                        {
                            "outputKey": "generate",
                            "conditions": {
                                "options": {
                                    "version": 2,
                                    "leftValue": "",
                                    "caseSensitive": true,
                                    "typeValidation": "strict"
                                },
                                "combinator": "and",
                                "conditions": [
                                    {
                                        "id": "0135165e-d211-44f3-92a4-a91858a57d99",
                                        "operator": {
                                            "name": "filter.operator.equals",
                                            "type": "string",
                                            "operation": "equals"
                                        },
                                        "leftValue": "={{ $json.eventType }}",
                                        "rightValue": "generate"
                                    }
                                ]
                            },
                            "renameOutput": true
                        }
                    ]
                },
                "options": []
            },
            "typeVersion": 3.2
        },
        {
            "id": "541f7d9b-c8ff-44dc-8618-8550dbf0b951",
            "name": "Google Gemini Chat Model",
            "type": "@n8n\/n8n-nodes-langchain.lmChatGoogleGemini",
            "position": [
                4460,
                3740
            ],
            "parameters": {
                "options": [],
                "modelName": "models\/gemini-1.5-flash-latest"
            },
            "typeVersion": 1
        },
        {
            "id": "617d6139-8417-4ecb-8f7c-558cd1c38ac3",
            "name": "Successful Runs",
            "type": "n8n-nodes-base.filter",
            "position": [
                4100,
                3720
            ],
            "parameters": {
                "options": [],
                "conditions": {
                    "options": {
                        "version": 2,
                        "leftValue": "",
                        "caseSensitive": true,
                        "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                        {
                            "id": "cac77cce-0a5c-469e-ba80-9fb026f04b18",
                            "operator": {
                                "type": "string",
                                "operation": "exists",
                                "singleValue": true
                            },
                            "leftValue": "={{ $json.body }}",
                            "rightValue": ""
                        }
                    ]
                }
            },
            "typeVersion": 2.2,
            "alwaysOutputData": true
        },
        {
            "id": "1115db69-b414-46cd-a9a1-565ae98cbd91",
            "name": "For Each Document...",
            "type": "n8n-nodes-base.splitInBatches",
            "position": [
                5180,
                3580
            ],
            "parameters": {
                "options": []
            },
            "typeVersion": 3
        },
        {
            "id": "3f0e3764-2479-4d74-aca8-c3e830eac423",
            "name": "Embeddings Google Gemini",
            "type": "@n8n\/n8n-nodes-langchain.embeddingsGoogleGemini",
            "position": [
                5680,
                3900
            ],
            "parameters": {
                "modelName": "models\/text-embedding-004"
            },
            "typeVersion": 1
        },
        {
            "id": "87d42766-d1a2-406d-b01c-044fd2fc8910",
            "name": "Has API Documentation?",
            "type": "@n8n\/n8n-nodes-langchain.textClassifier",
            "position": [
                4460,
                3580
            ],
            "parameters": {
                "options": {
                    "fallback": "discard"
                },
                "inputText": "={{\n$json.body\n  .replaceAll('\\n', '')\n  .substring(0, 40000)\n}}",
                "categories": {
                    "categories": [
                        {
                            "category": "contains_api_schema_documentation",
                            "description": "True if this document contains REST API schema documentation or definitions"
                        }
                    ]
                }
            },
            "typeVersion": 1,
            "alwaysOutputData": true
        },
        {
            "id": "55939b49-d91c-42a1-9770-48cbe4008c9a",
            "name": "Store Document Embeddings",
            "type": "@n8n\/n8n-nodes-langchain.vectorStoreQdrant",
            "position": [
                5700,
                3740
            ],
            "parameters": {
                "mode": "insert",
                "options": [],
                "qdrantCollection": {
                    "__rl": true,
                    "mode": "id",
                    "value": "={{ $('EventRouter').first().json.data.collection }}"
                }
            },
            "typeVersion": 1
        },
        {
            "id": "3e1da749-b8b9-42cb-818b-eabf4b114abb",
            "name": "Embeddings Google Gemini1",
            "type": "@n8n\/n8n-nodes-langchain.embeddingsGoogleGemini",
            "position": [
                3700,
                4520
            ],
            "parameters": {
                "modelName": "models\/text-embedding-004"
            },
            "typeVersion": 1
        },
        {
            "id": "be0906d4-351f-4b3b-9f32-8e5ee68083c5",
            "name": "Google Gemini Chat Model1",
            "type": "@n8n\/n8n-nodes-langchain.lmChatGoogleGemini",
            "position": [
                4600,
                4240
            ],
            "parameters": {
                "options": [],
                "modelName": "models\/gemini-1.5-pro-002"
            },
            "typeVersion": 1
        },
        {
            "id": "886415d5-c888-4b97-9fb5-02e6a14df4cc",
            "name": "Extract API Operations",
            "type": "@n8n\/n8n-nodes-langchain.informationExtractor",
            "position": [
                4600,
                4100
            ],
            "parameters": {
                "text": "={{ $json.documents }}",
                "options": {
                    "systemPromptTemplate": "=You have been given an extract of a webpage which should contain a list of web\/REST api operations.\nStep 1. Extract all REST (eg. GET,POST,PUT,DELETE) API operation endpoints from the page content and generate appropriate labels for the resource, operation, description, method for each.\n* \"resource\" refers to the API group, for example: \"\/v1\/api\/indicators\/list\" and \"\/v1\/api\/indicators\/create\" will both have the resource name of \"indicators\". Use the following template \"<domain>\" eg. \"entities\", \"posts\", \"credentials\".\n* \"operation\" refers to the action performed, use the following template \"<verb> <entity>\" eg. \"List entities\", \"Create post\", \"Update credentials\"\n* only use one HTTP verb for \"method\"\n* \"description\" should be limited to one sentence.\n* Examples of API urls: \"\/api\/\", \"\/api\/v1\/\", \"\/v1\/api\". API urls should not end with \"htm\" or html\".\n* Extract a maximum of 15 endpoints.\n* If the page content contains no api operations, return an empty array."
                },
                "schemaType": "manual",
                "inputSchema": "{\n  \"type\": \"array\",\n  \"items\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"resource\": { \"type\": \"string\" },\n      \"operation\": { \"type\": \"string\" },\n      \"description\": { \"type\": \"string\" },\n      \"url\": { \"type\": \"string\" },\n      \"method\": { \"type\": \"string\" },\n      \"documentation_url\": { \"type\": \"string\" }\n    }\n  }\n}"
            },
            "typeVersion": 1
        },
        {
            "id": "76470e34-7c1f-44ce-81e2-047dcca3fa32",
            "name": "Search in Relevant Docs",
            "type": "@n8n\/n8n-nodes-langchain.vectorStoreQdrant",
            "position": [
                3700,
                4380
            ],
            "parameters": {
                "mode": "load",
                "topK": 5,
                "prompt": "={{ $json.query }}",
                "options": {
                    "searchFilterJson": "={{\n{\n  \"must\": [\n    {\n      \"key\": \"metadata.service\",\n      \"match\": {\n        \"value\": $('EventRouter').first().json.data.service\n      }\n    }\n  ]\n}\n}}"
                },
                "qdrantCollection": {
                    "__rl": true,
                    "mode": "id",
                    "value": "={{ $('EventRouter').first().json.data.collection }}"
                }
            },
            "typeVersion": 1
        },
        {
            "id": "49ca6a35-5b89-4ed5-bbab-250e09b4222f",
            "name": "Wait",
            "type": "n8n-nodes-base.wait",
            "position": [
                3780,
                3160
            ],
            "webhookId": "e9ad3ef0-7403-4e65-b0a4-4afdfb0cbc6d",
            "parameters": {
                "amount": 0
            },
            "typeVersion": 1.1
        },
        {
            "id": "800cb05b-f5d1-47c8-869e-921915929f34",
            "name": "Remove Dupes",
            "type": "n8n-nodes-base.removeDuplicates",
            "position": [
                3780,
                3720
            ],
            "parameters": {
                "compare": "selectedFields",
                "options": [],
                "fieldsToCompare": "source.link"
            },
            "typeVersion": 2
        },
        {
            "id": "d8203c40-aa0b-44b9-8dfd-aea250c8d109",
            "name": "Filter Results",
            "type": "n8n-nodes-base.filter",
            "position": [
                3620,
                3720
            ],
            "parameters": {
                "options": [],
                "conditions": {
                    "options": {
                        "version": 2,
                        "leftValue": "",
                        "caseSensitive": true,
                        "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                        {
                            "id": "42872456-411b-4d86-a9dd-b907d001ea1c",
                            "operator": {
                                "name": "filter.operator.equals",
                                "type": "string",
                                "operation": "equals"
                            },
                            "leftValue": "={{ $json.type }}",
                            "rightValue": "normal"
                        }
                    ]
                }
            },
            "typeVersion": 2.2
        },
        {
            "id": "5714dc09-fd67-4285-9434-ac97cd80dec1",
            "name": "Research",
            "type": "n8n-nodes-base.executeWorkflow",
            "onError": "continueErrorOutput",
            "position": [
                3460,
                2980
            ],
            "parameters": {
                "mode": "each",
                "options": {
                    "waitForSubWorkflow": true
                },
                "workflowId": {
                    "__rl": true,
                    "mode": "id",
                    "value": "={{ $workflow.id }}"
                }
            },
            "typeVersion": 1.1
        },
        {
            "id": "2a2d3271-b0b6-4a1a-94e1-9b01399ba88f",
            "name": "Has Results?",
            "type": "n8n-nodes-base.if",
            "position": [
                3280,
                3820
            ],
            "parameters": {
                "options": [],
                "conditions": {
                    "options": {
                        "version": 2,
                        "leftValue": "",
                        "caseSensitive": true,
                        "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                        {
                            "id": "1223d607-45a8-44b1-b510-56fdbe013eba",
                            "operator": {
                                "type": "array",
                                "operation": "exists",
                                "singleValue": true
                            },
                            "leftValue": "={{ $jmespath($json, 'origin_search.results') }}",
                            "rightValue": ""
                        }
                    ]
                }
            },
            "typeVersion": 2.2
        },
        {
            "id": "b953082c-2d37-4549-80a7-d60535b8580e",
            "name": "Response Empty",
            "type": "n8n-nodes-base.set",
            "position": [
                3460,
                3900
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "5bb23ce9-eb72-4868-9344-9e5d3952cc52",
                            "name": "response",
                            "type": "string",
                            "value": "no web results"
                        }
                    ]
                }
            },
            "executeOnce": true,
            "typeVersion": 3.4
        },
        {
            "id": "41e9c328-d145-4b71-93bb-e2c448a14be0",
            "name": "Response OK",
            "type": "n8n-nodes-base.set",
            "position": [
                5380,
                3580
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "79598789-4468-4565-828f-fedc48be15c3",
                            "name": "response",
                            "type": "string",
                            "value": "ok"
                        }
                    ]
                }
            },
            "executeOnce": true,
            "typeVersion": 3.4
        },
        {
            "id": "5d0a7556-def9-4c70-8828-40b4d22904de",
            "name": "Combine Docs",
            "type": "n8n-nodes-base.aggregate",
            "position": [
                4020,
                4380
            ],
            "parameters": {
                "options": [],
                "aggregate": "aggregateAllItemData"
            },
            "typeVersion": 1
        },
        {
            "id": "39bd90b4-e0f5-49b0-b4a7-55a3ae8eccb2",
            "name": "Template to List",
            "type": "n8n-nodes-base.splitOut",
            "position": [
                3280,
                4200
            ],
            "parameters": {
                "options": {
                    "destinationFieldName": "query"
                },
                "fieldToSplitOut": "queries"
            },
            "typeVersion": 1
        },
        {
            "id": "51a1da10-5ad0-4bac-9bec-55b5af3da702",
            "name": "Query Templates",
            "type": "n8n-nodes-base.set",
            "position": [
                3100,
                4200
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "e2a02550-8f53-4f8d-bb83-68ee3606736e",
                            "name": "queries",
                            "type": "array",
                            "value": "=[\n\"What are the core functionalities, essential features, or primary use cases of {{ $json.data.service }}?\",\n\"Is there an API overview or API categories for {{ $json.data.service }}? What main APIs are listed or mentioned?\",\n\"What industry does  {{ $json.data.service }} operate in? What is the most important of the services in the industry? Return the important service as the function.\",\n\"What REST apis (GET, POST, DELETE, PATCH) and\/or operations can you identify for {{ $json.data.service }}?\",\n\"Does {{ $json.data.service }} have any CURL examples? If you can, identify one such example and explain what it does.\"\n]"
                        }
                    ]
                }
            },
            "executeOnce": true,
            "typeVersion": 3.3
        },
        {
            "id": "414091b7-114b-4fc3-9755-2f87cfef239e",
            "name": "Google Gemini Chat Model2",
            "type": "@n8n\/n8n-nodes-langchain.lmChatGoogleGemini",
            "position": [
                3700,
                4240
            ],
            "parameters": {
                "options": [],
                "modelName": "models\/gemini-1.5-pro-002"
            },
            "typeVersion": 1
        },
        {
            "id": "1f0f45ff-3bc9-4786-92e1-319244d020c0",
            "name": "For Each Template...",
            "type": "n8n-nodes-base.splitInBatches",
            "position": [
                3460,
                4200
            ],
            "parameters": {
                "options": []
            },
            "typeVersion": 3
        },
        {
            "id": "2e577e62-7f89-4c99-b540-ce8c44f19a55",
            "name": "Query & Docs",
            "type": "n8n-nodes-base.set",
            "position": [
                4180,
                4380
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "fdaea3de-3c9a-4f26-b7dc-769e534006a9",
                            "name": "query",
                            "type": "string",
                            "value": "={{ $('For Each Template...').item.json.query }}"
                        },
                        {
                            "id": "88198374-d2f9-4ae7-b262-d3b2e630e0ac",
                            "name": "documents",
                            "type": "string",
                            "value": "={{ $json.data.map(item => item.document.pageContent.replaceAll('\\n', ' ')).join('\\n---\\n') }}"
                        }
                    ]
                }
            },
            "typeVersion": 3.4
        },
        {
            "id": "548d51fd-9740-4b4c-9c81-db62d2b31053",
            "name": "Identify Service Products",
            "type": "@n8n\/n8n-nodes-langchain.informationExtractor",
            "position": [
                3700,
                4100
            ],
            "parameters": {
                "text": "={{ $json.query }}",
                "options": {
                    "systemPromptTemplate": "=Use the following document to answer the user's question:\n```\n{{ $json.documents.replace(\/[\\{\\}]\/g, '') }}\n```"
                },
                "attributes": {
                    "attributes": [
                        {
                            "name": "product_or_solution",
                            "required": true,
                            "description": "A product or solution offered by the service"
                        },
                        {
                            "name": "description",
                            "required": true,
                            "description": "description of what the product or solution of the service does"
                        }
                    ]
                }
            },
            "typeVersion": 1
        },
        {
            "id": "aa7041e9-4ac8-47f9-b98e-cf57873922bb",
            "name": "Extract API Templates",
            "type": "n8n-nodes-base.set",
            "position": [
                4180,
                4200
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "e2a02550-8f53-4f8d-bb83-68ee3606736e",
                            "name": "query",
                            "type": "string",
                            "value": "=I'm interested in {{ $json.output.product_or_solution }} apis which {{ $json.output.description }} What are the GET, POST, PATCH and\/or DELETE endpoints of the {{ $json.output.product_or_solution }} api?"
                        }
                    ]
                }
            },
            "typeVersion": 3.3
        },
        {
            "id": "e2b371c1-52af-4e57-877c-6933ba84e2d5",
            "name": "Embeddings Google Gemini2",
            "type": "@n8n\/n8n-nodes-langchain.embeddingsGoogleGemini",
            "position": [
                4600,
                4520
            ],
            "parameters": {
                "modelName": "models\/text-embedding-004"
            },
            "typeVersion": 1
        },
        {
            "id": "d808c591-34e2-455f-96b1-3689d950608d",
            "name": "Search in Relevant Docs1",
            "type": "@n8n\/n8n-nodes-langchain.vectorStoreQdrant",
            "position": [
                4600,
                4380
            ],
            "parameters": {
                "mode": "load",
                "topK": 20,
                "prompt": "={{ $json.query }}",
                "options": {
                    "searchFilterJson": "={{\n{\n  \"must\": [\n    {\n      \"key\": \"metadata.service\",\n      \"match\": {\n        \"value\": $('EventRouter').first().json.data.service\n      }\n    }\n  ]\n}\n}}"
                },
                "qdrantCollection": {
                    "__rl": true,
                    "mode": "id",
                    "value": "={{ $('EventRouter').first().json.data.collection }}"
                }
            },
            "typeVersion": 1
        },
        {
            "id": "222bde31-57fa-46c4-a23b-ec2d1b3c7e2d",
            "name": "Combine Docs1",
            "type": "n8n-nodes-base.aggregate",
            "position": [
                4920,
                4380
            ],
            "parameters": {
                "options": [],
                "aggregate": "aggregateAllItemData"
            },
            "typeVersion": 1
        },
        {
            "id": "57677d83-a79a-4b71-9977-ee2324f5d593",
            "name": "Query & Docs1",
            "type": "n8n-nodes-base.set",
            "position": [
                5080,
                4380
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "fdaea3de-3c9a-4f26-b7dc-769e534006a9",
                            "name": "query",
                            "type": "string",
                            "value": "={{ $('For Each Template...1').item.json.query }}"
                        },
                        {
                            "id": "88198374-d2f9-4ae7-b262-d3b2e630e0ac",
                            "name": "documents",
                            "type": "string",
                            "value": "={{\n$json.data\n  .map(item =>\n`url: ${item.document.metadata.url}\ncontent: ${item.document.pageContent}`\n  )\n  .join('\\n---\\n')\n  .replaceAll('\\n\\n', '\\n')\n}}"
                        }
                    ]
                }
            },
            "typeVersion": 3.4
        },
        {
            "id": "124c3b07-3210-4190-8865-e18017fc9e6c",
            "name": "For Each Template...1",
            "type": "n8n-nodes-base.splitInBatches",
            "position": [
                4380,
                4200
            ],
            "parameters": {
                "options": []
            },
            "typeVersion": 3
        },
        {
            "id": "8ea4a5da-c471-4201-a08b-9c18ed08ddc7",
            "name": "Merge Lists",
            "type": "n8n-nodes-base.code",
            "position": [
                4920,
                4200
            ],
            "parameters": {
                "jsCode": "return $input.all().flatMap(input => input.json.output) || [];"
            },
            "typeVersion": 2,
            "alwaysOutputData": true
        },
        {
            "id": "0e38cd3c-c843-4f6d-bdb6-901a8c12acbf",
            "name": "Remove Duplicates",
            "type": "n8n-nodes-base.removeDuplicates",
            "position": [
                5280,
                4200
            ],
            "parameters": {
                "compare": "selectedFields",
                "options": [],
                "fieldsToCompare": "method, url"
            },
            "typeVersion": 2
        },
        {
            "id": "8f127f7a-e351-4b30-82dd-1f785be4a765",
            "name": "Append Row",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                5440,
                4200
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "url": "={{ $json.url }}",
                        "method": "={{ $json.method }}",
                        "service": "={{ $('EventRouter').first().json.data.service }}",
                        "resource": "={{ $json.resource }}",
                        "operation": "={{ $json.operation }}",
                        "description": "={{ $json.description }}",
                        "documentation_url": "={{ $json.documentation_url }}"
                    },
                    "schema": [
                        {
                            "id": "service",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "service",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "resource",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "resource",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "operation",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "operation",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "description",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "description",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "url",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "url",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "method",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "method",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "documentation_url",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "documentation_url",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": []
                },
                "options": {
                    "useAppend": true
                },
                "operation": "append",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": 1042334767,
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=1042334767",
                    "cachedResultName": "Extracted API Operations"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "d9f490e2-320e-4dc1-af8f-ac7f6a61568d",
            "name": "Response OK1",
            "type": "n8n-nodes-base.set",
            "position": [
                5600,
                4200
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "79598789-4468-4565-828f-fedc48be15c3",
                            "name": "response",
                            "type": "string",
                            "value": "ok"
                        }
                    ]
                }
            },
            "executeOnce": true,
            "typeVersion": 3.4
        },
        {
            "id": "7780b6ee-0fde-40bb-aef6-e67b883645e1",
            "name": "Has Operations?",
            "type": "n8n-nodes-base.if",
            "position": [
                5080,
                4200
            ],
            "parameters": {
                "options": [],
                "conditions": {
                    "options": {
                        "version": 2,
                        "leftValue": "",
                        "caseSensitive": true,
                        "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                        {
                            "id": "a95420a7-6265-4ea3-9c01-82c2d7aeb4f8",
                            "operator": {
                                "type": "object",
                                "operation": "notEmpty",
                                "singleValue": true
                            },
                            "leftValue": "={{ $input.first().json }}",
                            "rightValue": ""
                        }
                    ]
                }
            },
            "typeVersion": 2.2
        },
        {
            "id": "6589673d-984d-4a1e-a655-1bc19d2b154e",
            "name": "Response Empty1",
            "type": "n8n-nodes-base.set",
            "position": [
                5280,
                4380
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "5bb23ce9-eb72-4868-9344-9e5d3952cc52",
                            "name": "response",
                            "type": "string",
                            "value": "no api operations found"
                        }
                    ]
                }
            },
            "executeOnce": true,
            "typeVersion": 3.4
        },
        {
            "id": "c5dc3eac-a3a5-481d-a8bc-8b653d88143d",
            "name": "Research Pending",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                3180,
                2980
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "row_number": "={{ $('For Each Research...').item.json.row_number }}",
                        "Stage 1 - Research": "=pending"
                    },
                    "schema": [
                        {
                            "id": "Service",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Service",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Website",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Website",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 1 - Research",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "Stage 1 - Research",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 2 - Extraction",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 2 - Extraction",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 3 - Output File",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 3 - Output File",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "row_number"
                    ]
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "39bceadb-6c3b-4b52-82b9-bdcecd9a164a",
            "name": "Research Result",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                3620,
                2980
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "row_number": "={{ $('For Each Research...').item.json.row_number }}",
                        "Stage 1 - Research": "={{ $json.response }}"
                    },
                    "schema": [
                        {
                            "id": "Service",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Service",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Website",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Website",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 1 - Research",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "Stage 1 - Research",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 2 - Extraction",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 2 - Extraction",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 3 - Output File",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 3 - Output File",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "row_number"
                    ]
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "0bd07f31-1c51-45aa-8316-b658aa214293",
            "name": "Research Error",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                3620,
                3160
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "row_number": "={{ $('For Each Research...').item.json.row_number }}",
                        "Stage 1 - Research": "=error"
                    },
                    "schema": [
                        {
                            "id": "Service",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Service",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Website",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Website",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 1 - Research",
                            "type": "string",
                            "display": true,
                            "required": false,
                            "displayName": "Stage 1 - Research",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 2 - Extraction",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 2 - Extraction",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 3 - Output File",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 3 - Output File",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "row_number"
                    ]
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "0385784f-95ef-46c3-82c4-50fcf7146736",
            "name": "Extract Pending",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                4160,
                2980
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "row_number": "={{ $('For Each Extract...').item.json.row_number }}",
                        "Stage 2 - Extraction": "pending"
                    },
                    "schema": [
                        {
                            "id": "Service",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Service",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Website",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Website",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 1 - Research",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 1 - Research",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 2 - Extraction",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Stage 2 - Extraction",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 3 - Output File",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 3 - Output File",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "row_number"
                    ]
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "executeOnce": false,
            "typeVersion": 4.5
        },
        {
            "id": "21c1e982-25a6-4a00-b8d3-6c299c452106",
            "name": "Research Event",
            "type": "n8n-nodes-base.set",
            "position": [
                3320,
                2980
            ],
            "parameters": {
                "mode": "raw",
                "options": [],
                "jsonOutput": "={{\n{\n  \"eventType\": \"research\",\n  \"createdAt\": $now.toISO(),\n  \"executedById\": $execution.id,\n  \"data\": {\n    \"row_number\": $('For Each Research...').item.json.row_number,\n    \"service\": $('For Each Research...').item.json.Service,\n    \"url\": $('For Each Research...').item.json.Website,\n    \"collection\": \"api_schema_crawler_and_extractor\"\n  }\n}\n}}"
            },
            "typeVersion": 3.4
        },
        {
            "id": "c83f99f1-e28f-4c15-aff8-da25bb5dfe3b",
            "name": "Extract Event",
            "type": "n8n-nodes-base.set",
            "position": [
                4300,
                2980
            ],
            "parameters": {
                "mode": "raw",
                "options": [],
                "jsonOutput": "={{\n{\n  \"eventType\": \"extract\",\n  \"createdAt\": $now.toISO(),\n  \"executedById\": $execution.id,\n  \"data\": {\n    \"row_number\": $('For Each Extract...').item.json.row_number,\n    \"service\": $('For Each Extract...').item.json.Service,\n    \"url\": $('For Each Extract...').item.json.Website,\n    \"collection\": \"api_schema_crawler_and_extractor\"\n  }\n}\n}}"
            },
            "typeVersion": 3.4
        },
        {
            "id": "88c3caec-75f7-47a1-9b50-1246c457c2b4",
            "name": "Extract",
            "type": "n8n-nodes-base.executeWorkflow",
            "onError": "continueErrorOutput",
            "position": [
                4440,
                2980
            ],
            "parameters": {
                "mode": "each",
                "options": {
                    "waitForSubWorkflow": true
                },
                "workflowId": {
                    "__rl": true,
                    "mode": "id",
                    "value": "={{ $workflow.id }}"
                }
            },
            "typeVersion": 1.1
        },
        {
            "id": "2342b7ff-b00d-439a-a859-63fd0a6bac3a",
            "name": "Extract Result",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                4600,
                2980
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "row_number": "={{ $('For Each Extract...').item.json.row_number }}",
                        "Stage 2 - Extraction": "={{ $json.response }}"
                    },
                    "schema": [
                        {
                            "id": "Service",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Service",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Website",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Website",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 1 - Research",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 1 - Research",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 2 - Extraction",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Stage 2 - Extraction",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 3 - Output File",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 3 - Output File",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "row_number"
                    ]
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "d4c423c9-1d6a-4a69-9302-92ec79734d61",
            "name": "Extract Error",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                4600,
                3160
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "row_number": "={{ $('For Each Extract...').item.json.row_number }}",
                        "Stage 2 - Extraction": "error"
                    },
                    "schema": [
                        {
                            "id": "Service",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Service",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Website",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Website",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 1 - Research",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 1 - Research",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 2 - Extraction",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Stage 2 - Extraction",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 3 - Output File",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 3 - Output File",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "row_number"
                    ]
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "f64254d6-4493-4aaf-8160-35e8ff4fdc34",
            "name": "Get API Operations",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                3100,
                4740
            ],
            "parameters": {
                "options": [],
                "filtersUI": {
                    "values": [
                        {
                            "lookupValue": "={{ $json.data.service }}",
                            "lookupColumn": "service"
                        }
                    ]
                },
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": 1042334767,
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=1042334767",
                    "cachedResultName": "Extracted API Operations"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "fa748b63-3d2b-4cf3-b1fb-1bd953e5054b",
            "name": "Contruct JSON Schema",
            "type": "n8n-nodes-base.code",
            "position": [
                3280,
                4740
            ],
            "parameters": {
                "jsCode": "const service = {\n  documentation_url: $('EventRouter').first().json.data.url,\n  endpoints: [],\n};\n\nconst resources = Array.from(new Set($input.all().map(item => item.json.resource.toLowerCase().trim())));\n\nfor (const resource of resources) {\n  const resourceLabel = resource.replace('api', '').trim();\n  if (!resourceLabel) continue;\n  const endpoint = {\n    resource: resourceLabel[0].toUpperCase() + resourceLabel.substring(1, resourceLabel.length)\n  };\n  const operations = $input.all()\n    .filter(item => item.json.resource.toLowerCase().trim() === resource)\n    .map(item => item.json);\n  endpoint.operations = operations.map(op => ({\n    \"operation\": op.operation[0].toUpperCase() + op.operation.substring(1, op.operation.length),\n    \"description\": op.description.match(\/(^[^\\.]+.)\/)[0],\n    \"ApiUrl\": op.url,\n    \"method\": op.method.toUpperCase(),\n    \"method_documentation_url\": op.documentation_url || ''\n  }));\n  service.endpoints.push(endpoint);\n}\n\nreturn service;"
            },
            "typeVersion": 2
        },
        {
            "id": "e60b7ccb-baa2-4095-8425-0e20bcdbfdd2",
            "name": "Upload to Drive",
            "type": "n8n-nodes-base.googleDrive",
            "position": [
                3640,
                4740
            ],
            "parameters": {
                "name": "={{ $json.filename }}",
                "content": "={{ $json.data }}",
                "driveId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "My Drive"
                },
                "options": [],
                "folderId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "149rBJYv9RKQx-vQO2qKUGfUzxk_J4lfw",
                    "cachedResultUrl": "https:\/\/drive.google.com\/drive\/folders\/149rBJYv9RKQx-vQO2qKUGfUzxk_J4lfw",
                    "cachedResultName": "63. API Schema Extractor Remake"
                },
                "operation": "createFromText"
            },
            "typeVersion": 3
        },
        {
            "id": "f90546e6-3610-4198-87fc-96d7e2b6bc57",
            "name": "Set Upload Fields",
            "type": "n8n-nodes-base.set",
            "position": [
                3460,
                4740
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "3c7d4946-c385-4aff-93ec-ae0850964099",
                            "name": "filename",
                            "type": "string",
                            "value": "={{\n  $('EventRouter').first().json.data.service\n    .replace(\/\\W+\/, '_')\n    .toLowerCase()\n}}_api_operations_{{ $now.format('yyyyMMddhhmmss') }}.json"
                        },
                        {
                            "id": "4a7a9fae-7267-4ef6-ae33-ac4cd9777ee9",
                            "name": "data",
                            "type": "string",
                            "value": "={{ JSON.stringify($json, null, 4) }}"
                        }
                    ]
                }
            },
            "typeVersion": 3.4
        },
        {
            "id": "c814b48d-2005-4150-a481-956f0b9506a5",
            "name": "Response OK2",
            "type": "n8n-nodes-base.set",
            "position": [
                3820,
                4740
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "79598789-4468-4565-828f-fedc48be15c3",
                            "name": "response",
                            "type": "object",
                            "value": "={{\n({\n  id: $json.id,\n  filename: $('Set Upload Fields').item.json.filename\n}).toJsonString()\n}}"
                        }
                    ]
                }
            },
            "executeOnce": true,
            "typeVersion": 3.4
        },
        {
            "id": "4b1efa99-e8c8-49f5-8db8-916b8dde838d",
            "name": "Generate Event",
            "type": "n8n-nodes-base.set",
            "position": [
                5300,
                2980
            ],
            "parameters": {
                "mode": "raw",
                "options": [],
                "jsonOutput": "={{\n{\n  \"eventType\": \"generate\",\n  \"createdAt\": $now.toISO(),\n  \"executedById\": $execution.id,\n  \"data\": {\n    \"row_number\": $('For Each Generate...').item.json.row_number,\n    \"service\": $('For Each Generate...').item.json.Service,\n    \"url\": $('For Each Generate...').item.json.Website,\n    \"collection\": \"api_schema_crawler_and_extractor\"\n  }\n}\n}}"
            },
            "typeVersion": 3.4
        },
        {
            "id": "49b82a1a-d51e-4caf-b7ab-8d27d0585b60",
            "name": "Generate Pending",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                5160,
                2980
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "row_number": "={{ $('For Each Generate...').item.json.row_number }}",
                        "Stage 3 - Output File": "pending"
                    },
                    "schema": [
                        {
                            "id": "Service",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Service",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Website",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Website",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 1 - Research",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 1 - Research",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 2 - Extraction",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 2 - Extraction",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 3 - Output File",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Stage 3 - Output File",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "row_number"
                    ]
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "executeOnce": false,
            "typeVersion": 4.5
        },
        {
            "id": "7d1a937c-49cc-40d7-b2ca-d315c5efca93",
            "name": "Generate",
            "type": "n8n-nodes-base.executeWorkflow",
            "onError": "continueErrorOutput",
            "position": [
                5440,
                2980
            ],
            "parameters": {
                "mode": "each",
                "options": {
                    "waitForSubWorkflow": true
                },
                "workflowId": {
                    "__rl": true,
                    "mode": "id",
                    "value": "={{ $workflow.id }}"
                }
            },
            "typeVersion": 1.1
        },
        {
            "id": "f35d843d-6c40-4725-b73f-8ca1a8e219bb",
            "name": "Generate Error",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                5600,
                3160
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "row_number": "={{ $('For Each Generate...').item.json.row_number }}",
                        "Stage 3 - Output File": "error"
                    },
                    "schema": [
                        {
                            "id": "Service",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Service",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Website",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Website",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 1 - Research",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 1 - Research",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 2 - Extraction",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 2 - Extraction",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 3 - Output File",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Stage 3 - Output File",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "row_number"
                    ]
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "e2f1f8e8-6852-4f19-98ec-85d9bd42729c",
            "name": "Generate Result",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                5600,
                2980
            ],
            "parameters": {
                "columns": {
                    "value": {
                        "row_number": "={{ $('For Each Generate...').item.json.row_number }}",
                        "Output Destination": "={{ $json.response.filename }}",
                        "Stage 3 - Output File": "ok"
                    },
                    "schema": [
                        {
                            "id": "Service",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Service",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Website",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Website",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 1 - Research",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 1 - Research",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 2 - Extraction",
                            "type": "string",
                            "display": true,
                            "removed": true,
                            "required": false,
                            "displayName": "Stage 2 - Extraction",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Stage 3 - Output File",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Stage 3 - Output File",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "Output Destination",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "required": false,
                            "displayName": "Output Destination",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        },
                        {
                            "id": "row_number",
                            "type": "string",
                            "display": true,
                            "removed": false,
                            "readOnly": true,
                            "required": false,
                            "displayName": "row_number",
                            "defaultMatch": false,
                            "canBeUsedToMatch": true
                        }
                    ],
                    "mappingMode": "defineBelow",
                    "matchingColumns": [
                        "row_number"
                    ]
                },
                "options": [],
                "operation": "update",
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "typeVersion": 4.5
        },
        {
            "id": "00c5b05b-fd70-4d58-8fc6-4e9b8d689a43",
            "name": "Get All Extract",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                3620,
                2820
            ],
            "parameters": {
                "options": [],
                "filtersUI": {
                    "values": [
                        {
                            "lookupValue": "=ok",
                            "lookupColumn": "Stage 1 - Research"
                        },
                        {
                            "lookupValue": "={{ \"\" }}",
                            "lookupColumn": "Stage 2 - Extraction"
                        }
                    ]
                },
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "executeOnce": true,
            "typeVersion": 4.5,
            "alwaysOutputData": true
        },
        {
            "id": "c477ea01-028d-4e69-b772-adb8c03d1522",
            "name": "Get All Research",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                2640,
                2820
            ],
            "parameters": {
                "options": [],
                "filtersUI": {
                    "values": [
                        {
                            "lookupValue": "={{ \"\" }}",
                            "lookupColumn": "Stage 1 - Research"
                        }
                    ]
                },
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "credentials": {
                "googleSheetsOAuth2Api": {
                    "id": "aALuyzBGGfmdBzrU",
                    "name": "Google Sheets account 2"
                }
            },
            "typeVersion": 4.5,
            "alwaysOutputData": true
        },
        {
            "id": "60ba84c1-40cf-492f-bf52-c9edf5925646",
            "name": "For Each Research...",
            "type": "n8n-nodes-base.splitInBatches",
            "position": [
                3020,
                2820
            ],
            "parameters": {
                "options": []
            },
            "typeVersion": 3
        },
        {
            "id": "5365cd1a-c7f8-40fb-84b3-9e5306ecf462",
            "name": "For Each Extract...",
            "type": "n8n-nodes-base.splitInBatches",
            "position": [
                4000,
                2820
            ],
            "parameters": {
                "options": []
            },
            "typeVersion": 3
        },
        {
            "id": "d7a0743f-5f83-4c9b-b11c-85e2df3a4ecc",
            "name": "Wait1",
            "type": "n8n-nodes-base.wait",
            "position": [
                4780,
                3160
            ],
            "webhookId": "e9ad3ef0-7403-4e65-b0a4-4afdfb0cbc6d",
            "parameters": {
                "amount": 0
            },
            "typeVersion": 1.1
        },
        {
            "id": "ec09ac70-5e05-463c-9d30-027e691a36b4",
            "name": "All Research Done?",
            "type": "n8n-nodes-base.if",
            "position": [
                2800,
                2820
            ],
            "parameters": {
                "options": [],
                "conditions": {
                    "options": {
                        "version": 2,
                        "leftValue": "",
                        "caseSensitive": true,
                        "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                        {
                            "id": "8d4b0159-af18-445e-a9ee-bd7952d8e0bd",
                            "operator": {
                                "type": "object",
                                "operation": "empty",
                                "singleValue": true
                            },
                            "leftValue": "={{ $input.first().json }}",
                            "rightValue": ""
                        }
                    ]
                }
            },
            "typeVersion": 2.2
        },
        {
            "id": "cd892e11-b4de-42f1-bab9-4bd783494c8a",
            "name": "All Extract Done?",
            "type": "n8n-nodes-base.if",
            "position": [
                3780,
                2820
            ],
            "parameters": {
                "options": [],
                "conditions": {
                    "options": {
                        "version": 2,
                        "leftValue": "",
                        "caseSensitive": true,
                        "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                        {
                            "id": "8d4b0159-af18-445e-a9ee-bd7952d8e0bd",
                            "operator": {
                                "type": "object",
                                "operation": "empty",
                                "singleValue": true
                            },
                            "leftValue": "={{ $input.first().json }}",
                            "rightValue": ""
                        }
                    ]
                }
            },
            "typeVersion": 2.2
        },
        {
            "id": "426091fb-d0eb-4589-8f2f-2bbeb9174cfc",
            "name": "Get All Generate",
            "type": "n8n-nodes-base.googleSheets",
            "position": [
                4600,
                2820
            ],
            "parameters": {
                "options": [],
                "filtersUI": {
                    "values": [
                        {
                            "lookupValue": "=ok",
                            "lookupColumn": "Stage 1 - Research"
                        },
                        {
                            "lookupValue": "=ok",
                            "lookupColumn": "Stage 2 - Extraction"
                        },
                        {
                            "lookupValue": "={{ \"\" }}",
                            "lookupColumn": "Stage 3 - Output File"
                        }
                    ]
                },
                "sheetName": {
                    "__rl": true,
                    "mode": "list",
                    "value": "gid=0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit#gid=0",
                    "cachedResultName": "Sheet1"
                },
                "documentId": {
                    "__rl": true,
                    "mode": "list",
                    "value": "1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0",
                    "cachedResultUrl": "https:\/\/docs.google.com\/spreadsheets\/d\/1l59ikBvEwPNSWIm2k6KRMFPTNImJPYqs9bzGT5dUiU0\/edit?usp=drivesdk",
                    "cachedResultName": "API Schema Crawler & Extractor"
                }
            },
            "executeOnce": true,
            "typeVersion": 4.5
        },
        {
            "id": "01e91cf6-5bd5-4891-ba1f-95176e444fe6",
            "name": "All Generate Done?",
            "type": "n8n-nodes-base.if",
            "position": [
                4780,
                2820
            ],
            "parameters": {
                "options": [],
                "conditions": {
                    "options": {
                        "version": 2,
                        "leftValue": "",
                        "caseSensitive": true,
                        "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                        {
                            "id": "8d4b0159-af18-445e-a9ee-bd7952d8e0bd",
                            "operator": {
                                "type": "object",
                                "operation": "empty",
                                "singleValue": true
                            },
                            "leftValue": "={{ $input.first().json }}",
                            "rightValue": ""
                        }
                    ]
                }
            },
            "typeVersion": 2.2
        },
        {
            "id": "08f3505d-aad8-475a-bf08-e3da12798367",
            "name": "For Each Generate...",
            "type": "n8n-nodes-base.splitInBatches",
            "position": [
                5000,
                2820
            ],
            "parameters": {
                "options": []
            },
            "typeVersion": 3
        },
        {
            "id": "1a1b30bd-91ab-41bd-9ead-39d24fc2643f",
            "name": "Wait2",
            "type": "n8n-nodes-base.wait",
            "position": [
                5780,
                3160
            ],
            "webhookId": "e9ad3ef0-7403-4e65-b0a4-4afdfb0cbc6d",
            "parameters": {
                "amount": 0
            },
            "typeVersion": 1.1
        },
        {
            "id": "8f2be6bb-ab65-4c92-9ca1-d7ffa936a2a3",
            "name": "Has Results?1",
            "type": "n8n-nodes-base.if",
            "position": [
                4260,
                3720
            ],
            "parameters": {
                "options": [],
                "conditions": {
                    "options": {
                        "version": 2,
                        "leftValue": "",
                        "caseSensitive": true,
                        "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                        {
                            "id": "1223d607-45a8-44b1-b510-56fdbe013eba",
                            "operator": {
                                "type": "array",
                                "operation": "notEmpty",
                                "singleValue": true
                            },
                            "leftValue": "={{ $input.all().filter(item => item.json.body) }}",
                            "rightValue": ""
                        }
                    ]
                }
            },
            "typeVersion": 2.2
        },
        {
            "id": "82fe66bf-4348-4673-8c64-3415f642fb4b",
            "name": "Response Scrape Error",
            "type": "n8n-nodes-base.set",
            "position": [
                4460,
                3900
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "5bb23ce9-eb72-4868-9344-9e5d3952cc52",
                            "name": "response",
                            "type": "string",
                            "value": "web scraping error"
                        }
                    ]
                }
            },
            "executeOnce": true,
            "typeVersion": 3.4
        },
        {
            "id": "3625591b-cb48-4131-ae8a-56d1e132bb5a",
            "name": "Has Results?3",
            "type": "n8n-nodes-base.if",
            "position": [
                4780,
                3580
            ],
            "parameters": {
                "options": [],
                "conditions": {
                    "options": {
                        "version": 2,
                        "leftValue": "",
                        "caseSensitive": true,
                        "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                        {
                            "id": "1223d607-45a8-44b1-b510-56fdbe013eba",
                            "operator": {
                                "type": "array",
                                "operation": "notEmpty",
                                "singleValue": true
                            },
                            "leftValue": "={{ $input.all().filter(item => item.json.body) }}",
                            "rightValue": ""
                        }
                    ]
                }
            },
            "typeVersion": 2.2
        },
        {
            "id": "f82a4a25-5f93-4ba4-baae-08283c4ccadd",
            "name": "Response No API Docs",
            "type": "n8n-nodes-base.set",
            "position": [
                4980,
                3740
            ],
            "parameters": {
                "options": [],
                "assignments": {
                    "assignments": [
                        {
                            "id": "5bb23ce9-eb72-4868-9344-9e5d3952cc52",
                            "name": "response",
                            "type": "string",
                            "value": "no api docs in web results"
                        }
                    ]
                }
            },
            "executeOnce": true,
            "typeVersion": 3.4
        },
        {
            "id": "4c3bb934-966c-445a-893f-0676a59140ee",
            "name": "Sticky Note",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                3020,
                2580
            ],
            "parameters": {
                "width": 620,
                "height": 180,
                "content": "## Stage 1 - Research for API Documentation\n- Fetch a list of services pending research from Database (Google Sheet)\n- Uses a search engine (Google) to find API Documentation for each service\n- Uses Webscraper (Apify) to read the contents of search results to filter irrelevant pages\n- Stores webpage contents and metadata into Vector Store (Qdrant)"
            },
            "typeVersion": 1
        },
        {
            "id": "bc269a57-f353-4cc8-bd2e-43236fa55d39",
            "name": "Sticky Note1",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                4000,
                2580
            ],
            "parameters": {
                "width": 760,
                "height": 180,
                "content": "## Stage 2 - Extract API Operations From Documentation\n- Fetch a list of services pending extraction from Database (Google Sheet)\n- Query Vector store (Qdrant) to figure out service's products, solutions and offerings\n- Query Vector store (Qdrant) again for API documentation relevant to these products, solutions and offerings\n- Extract any API operations found in the API documentation results using LLM (Gemini)\n- Store extracted API operations into Database (Google Sheet)"
            },
            "typeVersion": 1
        },
        {
            "id": "d2dcad47-f655-4a15-ac92-6dab05eea4e1",
            "name": "Sticky Note2",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                5000,
                2580
            ],
            "parameters": {
                "width": 740,
                "height": 180,
                "content": "## Stage 3 - Generate Custom Schema From API Operations\n- Fetch a list of services pending generation from Database (Google Sheet)\n- Fetch all API operations for each service from Database (Google Sheet)\n- Use Code node to combine and group all API operations for a service and convert to a custom schema\n- Upload the resulting custom schema to file storage (Google Drive)"
            },
            "typeVersion": 1
        },
        {
            "id": "d1e1a271-4260-49c3-bda6-2864605c7365",
            "name": "Sticky Note3",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                3100,
                3680
            ],
            "parameters": {
                "color": 5,
                "width": 180,
                "height": 80,
                "content": "## Stage 1 - Subworkflow"
            },
            "typeVersion": 1
        },
        {
            "id": "1e50f04a-94ff-48b4-aa99-cd1d4f1d12be",
            "name": "Sticky Note4",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                3100,
                4080
            ],
            "parameters": {
                "color": 5,
                "width": 180,
                "height": 80,
                "content": "## Stage 2 - Subworkflow"
            },
            "typeVersion": 1
        },
        {
            "id": "f8334dbd-b542-404a-b4fc-6cf7cc07730d",
            "name": "Sticky Note5",
            "type": "n8n-nodes-base.stickyNote",
            "position": [
                3100,
                4620
            ],
            "parameters": {
                "color": 5,
                "width": 180,
                "height": 80,
                "content": "## Stage 3 - Subworkflow"
            },
            "typeVersion": 1
        }
    ],
    "pinData": {
        "Execute Workflow Trigger": [
            {
                "data": {
                    "url": "https:\/\/www.formstack.com\/",
                    "service": "Formstack",
                    "collection": "api_schema_crawler_and_extractor",
                    "row_number": 2
                },
                "createdAt": "2024-12-07T12:22:35.344-05:00",
                "eventType": "research",
                "executedById": "10234"
            }
        ]
    },
    "connections": {
        "Wait": {
            "main": [
                [
                    {
                        "node": "For Each Research...",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Wait1": {
            "main": [
                [
                    {
                        "node": "For Each Extract...",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Wait2": {
            "main": [
                [
                    {
                        "node": "For Each Generate...",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Extract": {
            "main": [
                [
                    {
                        "node": "Extract Result",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Extract Error",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Generate": {
            "main": [
                [
                    {
                        "node": "Generate Result",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Generate Error",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Research": {
            "main": [
                [
                    {
                        "node": "Research Result",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Research Error",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Append Row": {
            "main": [
                [
                    {
                        "node": "Response OK1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "EventRouter": {
            "main": [
                [
                    {
                        "node": "Web Search For API Schema",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Query Templates",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Get API Operations",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Merge Lists": {
            "main": [
                [
                    {
                        "node": "Has Operations?",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Combine Docs": {
            "main": [
                [
                    {
                        "node": "Query & Docs",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Has Results?": {
            "main": [
                [
                    {
                        "node": "Results to List",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Response Empty",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Query & Docs": {
            "main": [
                [
                    {
                        "node": "For Each Template...",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Remove Dupes": {
            "main": [
                [
                    {
                        "node": "Scrape Webpage Contents",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Combine Docs1": {
            "main": [
                [
                    {
                        "node": "Query & Docs1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Extract Error": {
            "main": [
                [
                    {
                        "node": "Wait1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Extract Event": {
            "main": [
                [
                    {
                        "node": "Extract",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Has Results?1": {
            "main": [
                [
                    {
                        "node": "Has API Documentation?",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Response Scrape Error",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Has Results?3": {
            "main": [
                [
                    {
                        "node": "Set Embedding Variables",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Response No API Docs",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Query & Docs1": {
            "main": [
                [
                    {
                        "node": "For Each Template...1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Execution Data": {
            "main": [
                [
                    {
                        "node": "EventRouter",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Extract Result": {
            "main": [
                [
                    {
                        "node": "Wait1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Filter Results": {
            "main": [
                [
                    {
                        "node": "Remove Dupes",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Generate Error": {
            "main": [
                [
                    {
                        "node": "Wait2",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Generate Event": {
            "main": [
                [
                    {
                        "node": "Generate",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Research Error": {
            "main": [
                [
                    {
                        "node": "Wait",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Research Event": {
            "main": [
                [
                    {
                        "node": "Research",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Extract Pending": {
            "main": [
                [
                    {
                        "node": "Extract Event",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Generate Result": {
            "main": [
                [
                    {
                        "node": "Wait2",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Get All Extract": {
            "main": [
                [
                    {
                        "node": "All Extract Done?",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Has Operations?": {
            "main": [
                [
                    {
                        "node": "Remove Duplicates",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Response Empty1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Query Templates": {
            "main": [
                [
                    {
                        "node": "Template to List",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Research Result": {
            "main": [
                [
                    {
                        "node": "Wait",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Results to List": {
            "main": [
                [
                    {
                        "node": "Filter Results",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Successful Runs": {
            "main": [
                [
                    {
                        "node": "Has Results?1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Upload to Drive": {
            "main": [
                [
                    {
                        "node": "Response OK2",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Generate Pending": {
            "main": [
                [
                    {
                        "node": "Generate Event",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Get All Generate": {
            "main": [
                [
                    {
                        "node": "All Generate Done?",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Get All Research": {
            "main": [
                [
                    {
                        "node": "All Research Done?",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Research Pending": {
            "main": [
                [
                    {
                        "node": "Research Event",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Split Out Chunks": {
            "main": [
                [
                    {
                        "node": "Store Document Embeddings",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Template to List": {
            "main": [
                [
                    {
                        "node": "For Each Template...",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "All Extract Done?": {
            "main": [
                [
                    {
                        "node": "Get All Generate",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "For Each Extract...",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Remove Duplicates": {
            "main": [
                [
                    {
                        "node": "Append Row",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Set Upload Fields": {
            "main": [
                [
                    {
                        "node": "Upload to Drive",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "All Generate Done?": {
            "main": [
                [],
                [
                    {
                        "node": "For Each Generate...",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "All Research Done?": {
            "main": [
                [
                    {
                        "node": "Get All Extract",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "For Each Research...",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Get API Operations": {
            "main": [
                [
                    {
                        "node": "Contruct JSON Schema",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Default Data Loader": {
            "ai_document": [
                [
                    {
                        "node": "Store Document Embeddings",
                        "type": "ai_document",
                        "index": 0
                    }
                ]
            ]
        },
        "For Each Extract...": {
            "main": [
                [
                    {
                        "node": "Get All Generate",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Extract Pending",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Contruct JSON Schema": {
            "main": [
                [
                    {
                        "node": "Set Upload Fields",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "For Each Document...": {
            "main": [
                [
                    {
                        "node": "Response OK",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Content Chunking @ 50k Chars",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "For Each Generate...": {
            "main": [
                [],
                [
                    {
                        "node": "Generate Pending",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "For Each Research...": {
            "main": [
                [
                    {
                        "node": "Get All Extract",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Research Pending",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "For Each Template...": {
            "main": [
                [
                    {
                        "node": "Identify Service Products",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Search in Relevant Docs",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Extract API Templates": {
            "main": [
                [
                    {
                        "node": "For Each Template...1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "For Each Template...1": {
            "main": [
                [
                    {
                        "node": "Extract API Operations",
                        "type": "main",
                        "index": 0
                    }
                ],
                [
                    {
                        "node": "Search in Relevant Docs1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Extract API Operations": {
            "main": [
                [
                    {
                        "node": "Merge Lists",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Has API Documentation?": {
            "main": [
                [
                    {
                        "node": "Has Results?3",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Scrape Webpage Contents": {
            "main": [
                [
                    {
                        "node": "Successful Runs",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Search in Relevant Docs": {
            "main": [
                [
                    {
                        "node": "Combine Docs",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Set Embedding Variables": {
            "main": [
                [
                    {
                        "node": "For Each Document...",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Embeddings Google Gemini": {
            "ai_embedding": [
                [
                    {
                        "node": "Store Document Embeddings",
                        "type": "ai_embedding",
                        "index": 0
                    }
                ]
            ]
        },
        "Execute Workflow Trigger": {
            "main": [
                [
                    {
                        "node": "Execution Data",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Google Gemini Chat Model": {
            "ai_languageModel": [
                [
                    {
                        "node": "Has API Documentation?",
                        "type": "ai_languageModel",
                        "index": 0
                    }
                ]
            ]
        },
        "Search in Relevant Docs1": {
            "main": [
                [
                    {
                        "node": "Combine Docs1",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Embeddings Google Gemini1": {
            "ai_embedding": [
                [
                    {
                        "node": "Search in Relevant Docs",
                        "type": "ai_embedding",
                        "index": 0
                    }
                ]
            ]
        },
        "Embeddings Google Gemini2": {
            "ai_embedding": [
                [
                    {
                        "node": "Search in Relevant Docs1",
                        "type": "ai_embedding",
                        "index": 0
                    }
                ]
            ]
        },
        "Google Gemini Chat Model1": {
            "ai_languageModel": [
                [
                    {
                        "node": "Extract API Operations",
                        "type": "ai_languageModel",
                        "index": 0
                    }
                ]
            ]
        },
        "Google Gemini Chat Model2": {
            "ai_languageModel": [
                [
                    {
                        "node": "Identify Service Products",
                        "type": "ai_languageModel",
                        "index": 0
                    }
                ]
            ]
        },
        "Identify Service Products": {
            "main": [
                [
                    {
                        "node": "Extract API Templates",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Store Document Embeddings": {
            "main": [
                [
                    {
                        "node": "For Each Document...",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Web Search For API Schema": {
            "main": [
                [
                    {
                        "node": "Has Results?",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Content Chunking @ 50k Chars": {
            "main": [
                [
                    {
                        "node": "Split Out Chunks",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "When clicking ‘Test workflow’": {
            "main": [
                [
                    {
                        "node": "Get All Research",
                        "type": "main",
                        "index": 0
                    }
                ]
            ]
        },
        "Recursive Character Text Splitter1": {
            "ai_textSplitter": [
                [
                    {
                        "node": "Default Data Loader",
                        "type": "ai_textSplitter",
                        "index": 0
                    }
                ]
            ]
        }
    }
}
                                

Workflows Similaires

Automatisez le Résumé de Vos Emails avec A.I. et Messagerie

Ce workflow n8n vous permet d'automatiser la gestion de vos emails en utilisant l'intelligence artificielle pour résume...

Automatisation de gestion des réunions Zoom et communication

Ce workflow est conçu pour automatiser le processus de planification et de gestion des réunions Zoom tout en assurant ...

Automatisez vos Tweets d'images humoristiques à 17h

Ce workflow n8n est conçu pour les professionnels des réseaux sociaux cherchant à automatiser leur contenu humoristiq...