Install
openclaw skills install rappi-orderingAssisted Rappi ordering through the local openclaw-rappi HTTP service. Use when the user asks to order food, groceries, pharmacy, convenience items, lunch, snacks, household basics, or anything “por Rappi”. The skill structures the request, creates a cart draft in visible Chrome, summarizes cart/checkout, prepares review handoff, sends a native approval button when available, and submits the final purchase only after exact explicit approval in the current chat.
openclaw skills install rappi-orderingUse the local service at http://127.0.0.1:4777 unless configured otherwise.
GET /health before the first order in a session.GET /health:set -euo pipefail
INSTALL_DIR="${OPENCLAW_RAPPI_DIR:-$HOME/.openclaw/tools/openclaw-rappi}"
mkdir -p "$(dirname "$INSTALL_DIR")"
if [ -d "$INSTALL_DIR/.git" ]; then
git -C "$INSTALL_DIR" pull --ff-only
else
git clone https://github.com/zarruk/openclaw-rappi.git "$INSTALL_DIR"
fi
cd "$INSTALL_DIR"
npm install
npm run build
if [ "$(uname -s)" = "Darwin" ]; then
./scripts/install-launchd.sh
else
mkdir -p logs
nohup npm start > logs/service.out.log 2> logs/service.err.log &
fi
npm install -g openclaw-rappi; the public distribution is GitHub + ClawHub, not npm.mkdir -p "$HOME/.openclaw/rappi-chrome-profile"
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--remote-debugging-port=9222 \
--user-data-dir="$HOME/.openclaw/rappi-chrome-profile" \
--no-first-run --no-default-browser-check \
https://www.rappi.com.co/
Pedir, Pagar, Confirmar compra, Realizar pedido, Place order, or equivalents) unless the user has explicitly approved that exact order in the current chat after receiving the checkout summary.APRUEBO COMPRA RAPPI <draftId>.buttons, never only as a plain assistant reply. Button label: Aprobar compra; callback_data: APRUEBO COMPRA RAPPI <draftId>.APRUEBO COMPRA RAPPI <draftId> as explicit approval for that draft.POST /drafts/:id/confirm-purchase with the exact approval text. Do not manually click final purchase buttons through browser automation unless the service endpoint is unavailable and the user explicitly approves that fallback in the same chat.category: restaurant, grocery, pharmacy, convenience, or unknown.items: names, quantities, notes.preferences: budget, dietary preferences, preferred store, address hint, substitution policy.handoffTarget: "checkout". Otherwise use handoffTarget: "cart".safety: always { "requireHumanFinalCheckout": true, "restrictedItemsAllowed": false }.POST /drafts.GET /drafts/:id occasionally until status is cart_ready, checkout_ready, needs_user_input, blocked, or failed.handoffTarget is cart, ask whether to prepare checkout for review.POST /drafts/:id/prepare-checkout, then poll again.{
"action": "send",
"channel": "telegram",
"target": "telegram:<chat-id>",
"message": "<checkout summary>\n\nAPRUEBO COMPRA RAPPI <draftId>",
"buttons": [[{"text":"Aprobar compra","callback_data":"APRUEBO COMPRA RAPPI <draftId>","style":"success"}]]
}
If using message action=send for the user-visible approval request, reply with NO_REPLY in the main assistant response to avoid duplicate messages.
curl -X POST http://127.0.0.1:4777/drafts/<draftId>/confirm-purchase \
-H 'Content-Type: application/json' \
-d '{"approvalText":"APRUEBO COMPRA RAPPI <draftId>","approvedBy":"user"}'
GET /healthGET /capabilitiesPOST /draftsPOST /drafts/adopt-checkout — advanced recovery endpoint for adopting a currently visible checkout screen into a new draft; use only when the service lost draft state but Rappi is already at checkout.GET /drafts/:idPOST /drafts/:id/prepare-checkoutPOST /drafts/:id/confirm-purchasePOST /drafts/:id/cancelExample POST /drafts body:
{
"requestText": "Quiero algo saludable por menos de 80 mil",
"category": "restaurant",
"items": [
{ "name": "algo saludable", "quantity": 1, "notes": "máximo 80000 COP" }
],
"preferences": {
"budgetMax": 80000,
"dietary": [],
"allowSubstitutions": false,
"handoffTarget": "cart"
},
"safety": {
"requireHumanFinalCheckout": true,
"restrictedItemsAllowed": false
}
}