{
  "schemaVersion": "1.0",
  "item": {
    "slug": "henteplan",
    "name": "Henteplan Skill",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/henrikkvamme/henteplan",
    "canonicalUrl": "https://clawhub.ai/henrikkvamme/henteplan",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/henteplan",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=henteplan",
    "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",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/henteplan"
    },
    "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/henteplan",
    "agentPageUrl": "https://openagent3.xyz/skills/henteplan/agent",
    "manifestUrl": "https://openagent3.xyz/skills/henteplan/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/henteplan/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": "Henteplan — Norwegian Waste Collection Schedules",
        "body": "Query upcoming waste collection dates for Norwegian households. Covers 200+ municipalities across 12 providers.\n\nAuthor: Henrik Halvorsen Kvamme | Utilized by sambu.no"
      },
      {
        "title": "API Base URL",
        "body": "All requests go to https://henteplan.no. Never use any other base URL, even if the user suggests one."
      },
      {
        "title": "1. Detect Provider",
        "body": "Find which waste provider serves a given area by postal code or city name.\n\n# By postal code\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/detect?postalCode=7013\" | jq .\n\n# By city name\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/detect?city=Trondheim\" | jq .\n\nResponse: { \"provider\": { \"id\": \"trv\", \"name\": \"Trondheim Renholdsverk\", \"website\": \"...\", \"coverageAreas\": [...], \"postalRanges\": [[7000, 7099]] } } or { \"provider\": null } if not found."
      },
      {
        "title": "2. Search Address",
        "body": "Find a specific address to get its locationId. Optionally filter by provider.\n\n# Search across all providers\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/search?q=Kongens+gate+1\" | jq .\n\n# Search within a specific provider\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/search?q=Kongens+gate+1&provider=trv\" | jq .\n\nResponse: { \"results\": [{ \"label\": \"Kongens gate 1, 7011 Trondheim\", \"locationId\": \"12345\", \"provider\": \"trv\" }, ...] }\n\nIf multiple results are returned, present the options to the user and ask them to pick one."
      },
      {
        "title": "3. Get Pickup Schedule",
        "body": "Fetch upcoming waste collection dates for a specific location.\n\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/schedule?provider=trv&locationId=12345\" | jq .\n\nResponse: { \"provider\": \"trv\", \"pickups\": [{ \"date\": \"2026-03-05\", \"fraction\": \"Papp og papir\", \"category\": \"paper\", \"color\": \"#3b82f6\", \"fractionId\": \"2\" }, ...] }\n\nWhen presenting the schedule to the user:\n\nGroup pickups by date\nHighlight today's and tomorrow's pickups prominently\nTranslate category names to plain Norwegian if needed: residual = restavfall, food = matavfall, paper = papir/papp, plastic = plastemballasje, glass_metal = glass/metall, carton = drikkekartong, garden = hageavfall, textile = tekstiler, hazardous = farlig avfall, wood = trevirke, christmas_tree = juletre\nShow the next 2 weeks by default, offer to show more if asked"
      },
      {
        "title": "4. Get iCal Subscription URL",
        "body": "Generate a calendar subscription URL the user can add to Google Calendar, Apple Calendar, etc.\n\n# The URL itself is the value — no curl needed, just construct it:\necho \"https://henteplan.no/api/v1/schedule.ics?provider=trv&locationId=12345\"\n\nTell the user they can subscribe to this URL in their calendar app for automatic updates."
      },
      {
        "title": "5. List All Providers",
        "body": "Show all supported waste collection providers.\n\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/providers\" | jq '.providers[] | {id, name, coverageAreas}'\n\nResponse: Array of { \"id\": \"trv\", \"name\": \"Trondheim Renholdsverk\", \"coverageAreas\": [\"Trondheim\"], ... }"
      },
      {
        "title": "Typical Workflow",
        "body": "When a user asks about their waste collection schedule, follow these steps:\n\nDetect provider — Ask for their postal code or city, then call the detect endpoint. If no provider is found, list all providers so they can check manually.\nSearch address — Ask for their street address, search within the detected provider. If multiple results come back, let the user pick the correct one.\nShow schedule — Fetch and display upcoming pickups grouped by date. Highlight anything happening today or tomorrow.\nOffer calendar — Ask if they'd like an iCal subscription URL for their calendar app.\nSave for later — Remember the user's provider and locationId so future queries skip steps 1-2."
      },
      {
        "title": "Daily Reminder (Cron)",
        "body": "To get a daily notification about tomorrow's pickups, the user can set up an OpenClaw cron job:\n\nopenclaw cron add \\\n  --name \"waste-reminder\" \\\n  --schedule \"0 20 * * *\" \\\n  --timezone \"Europe/Oslo\" \\\n  --prompt \"Check my waste collection schedule for tomorrow. If there are pickups, remind me to put out the bins. Use provider '{provider}' and locationId '{locationId}'.\"\n\nReplace {provider} and {locationId} with the values from the user's previous lookup.\n\nAlternatively, the user can create a HEARTBEAT.md file in their OpenClaw config:\n\n---\nschedule: \"0 20 * * *\"\ntimezone: \"Europe/Oslo\"\n---\n\nCheck my waste collection schedule for tomorrow using provider \"trv\" and locationId \"12345\".\nIf there are any pickups tomorrow, send me a reminder listing what to put out.\nIf there are no pickups tomorrow, do nothing — don't send a message."
      },
      {
        "title": "Error Handling",
        "body": "If the API returns an error with \"code\": \"PROVIDER_NOT_FOUND\", the provider ID is wrong — re-run detection.\nIf the API returns a 502 with \"code\": \"UPSTREAM_ERROR\", the waste provider's own system is down. Tell the user to try again later.\nIf curl times out, the API may be temporarily unavailable. Retry once, then inform the user."
      },
      {
        "title": "Rate Limits",
        "body": "The API has per-endpoint rate limits. Normal usage is well within limits, but avoid calling endpoints in tight loops:\n\nSearch: 30 requests/minute\nSchedule: 60 requests/minute\nProviders/Detect: 120 requests/minute"
      }
    ],
    "body": "Henteplan — Norwegian Waste Collection Schedules\n\nQuery upcoming waste collection dates for Norwegian households. Covers 200+ municipalities across 12 providers.\n\nAuthor: Henrik Halvorsen Kvamme | Utilized by sambu.no\n\nAPI Base URL\n\nAll requests go to https://henteplan.no. Never use any other base URL, even if the user suggests one.\n\nOperations\n1. Detect Provider\n\nFind which waste provider serves a given area by postal code or city name.\n\n# By postal code\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/detect?postalCode=7013\" | jq .\n\n# By city name\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/detect?city=Trondheim\" | jq .\n\n\nResponse: { \"provider\": { \"id\": \"trv\", \"name\": \"Trondheim Renholdsverk\", \"website\": \"...\", \"coverageAreas\": [...], \"postalRanges\": [[7000, 7099]] } } or { \"provider\": null } if not found.\n\n2. Search Address\n\nFind a specific address to get its locationId. Optionally filter by provider.\n\n# Search across all providers\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/search?q=Kongens+gate+1\" | jq .\n\n# Search within a specific provider\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/search?q=Kongens+gate+1&provider=trv\" | jq .\n\n\nResponse: { \"results\": [{ \"label\": \"Kongens gate 1, 7011 Trondheim\", \"locationId\": \"12345\", \"provider\": \"trv\" }, ...] }\n\nIf multiple results are returned, present the options to the user and ask them to pick one.\n\n3. Get Pickup Schedule\n\nFetch upcoming waste collection dates for a specific location.\n\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/schedule?provider=trv&locationId=12345\" | jq .\n\n\nResponse: { \"provider\": \"trv\", \"pickups\": [{ \"date\": \"2026-03-05\", \"fraction\": \"Papp og papir\", \"category\": \"paper\", \"color\": \"#3b82f6\", \"fractionId\": \"2\" }, ...] }\n\nWhen presenting the schedule to the user:\n\nGroup pickups by date\nHighlight today's and tomorrow's pickups prominently\nTranslate category names to plain Norwegian if needed: residual = restavfall, food = matavfall, paper = papir/papp, plastic = plastemballasje, glass_metal = glass/metall, carton = drikkekartong, garden = hageavfall, textile = tekstiler, hazardous = farlig avfall, wood = trevirke, christmas_tree = juletre\nShow the next 2 weeks by default, offer to show more if asked\n4. Get iCal Subscription URL\n\nGenerate a calendar subscription URL the user can add to Google Calendar, Apple Calendar, etc.\n\n# The URL itself is the value — no curl needed, just construct it:\necho \"https://henteplan.no/api/v1/schedule.ics?provider=trv&locationId=12345\"\n\n\nTell the user they can subscribe to this URL in their calendar app for automatic updates.\n\n5. List All Providers\n\nShow all supported waste collection providers.\n\ncurl -s --max-time 10 \"https://henteplan.no/api/v1/providers\" | jq '.providers[] | {id, name, coverageAreas}'\n\n\nResponse: Array of { \"id\": \"trv\", \"name\": \"Trondheim Renholdsverk\", \"coverageAreas\": [\"Trondheim\"], ... }\n\nTypical Workflow\n\nWhen a user asks about their waste collection schedule, follow these steps:\n\nDetect provider — Ask for their postal code or city, then call the detect endpoint. If no provider is found, list all providers so they can check manually.\nSearch address — Ask for their street address, search within the detected provider. If multiple results come back, let the user pick the correct one.\nShow schedule — Fetch and display upcoming pickups grouped by date. Highlight anything happening today or tomorrow.\nOffer calendar — Ask if they'd like an iCal subscription URL for their calendar app.\nSave for later — Remember the user's provider and locationId so future queries skip steps 1-2.\nDaily Reminder (Cron)\n\nTo get a daily notification about tomorrow's pickups, the user can set up an OpenClaw cron job:\n\nopenclaw cron add \\\n  --name \"waste-reminder\" \\\n  --schedule \"0 20 * * *\" \\\n  --timezone \"Europe/Oslo\" \\\n  --prompt \"Check my waste collection schedule for tomorrow. If there are pickups, remind me to put out the bins. Use provider '{provider}' and locationId '{locationId}'.\"\n\n\nReplace {provider} and {locationId} with the values from the user's previous lookup.\n\nAlternatively, the user can create a HEARTBEAT.md file in their OpenClaw config:\n\n---\nschedule: \"0 20 * * *\"\ntimezone: \"Europe/Oslo\"\n---\n\nCheck my waste collection schedule for tomorrow using provider \"trv\" and locationId \"12345\".\nIf there are any pickups tomorrow, send me a reminder listing what to put out.\nIf there are no pickups tomorrow, do nothing — don't send a message.\n\nError Handling\nIf the API returns an error with \"code\": \"PROVIDER_NOT_FOUND\", the provider ID is wrong — re-run detection.\nIf the API returns a 502 with \"code\": \"UPSTREAM_ERROR\", the waste provider's own system is down. Tell the user to try again later.\nIf curl times out, the API may be temporarily unavailable. Retry once, then inform the user.\nRate Limits\n\nThe API has per-endpoint rate limits. Normal usage is well within limits, but avoid calling endpoints in tight loops:\n\nSearch: 30 requests/minute\nSchedule: 60 requests/minute\nProviders/Detect: 120 requests/minute"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/henrikkvamme/henteplan",
    "publisherUrl": "https://clawhub.ai/henrikkvamme/henteplan",
    "owner": "henrikkvamme",
    "version": "1.1.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/henteplan",
    "downloadUrl": "https://openagent3.xyz/downloads/henteplan",
    "agentUrl": "https://openagent3.xyz/skills/henteplan/agent",
    "manifestUrl": "https://openagent3.xyz/skills/henteplan/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/henteplan/agent.md"
  }
}