# Send sensorpro.app to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "sensorpro",
    "name": "sensorpro.app",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/forcequit/sensorpro",
    "canonicalUrl": "https://clawhub.ai/forcequit/sensorpro",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/sensorpro",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=sensorpro",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "slug": "sensorpro",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-02T03:16:56.187Z",
      "expiresAt": "2026-05-09T03:16:56.187Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=sensorpro",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=sensorpro",
        "contentDisposition": "attachment; filename=\"sensorpro-0.2.3.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "sensorpro"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/sensorpro"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/sensorpro",
    "downloadUrl": "https://openagent3.xyz/downloads/sensorpro",
    "agentUrl": "https://openagent3.xyz/skills/sensorpro/agent",
    "manifestUrl": "https://openagent3.xyz/skills/sensorpro/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/sensorpro/agent.md"
  }
}
```
## Documentation

### 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 header
SENSORPRO_ORG — organization code/name
SENSORPRO_USER — API username (must be an API user)
SENSORPRO_PASS — API user password

### How to get the API key

From the Sensorpro UI:

Go to API → API keys
Select “Sensorpro rest API default key”
Copy the key value into SENSORPRO_API_KEY
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_KEY

### How to create an API user

Sensorpro distinguishes between UI users and API users:

API users have no UI access but can use the REST API.
Normal users have UI access but typically cannot use the REST API.

Create a dedicated API user in Sensorpro and set:

SENSORPRO_USER to that username
SENSORPRO_PASS to that password

### Safe secret handling (important)

Put secrets in ~/.openclaw/.env (or your process manager), not in SKILL.md.
Don’t commit .env to git.
Rotate the API key if it’s ever pasted into a public place.

### Global gotchas

IP allowlisting: Sensorpro REST API can be locked to whitelisted IPs.
Every response includes Result.TotalErrors; treat 0 as success.
Signin token (Token) must be used in the URL path for most endpoints.
Logoff: server may require a body (HTTP 411 otherwise). Use -d '{}'.

### Quick workflow pattern (recommended)

Signin once → store TOKEN
Make one or more API calls
Logoff

Example (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 '{}'

### 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/<Endpoint>/[Token]

UpdateAdd (recommended)
Add, Update
GetContacts, GetContactsPaged
UpdateAddAsync, GetUpdateAddAsyncStatus
ChangeStatus, ChangeOptOutStatus
DeleteContacts, ForgetMe

### Campaigns + sending

Base: https://apinie.sensorpro.net/api/campaign/<Endpoint>/[Token] (note casing differs for some Get endpoints)

AddCampaign, AddDesign, AddSegment, AddBroadcast

### Campaign 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]

### 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": "<html><body><p>Hello</p></body></html>",
    "PlainTextMessage": "Hello",
    "MsgType": 0,
    "MailEncoding": "UTF8",
    "Schedule": {"DelayByMinutes": 0, "DelayUntilUTC": ""}
  }'
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: forcequit
- Version: 0.2.3
## Source health
- Status: healthy
- Item download looks usable.
- Yavira can redirect you to the upstream package for this item.
- Health scope: item
- Reason: direct_download_ok
- Checked at: 2026-05-02T03:16:56.187Z
- Expires at: 2026-05-09T03:16:56.187Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/sensorpro)
- [Send to Agent page](https://openagent3.xyz/skills/sensorpro/agent)
- [JSON manifest](https://openagent3.xyz/skills/sensorpro/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/sensorpro/agent.md)
- [Download page](https://openagent3.xyz/downloads/sensorpro)