{"record":{"id":"97078fcd8acd9a9e","repo":"crewAIInc/crewAI","slug":"skill-ref-not-found-ensure-it-has-been-publishe","errorCode":null,"errorMessage":"Skill {ref} not found. Ensure it has been published and you have access.","messagePattern":"Skill (.+?) not found\\. Ensure it has been published and you have access\\.","errorType":"http","errorClass":"SystemExit","httpStatus":404,"severity":"error","filePath":"lib/cli/src/crewai_cli/skills/main.py","lineNumber":119,"sourceCode":"            or len(Path(org).parts) != 1\n            or len(Path(name).parts) != 1\n        ):\n            console.print(\n                \"[red]Invalid skill reference: org and name must be single, \"\n                \"non-empty path segments (no slashes, no '..').[/red]\"\n            )\n            raise SystemExit(1)\n\n        self._print_current_organization()\n        console.print(f\"[bold blue]Downloading skill {ref}...[/bold blue]\")\n\n        get_response = self.plus_api_client.get_skill(org, name)\n\n        if get_response.status_code == 404:\n            console.print(\n                f\"[red]Skill {ref} not found. Ensure it has been published and you have access.[/red]\"\n            )\n            raise SystemExit(1)\n        if get_response.status_code != 200:\n            console.print(\n                f\"[red]Failed to download skill {ref}: {get_response.status_code}[/red]\"\n            )\n            raise SystemExit(1)\n\n        data = get_response.json()\n        version = data.get(\"latest_version\") or data.get(\"version\")\n\n        download_url = data.get(\"download_url\")\n        if download_url:\n            import httpx\n\n            dl_response = httpx.get(download_url, follow_redirects=True)\n            dl_response.raise_for_status()\n            archive_bytes = dl_response.content\n        else:\n            encoded = data.get(\"file\", \"\")","sourceCodeStart":101,"sourceCodeEnd":137,"githubUrl":"https://github.com/crewAIInc/crewAI/blob/754d7323beb2fd042e33444a115ea2d5a47193f0/lib/cli/src/crewai_cli/skills/main.py#L101-L137","documentation":"The registry API returned HTTP 404 for `GET skill org/name`. This means either no skill with that org/name pair has been published, or it exists but the authenticated organization does not have access to it (skills are org-scoped, with no public visibility).","triggerScenarios":"Calling `crewai skill install @org/name` where the skill was never published, was published under a different org, or the currently authenticated token belongs to an org without access. The 404 branch fires on `self.plus_api_client.get_skill(org, name).status_code == 404`.","commonSituations":"Typos in org or name; trying to install a skill a teammate published to their personal org while you are switched to a different org; not logged in / expired token being treated as a different org; skill still in draft and never published.","solutions":["Verify org and name exactly as published (check with the author or the registry UI), and re-run `crewai skill install @correct-org/correct-name`.","Run `crewai org switch <org_id>` to switch to the org that owns the skill, then retry (404 is also returned when access is denied).","If you authored the skill, publish it first with `crewai skill publish` from its directory."],"exampleFix":"# before\ncrewai skill install @myteam/writing-tools   # 404: never published under this org\n# after\ncrewai org switch acme-prod\ncrewai skill install @acme-prod/writing-tools","handlingStrategy":"try-catch","validationCode":"import httpx\n\ndef skill_exists(client, org: str, name: str, token: str) -> bool | None:\n    \"\"\"True/False if registry answers definitively; None on transient failure.\"\"\"\n    r = client.get_skill(org, name)\n    if r.status_code == 200:\n        return True\n    if r.status_code == 404:\n        return False\n    return None","typeGuard":null,"tryCatchPattern":"import subprocess, sys\n\ntry:\n    subprocess.run([\"crewai\", \"skill\", \"install\", ref], check=True)\nexcept subprocess.CalledProcessError as e:\n    if \"not found\" in (e.stderr or \"\"):  # 404 branch message\n        print(f\"{ref} is unpublished or not shared with your org\")\n        sys.exit(2)\n    raise","preventionTips":["Confirm org and name from the registry UI or the publisher before scripting installs.","Make sure you are switched to the org the skill was published to (`crewai org switch`).","In automation, treat a 404 message as a distinct case from other download failures."],"tags":["cli","network","registry","http-404","skill","auth"],"backgroundTag":null,"analyzedSha":"754d7323beb2fd042e33444a115ea2d5a47193f0","analyzedAt":"2026-08-15T04:06:56.746Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}