walla
██╗ ██╗ █████╗ ██╗ ██╗ █████╗ ██████╗ ██╗ ██╗
██║ ██║ ██╔══██╗ ██║ ██║ ██╔══██╗ ██╔════╝ ██║ ██║
██║ █╗ ██║ ███████║ ██║ ██║ ███████║ █████╗ ██║ ██║ ██║
██║███╗██║ ██╔══██║ ██║ ██║ ██╔══██║ ╚════╝ ██║ ██║ ██║
╚███╔███╔╝ ██║ ██║ ███████╗ ███████╗ ██║ ██║ ╚██████╗ ███████╗ ██║
╚══╝╚══╝ ╚═╝ ╚═╝ ╚══════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═╝
look · offer · talk · sell
Dr. Berend Gort · www.berendgort.dev
▶ Play full demo with sound · Demo music: Funkee Monkeee by Michael Ramir C. (Mixkit Stock Music Free License).
walla turns Claude, GPT, or Cursor into a Wallapop helper that actually does the work for you. You drop a few photos and answer a couple of questions; the agent publishes the listing. When buyers message, it reads the chats, replies for you, and negotiates down to your minimum price — then shows you the best deal. You only open the Wallapop app to accept. No typing chats. No babysitting the inbox.
Unofficial Wallapop.es CLI + MCP + Python library. 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, messages the
shortlist, and follows replies until a price is agreed. You close the deal
in the Wallapop app.
walla setup --lat 41.39 --lon 2.17 --km 30 --label Barcelona \
--budget 400 --aggression fair --must "kite cabrinha"
walla login # paste session cookie once
walla pursue "tabla kite Cabrinha" --json
walla desk --json # one inbox read; replies; stack.best
Sell is the same idea: answer the photo questions, publish once, then desk talks to buyers.
walla sell ./shot.jpg --json
walla sell ./shot.jpg --title "…" --desc "…" --eur 40 \
--category 10105 --root 12579 --floor 35 --yes --json
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 |
| Buy | walla pursue "<query>" --json then walla desk --json |
| Sell | walla sell <photos> --json, then the same command with --yes |
| Close | Human pays or accepts in the Wallapop app |
HITL
| Step | Agent alone | Ask human |
|---|---|---|
| Search inside mandate | yes | if query vague or budget unset |
pursue / desk |
yes, including the chat messages | never for each text |
| Publish or delete a listing | no | --yes once the questions are answered |
| Pay / accept / meet | never | human finishes in the Wallapop app |
Rules:
pursueanddesksend negotiation chat. Do not ask the human to send.- Bare
say/offer/sell/unsellstill need--yes. --yesnever completes a purchase or accepts a sale.- 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 pursue / desk |
Message a shortlist and follow the inbox |
walla negotiate |
Win-win Spanish draft (never sends) |
walla inbox / thread / say |
Talk (say needs --yes) |
walla offer |
Formal offer (needs --yes) |
walla sell / unsell / edit |
Publish, edit, or delete (--yes) |
walla teach |
Park a redacted agent transcript locally |
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.
Help improve walla
Long agent chats help. After you confirm, pick a PR method:
walla teach ./cursor-export.md --method a --yes --json # A gh B git C browser D hub E manual
Cookies/tokens are stripped first. If gh/git/hub is missing, open
https://github.com/berendgort/wallapop-cli/compare and file the PR by hand
(parked file is in ~/.config/walla/teach/). Agents ask once on first use,
then at 20 / 40 / 60 prompts — never on every search.
Disclaimer
Unofficial. Not affiliated with Wallapop. Personal / research use.
License
MIT
Metadata
Release files for walla-cli 0.1.15
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.15.tar.gz | 4.4 MB | Without provenance | Details for walla_cli-0.1.15.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| walla_cli-0.1.15-py3-none-any.whl | Python 3 | none | any | Details for walla_cli-0.1.15-py3-none-any.whl |
Total release size: 4.5 MB
Release files / walla_cli-0.1.15.tar.gz
| Download URL | walla_cli-0.1.15.tar.gz |
|---|---|
| Size | 4.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4e04e19d03c01a0c31bbaf14f06b877bb35bd5cf57a2945b9c1e8c91609c9979
|
|
BLAKE2b-256 checksum How to use checksums |
f98e3247b1ec92c3062eac404548038a38abf471aa1bf83a1fd6f92d11da22cb
|
| 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.15-py3-none-any.whl
| Download URL | walla_cli-0.1.15-py3-none-any.whl |
|---|---|
| Size | 87.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
043e07927f244db789a256bb7058d3dfe46df8bca1fdfefb6afa855c659f8c4a
|
|
BLAKE2b-256 checksum How to use checksums |
8b1cf3e9120c1f40f7ce7329429e14dbf8452dc24f4e9980250cddb34bc6171e
|
| 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.15
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.