Skip to main content

walla

██╗    ██╗  █████╗  ██╗      ██╗       █████╗            ██████╗ ██╗      ██╗
██║    ██║ ██╔══██╗ ██║      ██║      ██╔══██╗          ██╔════╝ ██║      ██║
██║ █╗ ██║ ███████║ ██║      ██║      ███████║  █████╗  ██║      ██║      ██║
██║███╗██║ ██╔══██║ ██║      ██║      ██╔══██║  ╚════╝  ██║      ██║      ██║
╚███╔███╔╝ ██║  ██║ ███████╗ ███████╗ ██║  ██║          ╚██████╗ ███████╗ ██║
 ╚══╝╚══╝  ╚═╝  ╚═╝ ╚══════╝ ╚══════╝ ╚═╝  ╚═╝           ╚═════╝ ╚══════╝ ╚═╝
  look · offer · talk · sell
  Dr. Berend Gort  ·  www.berendgort.dev

walla sell demo

▶ 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):


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

  1. Install from PyPI (preferred):
    pipx install 'walla-cli[mcp]'
    
    From a clone only when hacking: pipx install -e '.[mcp]'.
  2. walla doctor --json — read auth.session and network.reachable. Never print tokens or cookies.
  3. If no session: ask the human to run walla login and paste __Secure-next-auth.session-token from es.wallapop.com (Cookie-Editor). Agents may pass it non-interactively: walla login --cookie '<value>' --json.
  4. walla instruct --json — read mandate + hitl. If mandate.budget is null, ask once for budget / aggression / must words, then walla setup ….
  5. Do the ask with walla … --json and 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:

  • pursue and desk send negotiation chat. Do not ask the human to send.
  • Bare say / offer / sell / unsell still need --yes.
  • --yes never 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 --local only when the human asked for nearby or pickup.
  • In-person offers outside pickup radius: refuse.
  • Envelope: ok, api_version, data or error / 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.14

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for walla-cli 0.1.14
File Size Uploaded Provenance Actions
walla_cli-0.1.14.tar.gz 4.4 MB Without provenance Details for walla_cli-0.1.14.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for walla-cli 0.1.14
File Interpreter ABI Platform Actions
walla_cli-0.1.14-py3-none-any.whl Python 3 none any Details for walla_cli-0.1.14-py3-none-any.whl

Total release size: 4.4 MB

Release files / walla_cli-0.1.14.tar.gz

Download URL walla_cli-0.1.14.tar.gz
Size 4.4 MB
Tags Source
SHA-256 checksum
How to use checksums
3db31faa751c028f8ffb9e9c8363fef1a4c87dc007e789d6bc11b599f303d17a
BLAKE2b-256 checksum
How to use checksums
1bea254f844d05f1252721cbb32cfa782ee4964165f29c528d8bfb43b0c00208
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.14-py3-none-any.whl

Download URL walla_cli-0.1.14-py3-none-any.whl
Size 87.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8daad833d83e55f94ead52bab4e3d90953b77b7e56fa2d0c0f1b3978c3870ba9
BLAKE2b-256 checksum
How to use checksums
bb7d64f580023669de6d46a3db3029b52e7ec3b4175696627fde576a66207b0b
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.14

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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page