Malt Freelance Automation · Auto-Apply to Project Offers
Pricing
from $1.00 / actor start
Malt Freelance Automation · Auto-Apply to Project Offers
Stop losing time on repetitive Malt applications: this Actor logs in (2FA via Gmail or cookies), opens Messages, and submits the next pending project offer with your pitch, daily rate, and Calendly link. Built for freelancers drowning in inbound leads.
Pricing
from $1.00 / actor start
Rating
0.0
(0)
Developer
Corentin Robert
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Share
Malt Automation — Freelance Project Offers
Never let a Malt project lead go cold — one run logs in, finds the next offer waiting for your reply, and submits a professional application with your pitch, rate, and Calendly link.
If you live off inbound Malt requests, manually opening the site several times a day, copying the same pitch, and fighting 2FA is slow. This Actor does the repetitive part: secure login (form + Gmail 2FA or cookies), navigation to Messages, detection of the next pending project offer, and one structured application per run. You stay in control of your template and minimum daily rate; you get a dataset row every time (and optional Google Sheets + Telegram when you want a paper trail or alerts).
Built for: Freelancers with high inbound volume on Malt · Faster time-to-reply on project offers · Consistent pitches (title + company personalization) · Ops visibility (Sheets / Telegram) without extra tools
Important: Automated actions may conflict with Malt’s terms of use — use responsibly (e.g. conservative frequency). The UI can change; selectors may need updates. Secrets belong in Actor environment variables, not in public input defaults.
What you get
| Outcome | Details |
|---|---|
| Speed | One run = one pending offer handled (or a clear “no pending reply” outcome) — no manual login loop for every lead. |
| Consistency | Template pitch with project title and company context; configurable daily rate (minimum 600 EUR); your Calendly link in the form. |
| Trust & traceability | Structured dataset JSON per run; optional append-only Google Sheets rows; optional Telegram ping on submit or when nothing is pending. |
| Reliable auth | Gmail 2FA via IMAP (app password) or cookie login when the form is flaky or rate-limited. |
Output: Rows in the Apify Dataset (replied, reason, pitchMessage, projectContext, etc.). A RUN_LOG in the default key-value store shows live progress during the run.
Why freelancers use it
- Reclaim hours — Stop context-switching into Malt just to click “apply” on the same pattern of offers.
- Same quality every time — Your pitch structure stays stable; the Actor fills the form so you don’t skip fields under pressure.
- Works with your stack — Push results to Sheets for CRM or reporting, or Telegram for mobile awareness.
- Secrets stay private — Use environment variables so Console samples never need your real password in the JSON.
Quick start (about 3 minutes)
- In Apify, open the Actor Input tab.
- Set login method (
formorcookies). Forform, plan for Gmail IMAP (app password) for the 6-digit code. - Prefer Actor → Settings → Environment variables for
MALT_EMAIL,MALT_PASSWORD,MALT_IMAP_USER,MALT_IMAP_PASSWORD,CALENDLY_LINK— leave email / Calendly empty in the form if you use env-only secrets (see below). - Click Run.
- When the run finishes, open the Dataset tab; optionally open RUN_LOG in the key-value store while the run is executing.
Secrets and sample data
Do not put real passwords in defaults in public schemas. Use Actor → Settings → Environment variables or apify secrets add + apify push (see .actor/actor.json).
If you use env-only secrets: leave email, imapUser, and calendlyLink empty in the Input (or use {} plus toggles only). The Actor ignores placeholder-style values (you@example.com, generic Calendly URLs) and reads MALT_* / CALENDLY_LINK instead.
CLI example (local secrets, then deploy):
cd malt-messages-scraperapify secrets add maltEmail "you@example.com"apify secrets add maltPassword "YOUR_MALT_PASSWORD"apify secrets add maltImapUser "you@example.com"apify secrets add maltImapPassword "GMAIL_APP_PASSWORD"apify secrets add calendlyLink "https://calendly.com/you/20min"apify push
Without a password in input and without MALT_PASSWORD, the run exits with config_required.
Input examples
Form login + 2FA
{"email": "you@example.com","password": "your-malt-password","imapUser": "you@example.com","imapPassword": "gmail-app-password","headless": false}
Use a Gmail app password for imapPassword.
Cookies only
{"loginMethod": "cookies","maltCookies": [{ "domain": "www.malt.fr", "name": "SESSION", "value": "...", "path": "/" }]}
Full options (Sheets + Telegram)
{"email": "...","password": "...","imapUser": "...","imapPassword": "...","loginMethod": "form","dailyRate": 600,"calendlyLink": "https://calendly.com/you/20min","googleSheetsEnabled": true,"googleSheetsSpreadsheetId": "SPREADSHEET_ID","googleSheetsCredentials": { "type": "service_account", "project_id": "...", "private_key": "...", "client_email": "..." },"googleSheetsTab": "Sheet1","telegramEnabled": true,"telegramBotToken": "BOT_TOKEN","telegramChatId": "CHAT_ID"}
Share the spreadsheet with the service account email (editor).
Input fields (summary)
| Field | Description |
|---|---|
loginMethod | form (default) or cookies |
email / password | Malt login; or env MALT_* |
imapUser / imapPassword | Gmail IMAP for 2FA code |
maltCookies | JSON array if loginMethod is cookies |
openaiApiKey | Optional, for non-project direct replies |
dailyRate | EUR/day (min 600) |
calendlyLink | Calendly URL |
headless | true on Apify; false locally for debug |
googleSheets* / telegram* | Optional integrations |
Environment variables are also supported (see actor.json).
Output (dataset)
| Field | Description |
|---|---|
replied | Whether a message/application was sent |
reason | e.g. candidature_submitted, no_pending_reply, config_required |
pitchMessage | Pitch text when applicable |
dailyRate | Rate used |
projectContext | { title, companyName, description } when detected |
RUN_LOG
During a run, a plain-text tail is written to the default key-value store under RUN_LOG. Use the link in the run output schema to open it while the Actor is running.
Limitations
- Malt may change its UI; selectors may need updates.
- Prefer a conservative schedule (e.g. 1–2 runs per day). You are responsible for compliance with Malt’s terms.
Local run
cd malt-messages-scrapernpm installcp input.json.example input.jsonnpm start
Deploy
$apify push
Support
For custom automation, integrations, or tailored scrapers, contact Corentin at corentin@outreacher.fr.


