π¦ ClawHub
sensorpro.app
by @forcequit
Manage your Sensorpro email marketing account in OpenClaw.
TERMINAL
clawhub install sensorproπ About This Skill
name: sensorpro description: "Manage your Sensorpro email marketing account in OpenClaw." metadata: openclaw: emoji: "π¨" homepage: "https://github.com/forcequit/openclaw-sensorpro" requires: env: ["SENSORPRO_API_KEY","SENSORPRO_ORG","SENSORPRO_USER","SENSORPRO_PASS"] bins: ["curl","python3"] primaryEnv: "SENSORPRO_API_KEY"
Use this skill to manage your Sensorpro email marketing account in OpenClaw.
Official docs:
Setup (required)
Set these environment variables in your OpenClaw.env (or in the shell before running curl):SENSORPRO_API_KEY β API key for the x-apikey headerSENSORPRO_ORG β organization code/nameSENSORPRO_USER β API username (must be an API user)SENSORPRO_PASS β API user passwordHow to get the API key
From the Sensorpro UI: 1) Go to API β API keys 2) Select βSensorpro rest API default keyβ 3) Copy the key value intoSENSORPRO_API_KEY
4) If your API key is IP-restricted, whitelist the calling IP (the machine running OpenClaw)The key is passed as an HTTP header:
x-apikey: $SENSORPRO_API_KEYHow to create an API user
Sensorpro distinguishes between UI users and API users:Create a dedicated API user in Sensorpro and set:
SENSORPRO_USER to that usernameSENSORPRO_PASS to that passwordSafe secret handling (important)
~/.openclaw/.env (or your process manager), not in SKILL.md..env to git.Global gotchas
Result.TotalErrors; treat 0 as success.Token) must be used in the URL path for most endpoints.-d '{}'.Quick workflow pattern (recommended)
1) Signin once β storeTOKEN
2) Make one or more API calls
3) LogoffExample (bash):
TOKEN=$(curl -sS -X POST "https://apinie.sensorpro.net/auth/sys/signin" \
-H "Content-Type: application/json" \
-H "x-apikey: ${SENSORPRO_API_KEY}" \
-d "{\"Organization\":\"${SENSORPRO_ORG}\",\"User\":\"${SENSORPRO_USER}\",\"Password\":\"${SENSORPRO_PASS}\"}" \
| python3 -c 'import sys,json; print(json.load(sys.stdin).get("Token",""))')Call an endpoint (example)
curl -sS -X POST "https://apinie.sensorpro.net/api/Contact/UpdateAdd/${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"AddToList":[],"Contact":[{"PersonalEMail":"someone@example.com"}],"Options":{"Parameters":{},"Action":""},"ReturnFailedRequests":false,"UpdateByKey":"email","SendWelcomeEmail":false,"SignupFormId":"00000000-0000-0000-0000-000000000000"}'Log off (some servers require a body)
curl -sS -X POST "https://apinie.sensorpro.net/auth/sys/logoff/${TOKEN}" \
-H "Content-Type: application/json" -d '{}'
Core endpoints (cheat sheet)
Authentication
POST https://apinie.sensorpro.net/auth/sys/signin (header x-apikey required)POST https://apinie.sensorpro.net/auth/sys/logoff/[Token]Contacts (token required)
Base:https://apinie.sensorpro.net/api/Contact//[Token]
UpdateAdd (recommended)Add, UpdateGetContacts, GetContactsPagedUpdateAddAsync, GetUpdateAddAsyncStatusChangeStatus, ChangeOptOutStatusDeleteContacts, ForgetMeCampaigns + sending
Base:https://apinie.sensorpro.net/api/campaign//[Token] (note casing differs for some Get endpoints)
AddCampaign, AddDesign, AddSegment, AddBroadcastCampaign results / metrics
POST https://apinie.sensorpro.net/api/Campaign/GetBroadcastStatus/[Token]POST https://apinie.sensorpro.net/api/campaign/GetCampaignResults/[Token]POST https://apinie.sensorpro.net/api/campaign/GetCampaignResultsLinks/[Token]Relay Email
POST https://apinie.sensorpro.net/api/Email/SendEmail/[Token]Imports
POST https://apinie.sensorpro.net/api/import/ExecuteFTPImport/[Token]POST https://apinie.sensorpro.net/api/import/GetImportStatus/[Token]POST https://apinie.sensorpro.net/api/import/ClearTagList/[Token]Account
POST https://apinie.sensorpro.net/api/Account/AddSubOrganization/[Token]POST https://apinie.sensorpro.net/api/Account/AddUpdateUser/[Token]Examples
Signin (manual curl)
curl -sS -X POST "https://apinie.sensorpro.net/auth/sys/signin" \
-H "Content-Type: application/json" \
-H "x-apikey: ${SENSORPRO_API_KEY}" \
-d '{"Organization":"'"${SENSORPRO_ORG}"'","User":"'"${SENSORPRO_USER}"'","Password":"'"${SENSORPRO_PASS}"'"}'
Contacts: UpdateAdd (add/update by email)
curl -sS -X POST "https://apinie.sensorpro.net/api/Contact/UpdateAdd/${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"AddToList": [],
"Contact": [{"PersonalEMail":"someone@example.com","FirstName":"","LastName":""}],
"Options":{"Parameters":{},"Action":""},
"ReturnFailedRequests": true,
"UpdateByKey": "email",
"SendWelcomeEmail": false,
"SignupFormId": "00000000-0000-0000-0000-000000000000"
}'
Campaign metrics: GetCampaignResults
curl -sS -X POST "https://apinie.sensorpro.net/api/campaign/GetCampaignResults/${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"CampaignId": 53}'
Relay: SendEmail (one-off)
curl -sS -X POST "https://apinie.sensorpro.net/api/Email/SendEmail/${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"From": {"DisplayName":"Marketing","Email":"marketing@myco.net"},
"To": [{"DisplayName":"","Email":"recipient@example.com"}],
"Cc": [],
"Bcc": [],
"Headers": {},
"ReplyTo": null,
"ReturnPath": null,
"Subject": "Hello",
"HTMLMessageStyle": "",
"HTMLMessageEncoded": "Hello
",
"PlainTextMessage": "Hello",
"MsgType": 0,
"MailEncoding": "UTF8",
"Schedule": {"DelayByMinutes": 0, "DelayUntilUTC": ""}
}'