Bonsai-27B-GGUF
lmstudio-community · Kit
A GGUF conversion of the 27B Bonsai model for LM Studio, with a 3.80 GB Q1_0 language file and a 0.93 GB BF16 vision projector. Tested for text, vision and par…
An n8n workflow behind a Telegram bot. Message it a job title and a state, and an Apify Actor searches for matching people. Leads with an email land in Google Sheets, and the bot replies with the count. The Actor in the file needs replacing.
Telegram lead search bot that saves leads to Google Sheets is an n8n workflow in the Marketing & SEO category, listed by Mindket. It is free. This is version 1, last updated on . Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.
Telegram message
It starts when someone sends the bot a message that names:
A Google Sheet of leads with emails, and a reply in Telegram saying how many were saved
What you need before you start.
Chat
Receives each message through the bot and sends back the success, failure or error reply.
NeedsA bot token from BotFather
Language model
Runs gpt-4.1-mini to pull the job title and the state out of the message.
NeedsOpenAI API key
Lead search
Runs a lead search Actor, reports its status and returns its results. The one in the file now takes other input, so you pick another.
NeedsApify API token, typed into the nodes’ headers
Lead sheet
Adds each lead with an email as a row of six columns.
NeedsA Google account to sign in with, and a sheet with a Leads tab
Checked by Mindket on 13 Nov 2026
This n8n workflow runs a Telegram bot that finds leads from a single chat message. You write a job title and a state in plain words. Then gpt-4.1-mini pulls the two out, an Apify Actor starts a search, and the workflow checks on it every few minutes until it ends. The leads with an email go into Google Sheets, and the bot replies with the count. Nineteen nodes run it.
Salespeople and recruiters who want a lead list from their phone without opening n8n or a spreadsheet. It fits one person, or a small team that shares a bot. One catch. The Actor in the file has changed what it does. You need to be at ease swapping in another one, so skip it if you want a bot that works on import.
| Industry | Who uses it | How they use it | Example |
|---|---|---|---|
| B2B sales | Account executives | Message the bot between meetings and read the sheet later | A rep asks for finance chiefs in Ohio on the way to a meeting and finds the rows waiting at the desk. |
| Recruiting | Agency recruiters | Search one role in one state at a time | A recruiter asks for nurse managers in Florida and starts calling from the sheet. |
| Marketing agencies | Agency owners | Share one bot with the team so every search lands in one sheet | Two account managers search different states, and the leads collect in one tab. |
You need some n8n and four accounts: Telegram, OpenAI, Apify and Google. Its author puts setup at about 15 minutes, a figure from before the Actor changed, so leave extra time for finding a new Actor and matching its fields to your sheet.
Any n8n that Telegram can reach over HTTPS. Telegram sends each message to the trigger’s webhook, so a server of your own needs a public address.
Get it saves a zip with workflow.json and Mindket’s setup notes in your downloads folder. Make the sheet first, since Google Sheets points at it.
| Need | Detail |
|---|---|
| n8n | On n8n Cloud, or a server of your own that Telegram can reach over HTTPS |
| Telegram | A bot and its token, from BotFather |
| OpenAI | An API key that can use gpt-4.1-mini |
| Apify | An account and its API token, with credit, and an Actor that searches people by job title and state |
| An account that can edit the sheet, for a Google Sheets OAuth2 credential | |
| A sheet | A tab named Leads with six headers in row 1: personName, title, email, linkedIn, person_location and organization_website |
workflow.json./d/ and /edit.Telegram Trigger and the three nodes that send messages.OpenAI Chat Model.Google Sheets and replace YOUR_SHEET_ID with the ID.runActor, with the body it asks for. Point getRun at https://api.apify.com/v2/actor-runs/{{ $('runActor').item.json.data.id }}.<YOUR_APIFY_TOKEN> in the headers of runActor and getDatasetItems, and give getRun the same Authorization header. The brackets go too, so each header reads Bearer, a space and the token.On 2 November 2026, Apify’s listing for the Actor in the file, GlxYrQp6f3YAzH2W2, showed one input field: a CSV or Excel file of people. Its pricing history said it was turning into a LinkedIn profile scraper. That is why step 6 asks for another. The Leads Finder Actor from the account boneswill is one choice, since its input page lists the title and state fields this bot sends.
Write to the bot as you would to a colleague, with one job title and one state. It stays quiet until the search ends, which takes at least two minutes. Expect a pause. Then it replies to your message with the count of leads saved, or with a short failure note. Open the sheet to read the leads.
| To change | Where |
|---|---|
| The replies | The text of Send a success message, Send a failed message and Send a error message |
| The bot’s name in the reply | The last line of Send a success message, which thanks the user for using LeadGenBot |
| How often it checks | Wait, two minutes before the first check, and Wait1, three minutes between checks |
| How many leads | totalResults in the body of runActor, 1000 in the file |
| What is extracted | The two attributes of Query Fixer and its system prompt |
You send the bot this.
marketing directors in texas
Query Fixer might return Marketing Director and Texas. A check or two later, the leads arrive in the sheet. The bot then answers in this shape, with the count filled in:
Lead generation completed successfully! Summary: Extracted: Total <n> unique leads Search Criteria: Job Title: Marketing Director Location: Texas Thank you for using LeadGenBot!
The reply in the file also carries a few emoji, left out here.
If you are new. n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. Here one line loops back: Wait1 returns to getRun until Apify says the search is done. Send one message and open the run under Executions. You can follow it round the loop and see what each node received.
For experts. The search runs in the background on Apify, so the workflow polls for it on a timer instead of holding one connection open for as long as the search takes.
| Node | Call or test | What to know |
|---|---|---|
runActor | POST to the Actor’s runs address | Starts the search and returns the run’s id at once |
getRun | GET the run | Has no Authorization header in the file, and its address names the Actor |
Switch | Reads data.status | Routes FAILED, SUCCEEDED and RUNNING. Any other status ends the run with no reply |
getDatasetItems | GET the run’s dataset items | Returns every lead the Actor found |
If | Tests data[1].id | Takes a second item with an id for the Actor’s error notice, a test tied to the old Actor |
The bot answers anyone who finds it, and a few statuses end a run without a word. Read these before you share it.
Telegram Trigger that lets only your user ID through. The trigger’s own Restrict to User IDs option only takes effect from node version 1.2, and this one is 1.1Remove Duplicates compares the leads of one search onlyAn n8n workflow behind a Telegram bot. You message the bot a job title and a state in plain words. A model pulls the
two out, an Apify Actor searches for people who match, and the workflow checks on the search every few minutes. When it
finishes, the leads with an email are added to a Google Sheet, and the bot replies with how many it saved.
Read "The Actor has changed" below before you build on it: the Actor named in the file now takes a different input.
workflow.json: the workflow as n8n exports it, nineteen nodes and no sticky notes. It holds no credential.README.md: these notes.runActor and getDatasetItems held a placeholder, Bearer <token>. They now sayBearer <YOUR_APIFY_TOKEN>.Google Sheets asks for YOUR_SHEET_ID and finds the tab by the nameLeads.gpt-4.1-mini.runActor starts the Actor GlxYrQp6f3YAzH2W2 with a job title, a state and a few email settings. On 2 November 2026,
Apify's listing for that ID named it Email & Phone Finder, from the account peakydev. Its input page listed one field, a
CSV or Excel file of people, and its pricing history said the Actor was turning into a LinkedIn profile scraper. The
search this bot sends no longer fits it.
To replace it, pick an Actor that searches people by job title and state. The Leads Finder Actor from the account
boneswill, for one, lists personTitle and personState on its input page. Then:
runActor, and write the body its input page asks for.getRun to https://api.apify.com/v2/actor-runs/{{ $('runActor').item.json.data.id }}, whichsetValues to the fields the new Actor returns. Check If too (How a run goes, step 6).workflow.json.Leads and these headers in row 1: personName, title, email, linkedIn,person_location and organization_website. Copy the sheet's ID: the long part of its address between /d/ and/edit.Telegram Trigger and in the three nodes that sendOpenAI Chat Model.Google Sheets, select it and replace YOUR_SHEET_ID with the ID.runActor and getDatasetItems, replace <YOUR_APIFY_TOKEN> in the AuthorizationgetRun theTelegram Trigger that lets through only your own user ID,{{ $json.message.from.id }}. The trigger's own Restrict to User IDs option shows in this node, but n8n's code onlyTelegram Trigger starts a run for every message the bot receives.Query Fixer has gpt-4.1-mini pull out two fields: jobTitle, and personState when the message names a state.runActor starts the Actor with the title, the state, verified emails only, leads without an email skipped and up toWait pauses two minutes, then getRun asks Apify for the run's status. Switch sends FAILED toSend a failed message, SUCCEEDED to getDatasetItems, and RUNNING to Wait1, which pauses three minutes andgetDatasetItems fetches the results, and Aggregate gathers them into one list called data.If checks whether the second item in that list has an id. When it does, the workflow takes the results for anSend a error message replies with the first sentence of that item's fullName. That test fits howSplit Out turns the list back into one item for each lead. setValues keeps six fields and joins theperson_location. Next, Filter drops leads without an email and Remove DuplicatesGoogle Sheets appends each lead as a row, and Send a success message replies once with the number of rows, the jobSend a success message, Send a failed message and Send a error message. TheWait before the first check and Wait1 between checks.runActor, and the two fields Query Fixer extracts.Switch has routes for three statuses only. A run that is still queued at the first check, or one that times out or isRemove Duplicates only compares the leads of one search, so a second search can add people already in the sheet.README.md 6 KB workflow.json 20 KB
lmstudio-community · Kit
A GGUF conversion of the 27B Bonsai model for LM Studio, with a 3.80 GB Q1_0 language file and a 0.93 GB BF16 vision projector. Tested for text, vision and par…
LibertAIDAI · Kit
Runs DeepSeek-V4.1-Flash-1017 as a 2.9 bits-per-weight EXL3 quantization, a 196 GiB copy for people serving large models on their own hardware. Perplexity stay…
facebook · Kit
Generates short music clips from a text description or an audio prompt, in the small checkpoint of facebook's MusicGen. It suits developers and music hobbyists…
alchaincyf · Skill
Turns a one-line request in your AI agent into a finished design: a launch animation, a clickable app prototype, an editable slide deck, an infographic or a se…
nerijs · Kit
A pixel art style add-on for Stable Diffusion XL that turns text prompts into pixel-style images, with an optional LCM LoRA for faster runs. For game makers, d…
LiconStudio · Kit
Keeps characters, clothing, objects and backgrounds consistent in generated video by feeding the model up to five reference images. A LoRA for LTX-2.5 in Comfy…