{"record":{"id":"b091d3f4a4f0bee5","repo":"cloudflare/cloudflared","slug":"errapinosuccess","errorCode":"ErrAPINoSuccess","errorMessage":"API call failed","messagePattern":"API call failed","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cfapi/base_client.go","lineNumber":27,"sourceCode":"\t\"net/url\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/rs/zerolog\"\n\t\"golang.org/x/net/http2\"\n)\n\nconst (\n\tdefaultTimeout  = 15 * time.Second\n\tjsonContentType = \"application/json\"\n)\n\nvar (\n\tErrUnauthorized = errors.New(\"unauthorized\")\n\tErrBadRequest   = errors.New(\"incorrect request parameters\")\n\tErrNotFound     = errors.New(\"not found\")\n\tErrAPINoSuccess = errors.New(\"API call failed\")\n)\n\ntype RESTClient struct {\n\tbaseEndpoints *baseEndpoints\n\tauthToken     string\n\tuserAgent     string\n\tclient        http.Client\n\tlog           *zerolog.Logger\n}\n\ntype baseEndpoints struct {\n\taccountLevel  url.URL\n\tzoneLevel     url.URL\n\taccountRoutes url.URL\n\taccountVnets  url.URL\n}\n\nvar _ Client = (*RESTClient)(nil)","sourceCodeStart":9,"sourceCodeEnd":45,"githubUrl":"https://github.com/cloudflare/cloudflared/blob/2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f/cfapi/base_client.go#L9-L45","documentation":"ErrAPINoSuccess is a sentinel returned by parseResponseEnvelope when the Cloudflare API responds successfully at the HTTP level but the JSON envelope has success=false. It means Cloudflare accepted the request but rejected the operation, with details normally in the envelope's errors/messages fields.","triggerScenarios":"Any API call whose response body decodes to a response envelope with the `success` field set to false — e.g. invalid API token permissions, account-level restrictions, or Cloudflare-side errors on tunnel endpoints.","commonSituations":"Using an API token lacking the Cloudflare Tunnel permissions; rate limiting or account suspensions surfacing as success=false; transient Cloudflare API failures during deploys.","solutions":["Inspect the envelope's `errors` and `messages` fields logged by the client for the underlying cause","Verify your API token has the correct zone/account and Cloudflare Tunnel permissions","Retry the operation if Cloudflare reports a transient error","Compare with errors.Is(err, cfapi.ErrAPINoSuccess) to branch on this case specifically"],"exampleFix":"// before\ntunnels, err := client.ListTunnels(ctx, accountTag)\nif err != nil {\n    return err\n}\n// after\ntunnels, err := client.ListTunnels(ctx, accountTag)\nif errors.Is(err, cfapi.ErrAPINoSuccess) {\n    return fmt.Errorf(\"cloudflare rejected the request; check token permissions and envelope error details: %w\", err)\n} else if err != nil {\n    return err\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"func isAPINoSuccess(err error) bool { return errors.Is(err, cfapi.ErrAPINoSuccess) }","tryCatchPattern":"resp, err := client.Call(ctx, op, ...)\nif errors.Is(err, cfapi.ErrAPINoSuccess) {\n    // inspect logged envelope errors/messages, possibly retry\n    return fmt.Errorf(\"cloudflare API rejected operation: %w\", err)\n}","preventionTips":["Ensure API tokens carry the required Cloudflare Tunnel permissions","Check the Cloudflare status page during incident windows","Log envelope errors and messages from responses","Wrap mutating calls with bounded retries for transient failures"],"tags":["api","cloudflare","http"],"backgroundTag":"api-error-response","analyzedSha":"2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f","analyzedAt":"2026-09-06T04:14:33.757Z","contentChangedAt":"2026-09-06T04:14:33.757Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}