Malt Messages Scraper
Pricing
$29.00/month + usage
Malt Messages Scraper
Logs into Malt, navigates to messages, and automatically applies to pending project offers with a personalized pitch. Built for freelances receiving many Malt requests. Features: login with 2FA (IMAP), cookie fallback when form is rate-limited, template-based pitch, Google Sheets export.
Pricing
$29.00/month + usage
Rating
0.0
(0)
Developer

Corentin Robert
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Automatically apply to Malt project offers — Log in, find pending "Apply" requests, fill the application form with a personalized pitch, and submit. Export to Google Sheets and receive Telegram notifications. Built for freelances receiving many Malt project requests.
Why Use This Scraper?
Save Time
- No more manual login and checking messages several times a day
- Automatically detect project offers awaiting your response
- One run = one application sent (or notification if none pending)
Consistent Applications
- Template-based pitch personalized with project title and company
- Fixed daily rate (min 600€), Calendly link, professional message
- Service type auto-detected: scraping, automation, or prospection
Traceability & Alerts
- Log every run to Google Sheets (candidatures + "no offer" runs)
- Telegram notification for each application or when no offer is pending
- Cookie fallback when Malt blocks the login form ("Duplication de formulaire")
Perfect For
- Freelances on Malt — Automate first responses to project offers
- Prospection / Growth consultants — Quick apply with tailored pitch
- Automation specialists — Reduce manual repetitive tasks
How It Works
- Authenticate — Login via email/password (2FA via IMAP), or cookies if form is rate-limited
- Navigate to messages — Go to Malt
/messages - Find pending offer — Look for project offers with "En attente de votre réponse"
- Apply — Fill daily rate (600€+), personalized pitch, Calendly link, submit
- Output — Push result to Dataset, optionally append to Google Sheets, send Telegram
Quick Start
Minimal (credentials only)
{"email": "your-email@example.com","password": "your-password","imapUser": "your-email@example.com","imapPassword": "gmail-app-password","headless": false}
2FA code is fetched from Gmail (IMAP). Use a Gmail App Password for imapPassword.
With Cookie Fallback (when "Duplication de formulaire")
If Malt blocks the login form, export your cookies (Cookie-Editor, EditThisCookie) and add:
{"email": "...","password": "...","imapUser": "...","imapPassword": "...","maltCookies": [{"domain": "www.malt.fr", "name": "SESSION", "value": "...", "path": "/"},{"domain": "www.malt.fr", "name": "remember-me", "value": "...", "path": "/"}]}
Login is attempted first. If "Duplication de formulaire" is detected, cookies are used instead.
Full Setup (Google Sheets + Telegram)
{"email": "...","password": "...","imapUser": "...","imapPassword": "...","dailyRate": 600,"calendlyLink": "https://calendly.com/you/20min","googleSheetsEnabled": true,"googleSheetsSpreadsheetId": "YOUR_SPREADSHEET_ID","googleSheetsCredentials": {"type": "service_account", "project_id": "...", "private_key": "...", "client_email": "..."},"googleSheetsTab": "Feuille 1","telegramEnabled": true,"telegramBotToken": "YOUR_BOT_TOKEN","telegramChatId": "YOUR_CHAT_ID"}
Share the Google Sheet with the Service Account email (Editor). Create the sheet tab or leave it empty — headers are created automatically.
Input
| Parameter | Description |
|---|---|
email | Malt login email |
password | Malt password |
imapUser | Gmail address (same as Malt) for 2FA code retrieval |
imapPassword | Gmail App Password (not normal password) |
maltCookies | JSON array of cookies — fallback when login form is blocked |
openaiApiKey | Optional — for direct conversations (not project offers) |
dailyRate | Daily rate in €/day. Min 600, default 600 |
calendlyLink | Calendly URL for the pitch |
headless | true = headless, false = visible browser |
googleSheetsEnabled | Log runs to Google Sheets |
googleSheetsSpreadsheetId | Sheet ID from URL |
googleSheetsCredentials | Service Account JSON |
googleSheetsTab | Tab name, e.g. "Feuille 1" or "Malt Candidatures" |
telegramEnabled | Send Telegram notifications |
telegramBotToken | Bot token from @BotFather |
telegramChatId | Chat/channel ID |
Environment variables (Apify secrets): MALT_EMAIL, MALT_PASSWORD, MALT_IMAP_USER, MALT_IMAP_PASSWORD, MALT_COOKIES, OPENAI_API_KEY, GOOGLE_SHEETS_SPREADSHEET_ID, GOOGLE_SHEETS_CREDENTIALS, TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID
Output
| Field | Description |
|---|---|
replied | true if application or message was sent |
reason | candidature_submitted, no_pending_reply, submit_button_not_found, etc. |
pitchMessage | Content of the application pitch |
messageSent | Content of direct reply (conversations only) |
dailyRate | Daily rate used in the application |
accompagnement | Service type: scraping, automation, prospection |
projectContext | { title, companyName, description } |
Google Sheets Columns
Created automatically if the sheet is empty:
| Column | Content |
|---|---|
| Date | Run timestamp (ISO) |
| Entreprise | Company name |
| Titre projet | Project title |
| Type accompagnement | Scraping, automation, prospection |
| Taux (€/jour) | Daily rate |
| Message envoyé | Pitch sent |
| Statut | soumis, aucune_offre, or error reason |
Telegram Messages
When application is sent:
Malt: candidature ✅ soumisEntreprise: JoyaProjet: Déployer une acquisition B2B LinkedIn...
When no offer pending:
Malt: aucune offre en attente ✓
Limitations & ToS
- Malt rate limiting — Login form may show "Duplication de formulaire" after many attempts. Use cookie fallback.
- Selectors — Malt may change its UI; selectors might need updates.
- Use responsibly — Run frequency: 1–2 times per day recommended. Automated actions may violate Malt ToS; use at your own risk.
Run Locally
cd apify/scrapers/malt-messages-scrapernpm install# Create input.json (copy from input.json.example)npm start
Deploy to Apify
$apify push