Install
openclaw skills install @upkuajing/b2b-outreachB2B outreach toolkit: send bulk cold email and global SMS, harvest Google Maps merchants, and validate contact info (phone/WhatsApp, email, domain) before reaching out. Monitor email/SMS delivery status, cleanse CRM contact lists, and run end-to-end cross-border outreach campaigns. Trigger: bulk cold email, email send, email open rate tracker, business domain emails, mass mail for exporters, global bulk SMS, two-way SMS replies, SMS delivery reports, cross-border SMS marketing, Google maps business scraper, merchant data download, radius-based lead search, distributor sourcing, phone number validation, WhatsApp status check, email address validation, domain validity security check, CRM data cleansing, bulk SMS pre-verification, B2B outreach campaign
openclaw skills install @upkuajing/b2b-outreachAggregate skill for outbound engagement: email + SMS + map merchant harvesting + contact validation. 11 scripts, flat layout (no indexes - script count is small enough to list directly).
Four capability groups:
| Group | Scripts | Purpose |
|---|---|---|
| mail_send, mail_task_list, mail_task_record_list | Bulk cold email + delivery tracking | |
| SMS | sms_send, sms_task_list, sms_task_record_list | Global SMS (two-way) + delivery tracking |
| Map merchants | merchants_search, geography_list | Google Maps business data harvesting |
| Validation | phone_validity_check, email_validity_check, domain_validity_check | Clean/verify contacts before outreach |
python --versionpip install -r requirements.txtScript directory: scripts/*.py
Important: Always use direct script invocation like python scripts/mail_send.py. Do NOT use shell compound commands like cd scripts && python mail_send.py.
mail_send.py - Send emailsSend emails to one or many recipients.
python scripts/mail_send.py \
--subject "Test Email" \
--content "This is the email content" \
--emails '["recipient@example.com"]'
mail_task_list.py - Email task listView email tasks with optional time-range / status filter.
python scripts/mail_task_list.py --page_no 1 --page_size 10
mail_task_record_list.py - Email task recordsView delivery records for a specific email task.
python scripts/mail_task_record_list.py --task_id 1496 --page_no 1 --page_size 10
sms_send.py - Send SMSSend SMS to phone numbers; --channel_type 1 enables two-way (reply) mode.
python scripts/sms_send.py \
--content "This is SMS content" \
--phones '["13800138000"]'
sms_task_list.py - SMS task listpython scripts/sms_task_list.py --page_no 1 --page_size 10
sms_task_record_list.py - SMS task recordspython scripts/sms_task_record_list.py --task_id 1496 --page_no 1 --page_size 10
merchants_search.py - Merchant searchSearch Google Maps merchants by keywords + location. Two modes: country/province/city search, or nearby (lat/lon + radius via geoDistance).
python scripts/merchants_search.py \
--params '{"keywords":["restaurant"],"countryCodes":["BR"]}' \
--query_count 100
geography_list.py - Geography listGet country/province/city IDs to build merchants_search parameters.
python scripts/geography_list.py --type country
python scripts/geography_list.py --type province --country_id 1
python scripts/geography_list.py --type city --country_id 1
phone_validity_check.py - Phone validityCheck phone validity, type, and WhatsApp registration status.
python scripts/phone_validity_check.py --phones "+8613812345678 +14155551234"
email_validity_check.py - Email validityCheck email address validity / deliverability.
python scripts/email_validity_check.py --emails "a@example.com b@example.com"
domain_validity_check.py - Domain validityCheck domain validity and security.
python scripts/domain_validity_check.py --domains "example.com foo.org"
The signature workflow this aggregate enables (clean -> reach -> monitor):
merchants_search (map), or receive from b2b-lead-generation (decision-maker lookup).phone_validity_check / email_validity_check / domain_validity_check to drop invalid contacts. (Reduces wasted sends & fees.)mail_send (cold email) and/or sms_send (global SMS, two-way for replies).mail_task_list / sms_task_list -> *_task_record_list to check delivery status.Validation is itself billable - but it is far cheaper than sending to dead contacts. Inform the user of the validation cost first.
This skill requires an API key, stored in ~/.upkuajing/.env:
cat ~/.upkuajing/.env
UPKUAJING_API_KEY=your_api_key_here
First check if ~/.upkuajing/.env has UPKUAJING_API_KEY. If not, prompt the user to choose:
~/.upkuajing/.env)auth.py --new_key (auto-saved to ~/.upkuajing/.env)Wait for user selection.
When API response indicates insufficient balance:
auth.py --new_rec_order)python scripts/auth.py --account_info
Newly applied keys must be registered/bound at UpKuaJing Open Platform.
When an API call fails or returns abnormal data (server error, timeout, malformed response, etc.), explain the anomaly to the user in natural language and ask whether to report it to the platform for troubleshooting. Only run the report after user confirmation:
python scripts/error_report.py --params '{"requestPath":"/agent/mail/send","requestId":"f47ac10b58cc4372a5670e02b2c3d479","context":"Email send failed with a server error"}'
Send/search/validate calls incur fees; task list & record list queries are free.
Latest pricing: visit Detailed Price Description, or run:
python scripts/auth.py --price_info
(returns complete pricing for all interfaces - the aggregate auth.py queries the full price list and falls back to per-original-skill lookup if needed.)
ceil(query_count / 100).geography_list; all *_task_list / *_task_record_list.references/<xxx>-api.md.Any operation that incurs fees must first inform the user and wait for explicit confirmation in a separate message. Do not execute in the same message as the notification. When query_count exceeds one page, inform the user of the expected number of calls first.
UPKUAJING_API_KEY in ~/.upkuajing/.envreferences/ - get correct parameter names/formats from documentation, do not guesspython scripts/error_report.py (see Report Skill Call Errors)SMS
Map merchants
Validation (prefixed validity- to distinguish from email-send docs)
status via task records. Email status: 0-pending 1-sending 2-completed. SMS status: 1-sending 2-completed 3-failed 4-partial.task_data/ stores results under UUID subdirectories.auth.py --price_info for accurate pricing.references/<xxx>-api.md first.Other UpKuaJing skills you might find useful: