walla
██╗ ██╗ █████╗ ██╗ ██╗ █████╗ ██████╗ ██╗ ██╗
██║ ██║ ██╔══██╗ ██║ ██║ ██╔══██╗ ██╔════╝ ██║ ██║
██║ █╗ ██║ ███████║ ██║ ██║ ███████║ █████╗ ██║ ██║ ██║
██║███╗██║ ██╔══██║ ██║ ██║ ██╔══██║ ╚════╝ ██║ ██║ ██║
╚███╔███╔╝ ██║ ██║ ███████╗ ███████╗ ██║ ██║ ╚██████╗ ███████╗ ██║
╚══╝╚══╝ ╚═╝ ╚═╝ ╚══════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝
look · offer · talk
Dr. Berend Gort · www.berendgort.dev
walla is an unofficial Wallapop.es CLI + MCP + Python library for Cursor agents and humans: search listings, read inbox, send a message, make an offer.
Not affiliated with Wallapop. Respect ToS and rate limits.
What this unlocks
You tell Cursor: “Find me a used kite near Barcelona under €400, message the seller, and offer if it’s a GRAB.”
The agent runs walla — ranks listings GRAB / LOOK / PASS, links you the
item, asks before sending, then talks and offers on your behalf:
walla setup --lat 41.39 --lon 2.17 --km 30 --label Barcelona \
--budget 400 --aggression fair --must "kite cabrinha"
walla search "tabla kite Cabrinha" --max 40 --json
# agent: GRAB · Cabrinha Moto 10m · €320 · 4 km
# https://es.wallapop.com/item/...
walla search "…" --export md,csv,html,pdf --out ./shortlist --json
# or later: walla export --format md,csv,html,pdf --out ./shortlist --json
walla login # paste session cookie once
walla negotiate <id> --json # draft only; you approve text + EUR
walla say <id> "…" --yes # only after you approve
walla offer <id> --eur 280 --yes # only after you approve; never pays
That is the product: a Cursor agent that can look, draft, talk, and offer up to the point of payment. You finish pay/meet in the Wallapop app.
Quality bar (enforced in CI):
docs/code_quality.md— Korotkevich / Tourist bardocs/data_engineering_standards.md— Gray / Stonebraker bardocs/WIRE.md— captured consumer APIdocs/rate_limit_analysis.md— polite spacing
For AI agents (mandatory protocol)
If the user pasted this GitHub link (or this README), follow this section exactly.
Goal
Look, offer, and talk on wallapop.es using the walla package. Speak briefly.
Link listings as https://es.wallapop.com/item/<web_slug>. Verdicts:
GRAB / LOOK / PASS.
Bootstrap
- Install from PyPI (preferred):
pipx install 'walla-cli[mcp]'
From a clone only when hacking:pipx install -e '.[mcp]'. walla doctor --json— readauth.sessionandnetwork.reachable. Never print tokens or cookies.- If no session: ask the human to run
walla loginand paste__Secure-next-auth.session-tokenfrom es.wallapop.com (Cookie-Editor). Agents may pass it non-interactively:walla login --cookie '<value>' --json. walla instruct --json— readmandate+hitl. Ifmandate.budgetis null, ask once for budget / aggression / must words, thenwalla setup ….- Do the ask with
walla … --jsonand narrate in prose.
Optional MCP:
{
"mcpServers": {
"walla": { "command": "walla-mcp" }
}
}
Operating loop
| Ask | Command |
|---|---|
| Mandate | walla setup --budget 400 --aggression fair --must "kite" |
| Look | walla search "tabla kite" --max 40 --json then walla item <id> --json |
| Draft | walla negotiate <id> --json (win-win Spanish draft; never sends) |
| Talk | walla inbox --json · walla thread <id> --json · walla say <id> "…" --yes |
| Offer | walla offer <id> --eur 180 --yes |
HITL (ask once per decision)
| Step | Agent alone | Ask human |
|---|---|---|
| Search inside mandate | yes | if query vague or budget unset |
| Shortlist | show ranked Wallapop rows with markdown item links | if more than one GRAB, pick the id |
| Negotiate draft | yes | approve Spanish text |
say --yes |
never | yes to that exact text |
offer --yes |
never; refuse if EUR > budget | yes to that exact EUR |
| Pay / buy / reserve | never | human finishes in the Wallapop app |
Rules:
- Reads and negotiate drafts are safe.
say/offerneed--yes. --yesmeans send chat or price offer only. It never completes a purchase.- If they only asked to look, do not send.
- Ambiguous match or multiple GRABs: ask once with candidates.
- Always present Wallapop shortlists ranked best-first with a markdown link on every item URL.
- Default search is all of Spain. Shipping counts anywhere. Use
walla search --localonly when the human asked for nearby or pickup. - In-person offers outside pickup radius: refuse.
- Envelope:
ok,api_version,dataorerror/error_type/retryable.
walla instruct --json returns this recipe.
Install
pipx install 'walla-cli[mcp]' # PyPI: https://pypi.org/project/walla-cli/
walla setup --lat 41.39 --lon 2.17 --km 30 --label Barcelona --json
walla login # paste __Secure-next-auth.session-token
walla doctor --json
CLI
| Command | Role |
|---|---|
walla setup / profile |
Home point, radius, budget |
walla search / item / categories |
Look |
walla watch add|list|check |
Local saved searches |
walla login / logout / whoami |
Session (paste cookie; optional --password) |
walla negotiate |
Win-win Spanish draft (never sends) |
walla inbox / thread / say |
Talk |
walla offer |
Offer (prints total, needs --yes) |
walla fav list|add|rm |
Favorites |
walla instruct / doctor |
Agent recipe + health |
Develop
pip install -e '.[dev,mcp]'
pytest -q -m 'not live'
pytest -m live # hits Wallapop; needs network
ruff check .
mypy walla
python scripts/check_code_quality.py
| Layer | Path | Role |
|---|---|---|
| Models | walla/models/ |
Pydantic only |
| HTTP | walla/http/ |
curl_cffi + polite |
| Core | walla/core/ |
Envelope, errors, human_fix |
| Search | walla/search/ |
Look |
| Account | walla/account/ |
Session, inbox, offer |
| Hunter | walla/hunter/ |
Profile, watches, verdicts |
| CLI / MCP | walla/cli/ · walla/mcp/ |
Entrypoints |
Read AGENTS.md before extending.
Disclaimer
Unofficial. Not affiliated with Wallapop. Personal / research use.
License
MIT
Metadata
Release files for walla-cli 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| walla_cli-0.1.6.tar.gz | 169.5 kB | Without provenance | Details for walla_cli-0.1.6.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| walla_cli-0.1.6-py3-none-any.whl | Python 3 | none | any | Details for walla_cli-0.1.6-py3-none-any.whl |
Total release size: 220.4 kB
Release files / walla_cli-0.1.6.tar.gz
| Download URL | walla_cli-0.1.6.tar.gz |
|---|---|
| Size | 169.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d1f4b5510f99094cca6d8e87a588f1df1f9cd9e3f2a425bd1c640e13a482018b
|
|
BLAKE2b-256 checksum How to use checksums |
7596c614b91bda0477d92ed6326d9e026249a77777f19a8c4fc8950d600b4d28
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / walla_cli-0.1.6-py3-none-any.whl
| Download URL | walla_cli-0.1.6-py3-none-any.whl |
|---|---|
| Size | 50.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
54e4c7d60742ff0b4d65dbee4acc579e302c2f9ebf8ea3b6dd4a3504161c68bc
|
|
BLAKE2b-256 checksum How to use checksums |
1696cb7e208d08bd3396e03d5d66909be55c171d47d7f2911e2bd8642d3cb353
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for walla-cli 0.1.6
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.