Malt Freelance Automation · Auto-Apply to Project Offers avatar

Malt Freelance Automation · Auto-Apply to Project Offers

Pricing

from $1.00 / actor start

Go to Apify Store
Malt Freelance Automation · Auto-Apply to Project Offers

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

Corentin Robert

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

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

OutcomeDetails
SpeedOne run = one pending offer handled (or a clear “no pending reply” outcome) — no manual login loop for every lead.
ConsistencyTemplate pitch with project title and company context; configurable daily rate (minimum 600 EUR); your Calendly link in the form.
Trust & traceabilityStructured dataset JSON per run; optional append-only Google Sheets rows; optional Telegram ping on submit or when nothing is pending.
Reliable authGmail 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)

  1. In Apify, open the Actor Input tab.
  2. Set login method (form or cookies). For form, plan for Gmail IMAP (app password) for the 6-digit code.
  3. 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).
  4. Click Run.
  5. 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-scraper
apify 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)

FieldDescription
loginMethodform (default) or cookies
email / passwordMalt login; or env MALT_*
imapUser / imapPasswordGmail IMAP for 2FA code
maltCookiesJSON array if loginMethod is cookies
openaiApiKeyOptional, for non-project direct replies
dailyRateEUR/day (min 600)
calendlyLinkCalendly URL
headlesstrue on Apify; false locally for debug
googleSheets* / telegram*Optional integrations

Environment variables are also supported (see actor.json).


Output (dataset)

FieldDescription
repliedWhether a message/application was sent
reasone.g. candidature_submitted, no_pending_reply, config_required
pitchMessagePitch text when applicable
dailyRateRate 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-scraper
npm install
cp input.json.example input.json
npm start

Deploy

$apify push

Support

For custom automation, integrations, or tailored scrapers, contact Corentin at corentin@outreacher.fr.