{"record":{"id":"9b161ee63cec0110","repo":"scrapy/scrapy","slug":"invalid-cbkwargs-value-pass-a-valid-json-string","errorCode":null,"errorMessage":"Invalid --cbkwargs value, pass a valid json string to --cbkwargs. Example: --cbkwargs='{\"foo\" : \"bar\"}'","messagePattern":"Invalid --cbkwargs value, pass a valid json string to --cbkwargs\\. Example: --cbkwargs='(.+?)'","errorType":"exception","errorClass":"UsageError","httpStatus":null,"severity":"error","filePath":"scrapy/commands/parse.py","lineNumber":397,"sourceCode":"        self.process_request_cb_kwargs(opts)\n\n    def process_request_meta(self, opts: argparse.Namespace) -> None:\n        if opts.meta:\n            try:\n                opts.meta = json.loads(opts.meta)\n            except ValueError:\n                raise UsageError(\n                    \"Invalid -m/--meta value, pass a valid json string to -m or --meta. \"\n                    'Example: --meta=\\'{\"foo\" : \"bar\"}\\'',\n                    print_help=False,\n                ) from None\n\n    def process_request_cb_kwargs(self, opts: argparse.Namespace) -> None:\n        if opts.cbkwargs:\n            try:\n                opts.cbkwargs = json.loads(opts.cbkwargs)\n            except ValueError:\n                raise UsageError(\n                    \"Invalid --cbkwargs value, pass a valid json string to --cbkwargs. \"\n                    'Example: --cbkwargs=\\'{\"foo\" : \"bar\"}\\'',\n                    print_help=False,\n                ) from None\n\n    def run(self, args: list[str], opts: argparse.Namespace) -> None:\n        # parse arguments\n        if not len(args) == 1 or not is_url(args[0]):\n            raise UsageError\n        url = args[0]\n\n        # prepare spidercls\n        self.set_spidercls(url, opts)\n\n        if self.spidercls and opts.depth > 0:\n            self.start_parsing(url, opts)\n            self.print_results(opts)\n","sourceCodeStart":379,"sourceCodeEnd":415,"githubUrl":"https://github.com/scrapy/scrapy/blob/06af687662112027b4482d31e2714a3cf280a91f/scrapy/commands/parse.py#L379-L415","documentation":"'scrapy parse' accepts --cbkwargs as a JSON object passed as cb_kwargs to the request callback. json.loads() failures (ValueError) are converted to this UsageError. Like -m/--meta, the input must be strict JSON.","triggerScenarios":"Passing '--cbkwargs {page: 2}' (unquoted key), Python-style True/None, trailing commas, or a shell-mangled argument where quotes were stripped.","commonSituations":"Testing callbacks that require keyword arguments; shell quoting issues (esp. zsh/cmd.exe) when embedding JSON with double quotes in the argument.","solutions":["Quote the JSON object and use double-quoted keys: scrapy parse <url> --cbkwargs='{\"page\": 2}'.","Pre-validate the payload with json.loads() in the tool/language building the command.","Remember only JSON scalar/object/array types are allowed; convert Python booleans to true/false."],"exampleFix":"# before\nscrapy parse https://example.com --cbkwargs \"{page: 2}\"\n\n# after\nscrapy parse https://example.com --cbkwargs='{\"page\": 2}'","handlingStrategy":"validation","validationCode":"import json\n\nkwargs_str = '{\"page\": 2}'\ncb_kwargs = json.loads(kwargs_str)\nassert isinstance(cb_kwargs, dict)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Generate --cbkwargs payloads with json.dumps() and pass them quoted.","Validate with json.loads() in test scripts before shelling out to scrapy parse.","Keep keys as strings; JSON has no tuples or Python objects."],"tags":["cli","parse-command","json","cb-kwargs","usage-error"],"backgroundTag":null,"analyzedSha":"06af687662112027b4482d31e2714a3cf280a91f","analyzedAt":"2026-08-15T00:21:48.041Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}