{
  "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": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/sensorpro",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=sensorpro",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "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."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "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."
        },
        {
          "label": "Upgrade existing",
          "body": "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."
        }
      ]
    },
    "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."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/sensorpro",
    "agentPageUrl": "https://openagent3.xyz/skills/sensorpro/agent",
    "manifestUrl": "https://openagent3.xyz/skills/sensorpro/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/sensorpro/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "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."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "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."
      },
      {
        "label": "Upgrade existing",
        "body": "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."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Setup (required)",
        "body": "Set these environment variables in your OpenClaw .env (or in the shell before running curl):\n\nSENSORPRO_API_KEY — API key for the x-apikey header\nSENSORPRO_ORG — organization code/name\nSENSORPRO_USER — API username (must be an API user)\nSENSORPRO_PASS — API user password"
      },
      {
        "title": "How to get the API key",
        "body": "From the Sensorpro UI:\n\nGo to API → API keys\nSelect “Sensorpro rest API default key”\nCopy the key value into SENSORPRO_API_KEY\nIf your API key is IP-restricted, whitelist the calling IP (the machine running OpenClaw)\n\nThe key is passed as an HTTP header:\n\nx-apikey: $SENSORPRO_API_KEY"
      },
      {
        "title": "How to create an API user",
        "body": "Sensorpro distinguishes between UI users and API users:\n\nAPI users have no UI access but can use the REST API.\nNormal users have UI access but typically cannot use the REST API.\n\nCreate a dedicated API user in Sensorpro and set:\n\nSENSORPRO_USER to that username\nSENSORPRO_PASS to that password"
      },
      {
        "title": "Safe secret handling (important)",
        "body": "Put secrets in ~/.openclaw/.env (or your process manager), not in SKILL.md.\nDon’t commit .env to git.\nRotate the API key if it’s ever pasted into a public place."
      },
      {
        "title": "Global gotchas",
        "body": "IP allowlisting: Sensorpro REST API can be locked to whitelisted IPs.\nEvery response includes Result.TotalErrors; treat 0 as success.\nSignin token (Token) must be used in the URL path for most endpoints.\nLogoff: server may require a body (HTTP 411 otherwise). Use -d '{}'."
      },
      {
        "title": "Quick workflow pattern (recommended)",
        "body": "Signin once → store TOKEN\nMake one or more API calls\nLogoff\n\nExample (bash):\n\nTOKEN=$(curl -sS -X POST \"https://apinie.sensorpro.net/auth/sys/signin\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-apikey: ${SENSORPRO_API_KEY}\" \\\n  -d \"{\\\"Organization\\\":\\\"${SENSORPRO_ORG}\\\",\\\"User\\\":\\\"${SENSORPRO_USER}\\\",\\\"Password\\\":\\\"${SENSORPRO_PASS}\\\"}\" \\\n| python3 -c 'import sys,json; print(json.load(sys.stdin).get(\"Token\",\"\"))')\n\n# Call an endpoint (example)\ncurl -sS -X POST \"https://apinie.sensorpro.net/api/Contact/UpdateAdd/${TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"AddToList\":[],\"Contact\":[{\"PersonalEMail\":\"someone@example.com\"}],\"Options\":{\"Parameters\":{},\"Action\":\"\"},\"ReturnFailedRequests\":false,\"UpdateByKey\":\"email\",\"SendWelcomeEmail\":false,\"SignupFormId\":\"00000000-0000-0000-0000-000000000000\"}'\n\n# Log off (some servers require a body)\ncurl -sS -X POST \"https://apinie.sensorpro.net/auth/sys/logoff/${TOKEN}\" \\\n  -H \"Content-Type: application/json\" -d '{}'"
      },
      {
        "title": "Authentication",
        "body": "POST https://apinie.sensorpro.net/auth/sys/signin  (header x-apikey required)\nPOST https://apinie.sensorpro.net/auth/sys/logoff/[Token]"
      },
      {
        "title": "Contacts (token required)",
        "body": "Base: https://apinie.sensorpro.net/api/Contact/<Endpoint>/[Token]\n\nUpdateAdd (recommended)\nAdd, Update\nGetContacts, GetContactsPaged\nUpdateAddAsync, GetUpdateAddAsyncStatus\nChangeStatus, ChangeOptOutStatus\nDeleteContacts, ForgetMe"
      },
      {
        "title": "Campaigns + sending",
        "body": "Base: https://apinie.sensorpro.net/api/campaign/<Endpoint>/[Token] (note casing differs for some Get endpoints)\n\nAddCampaign, AddDesign, AddSegment, AddBroadcast"
      },
      {
        "title": "Campaign results / metrics",
        "body": "POST https://apinie.sensorpro.net/api/Campaign/GetBroadcastStatus/[Token]\nPOST https://apinie.sensorpro.net/api/campaign/GetCampaignResults/[Token]\nPOST https://apinie.sensorpro.net/api/campaign/GetCampaignResultsLinks/[Token]"
      },
      {
        "title": "Relay Email",
        "body": "POST https://apinie.sensorpro.net/api/Email/SendEmail/[Token]"
      },
      {
        "title": "Imports",
        "body": "POST https://apinie.sensorpro.net/api/import/ExecuteFTPImport/[Token]\nPOST https://apinie.sensorpro.net/api/import/GetImportStatus/[Token]\nPOST https://apinie.sensorpro.net/api/import/ClearTagList/[Token]"
      },
      {
        "title": "Account",
        "body": "POST https://apinie.sensorpro.net/api/Account/AddSubOrganization/[Token]\nPOST https://apinie.sensorpro.net/api/Account/AddUpdateUser/[Token]"
      },
      {
        "title": "Signin (manual curl)",
        "body": "curl -sS -X POST \"https://apinie.sensorpro.net/auth/sys/signin\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-apikey: ${SENSORPRO_API_KEY}\" \\\n  -d '{\"Organization\":\"'\"${SENSORPRO_ORG}\"'\",\"User\":\"'\"${SENSORPRO_USER}\"'\",\"Password\":\"'\"${SENSORPRO_PASS}\"'\"}'"
      },
      {
        "title": "Contacts: UpdateAdd (add/update by email)",
        "body": "curl -sS -X POST \"https://apinie.sensorpro.net/api/Contact/UpdateAdd/${TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"AddToList\": [],\n    \"Contact\": [{\"PersonalEMail\":\"someone@example.com\",\"FirstName\":\"\",\"LastName\":\"\"}],\n    \"Options\":{\"Parameters\":{},\"Action\":\"\"},\n    \"ReturnFailedRequests\": true,\n    \"UpdateByKey\": \"email\",\n    \"SendWelcomeEmail\": false,\n    \"SignupFormId\": \"00000000-0000-0000-0000-000000000000\"\n  }'"
      },
      {
        "title": "Campaign metrics: GetCampaignResults",
        "body": "curl -sS -X POST \"https://apinie.sensorpro.net/api/campaign/GetCampaignResults/${TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"CampaignId\": 53}'"
      },
      {
        "title": "Relay: SendEmail (one-off)",
        "body": "curl -sS -X POST \"https://apinie.sensorpro.net/api/Email/SendEmail/${TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"From\": {\"DisplayName\":\"Marketing\",\"Email\":\"marketing@myco.net\"},\n    \"To\": [{\"DisplayName\":\"\",\"Email\":\"recipient@example.com\"}],\n    \"Cc\": [],\n    \"Bcc\": [],\n    \"Headers\": {},\n    \"ReplyTo\": null,\n    \"ReturnPath\": null,\n    \"Subject\": \"Hello\",\n    \"HTMLMessageStyle\": \"\",\n    \"HTMLMessageEncoded\": \"<html><body><p>Hello</p></body></html>\",\n    \"PlainTextMessage\": \"Hello\",\n    \"MsgType\": 0,\n    \"MailEncoding\": \"UTF8\",\n    \"Schedule\": {\"DelayByMinutes\": 0, \"DelayUntilUTC\": \"\"}\n  }'"
      }
    ],
    "body": "Use this skill to manage your Sensorpro email marketing account in OpenClaw.\n\nOfficial docs:\n\nHome: https://sensorpro.net/api/\nContacts: https://sensorpro.net/api/contacts.html\nCampaigns + metrics: https://sensorpro.net/api/campaigns.html\nRelay Email: https://sensorpro.net/api/sendemail.html\nImports: https://www.sensorpro.net/api/imports.html\nAccount: https://sensorpro.net/api/account.html\nSetup (required)\n\nSet these environment variables in your OpenClaw .env (or in the shell before running curl):\n\nSENSORPRO_API_KEY — API key for the x-apikey header\nSENSORPRO_ORG — organization code/name\nSENSORPRO_USER — API username (must be an API user)\nSENSORPRO_PASS — API user password\nHow to get the API key\n\nFrom the Sensorpro UI:\n\nGo to API → API keys\nSelect “Sensorpro rest API default key”\nCopy the key value into SENSORPRO_API_KEY\nIf your API key is IP-restricted, whitelist the calling IP (the machine running OpenClaw)\n\nThe key is passed as an HTTP header:\n\nx-apikey: $SENSORPRO_API_KEY\nHow to create an API user\n\nSensorpro distinguishes between UI users and API users:\n\nAPI users have no UI access but can use the REST API.\nNormal users have UI access but typically cannot use the REST API.\n\nCreate a dedicated API user in Sensorpro and set:\n\nSENSORPRO_USER to that username\nSENSORPRO_PASS to that password\nSafe secret handling (important)\nPut secrets in ~/.openclaw/.env (or your process manager), not in SKILL.md.\nDon’t commit .env to git.\nRotate the API key if it’s ever pasted into a public place.\nGlobal gotchas\nIP allowlisting: Sensorpro REST API can be locked to whitelisted IPs.\nEvery response includes Result.TotalErrors; treat 0 as success.\nSignin token (Token) must be used in the URL path for most endpoints.\nLogoff: server may require a body (HTTP 411 otherwise). Use -d '{}'.\nQuick workflow pattern (recommended)\nSignin once → store TOKEN\nMake one or more API calls\nLogoff\n\nExample (bash):\n\nTOKEN=$(curl -sS -X POST \"https://apinie.sensorpro.net/auth/sys/signin\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-apikey: ${SENSORPRO_API_KEY}\" \\\n  -d \"{\\\"Organization\\\":\\\"${SENSORPRO_ORG}\\\",\\\"User\\\":\\\"${SENSORPRO_USER}\\\",\\\"Password\\\":\\\"${SENSORPRO_PASS}\\\"}\" \\\n| python3 -c 'import sys,json; print(json.load(sys.stdin).get(\"Token\",\"\"))')\n\n# Call an endpoint (example)\ncurl -sS -X POST \"https://apinie.sensorpro.net/api/Contact/UpdateAdd/${TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"AddToList\":[],\"Contact\":[{\"PersonalEMail\":\"someone@example.com\"}],\"Options\":{\"Parameters\":{},\"Action\":\"\"},\"ReturnFailedRequests\":false,\"UpdateByKey\":\"email\",\"SendWelcomeEmail\":false,\"SignupFormId\":\"00000000-0000-0000-0000-000000000000\"}'\n\n# Log off (some servers require a body)\ncurl -sS -X POST \"https://apinie.sensorpro.net/auth/sys/logoff/${TOKEN}\" \\\n  -H \"Content-Type: application/json\" -d '{}'\n\nCore endpoints (cheat sheet)\nAuthentication\nPOST https://apinie.sensorpro.net/auth/sys/signin (header x-apikey required)\nPOST https://apinie.sensorpro.net/auth/sys/logoff/[Token]\nContacts (token required)\n\nBase: https://apinie.sensorpro.net/api/Contact/<Endpoint>/[Token]\n\nUpdateAdd (recommended)\nAdd, Update\nGetContacts, GetContactsPaged\nUpdateAddAsync, GetUpdateAddAsyncStatus\nChangeStatus, ChangeOptOutStatus\nDeleteContacts, ForgetMe\nCampaigns + sending\n\nBase: https://apinie.sensorpro.net/api/campaign/<Endpoint>/[Token] (note casing differs for some Get endpoints)\n\nAddCampaign, AddDesign, AddSegment, AddBroadcast\nCampaign results / metrics\nPOST https://apinie.sensorpro.net/api/Campaign/GetBroadcastStatus/[Token]\nPOST https://apinie.sensorpro.net/api/campaign/GetCampaignResults/[Token]\nPOST https://apinie.sensorpro.net/api/campaign/GetCampaignResultsLinks/[Token]\nRelay Email\nPOST https://apinie.sensorpro.net/api/Email/SendEmail/[Token]\nImports\nPOST https://apinie.sensorpro.net/api/import/ExecuteFTPImport/[Token]\nPOST https://apinie.sensorpro.net/api/import/GetImportStatus/[Token]\nPOST https://apinie.sensorpro.net/api/import/ClearTagList/[Token]\nAccount\nPOST https://apinie.sensorpro.net/api/Account/AddSubOrganization/[Token]\nPOST https://apinie.sensorpro.net/api/Account/AddUpdateUser/[Token]\nExamples\nSignin (manual curl)\ncurl -sS -X POST \"https://apinie.sensorpro.net/auth/sys/signin\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-apikey: ${SENSORPRO_API_KEY}\" \\\n  -d '{\"Organization\":\"'\"${SENSORPRO_ORG}\"'\",\"User\":\"'\"${SENSORPRO_USER}\"'\",\"Password\":\"'\"${SENSORPRO_PASS}\"'\"}'\n\nContacts: UpdateAdd (add/update by email)\ncurl -sS -X POST \"https://apinie.sensorpro.net/api/Contact/UpdateAdd/${TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"AddToList\": [],\n    \"Contact\": [{\"PersonalEMail\":\"someone@example.com\",\"FirstName\":\"\",\"LastName\":\"\"}],\n    \"Options\":{\"Parameters\":{},\"Action\":\"\"},\n    \"ReturnFailedRequests\": true,\n    \"UpdateByKey\": \"email\",\n    \"SendWelcomeEmail\": false,\n    \"SignupFormId\": \"00000000-0000-0000-0000-000000000000\"\n  }'\n\nCampaign metrics: GetCampaignResults\ncurl -sS -X POST \"https://apinie.sensorpro.net/api/campaign/GetCampaignResults/${TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"CampaignId\": 53}'\n\nRelay: SendEmail (one-off)\ncurl -sS -X POST \"https://apinie.sensorpro.net/api/Email/SendEmail/${TOKEN}\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"From\": {\"DisplayName\":\"Marketing\",\"Email\":\"marketing@myco.net\"},\n    \"To\": [{\"DisplayName\":\"\",\"Email\":\"recipient@example.com\"}],\n    \"Cc\": [],\n    \"Bcc\": [],\n    \"Headers\": {},\n    \"ReplyTo\": null,\n    \"ReturnPath\": null,\n    \"Subject\": \"Hello\",\n    \"HTMLMessageStyle\": \"\",\n    \"HTMLMessageEncoded\": \"<html><body><p>Hello</p></body></html>\",\n    \"PlainTextMessage\": \"Hello\",\n    \"MsgType\": 0,\n    \"MailEncoding\": \"UTF8\",\n    \"Schedule\": {\"DelayByMinutes\": 0, \"DelayUntilUTC\": \"\"}\n  }'"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/forcequit/sensorpro",
    "publisherUrl": "https://clawhub.ai/forcequit/sensorpro",
    "owner": "forcequit",
    "version": "0.2.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "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"
  }
}