> ## Documentation Index
> Fetch the complete documentation index at: https://docs.edges.run/llms.txt
> Use this file to discover all available pages before exploring further.

# Error Reference

> Complete reference for all error labels, HTTP status codes, and troubleshooting guidance for the Edges API.

This page provides a comprehensive reference for understanding and handling errors across the Edges API. Use the [Quick Reference Table](#quick-reference-table) for fast lookups, or dive into the detailed sections for specific error handling guidance.

<Tip>
  **Two levels of reading**: Each action's documentation includes the specific errors it can return. This page provides the **overall error landscape** across all actions, helping you build robust error handling in your integrations.
</Tip>

***

## Quick Reference Table

| Error Label                   | HTTP Code | Category        | Retry?                                                  |
| ----------------------------- | --------- | --------------- | ------------------------------------------------------- |
| `BAD_INPUT`                   | 400       | Input           | No — fix input                                          |
| `BAD_PARAMETERS`              | 400       | Input           | No — fix parameters                                     |
| `MISSING_PARAMETER`           | 424       | Input           | No — add parameter                                      |
| `NO_ACCESS`                   | 402       | Access          | No — check subscription                                 |
| `STATUS_403`                  | 424       | Access          | No — check permissions                                  |
| `STATUS_404`                  | 424       | Not Found       | No — resource doesn't exist                             |
| `NO_RESULT`                   | 424       | Not Found       | No — empty result                                       |
| `LIMIT_REACHED`               | 429/409   | Rate Limit      | Yes - Use `postponed_until` then with backoff           |
| `STATUS_429`                  | 429       | Rate Limit      | Yes — Use `postponed_until` then with backoff           |
| `LK_ERROR`                    | 424       | LinkedIn        | No                                                      |
| `LK_524`                      | 424       | LinkedIn        | Yes — wait & retry                                      |
| `LK_MISSING_DATA`             | 424       | LinkedIn        | No                                                      |
| `LK_INMAIL_CANNOT_RESEND`     | 424       | LinkedIn        | No — wait for reply                                     |
| `LK_INMAIL_NOT_ENOUGH_CREDIT` | 424       | LinkedIn        | No — add credits                                        |
| `LK_EVENT`                    | 424       | LinkedIn        | No — check event                                        |
| `NOT_CONNECTED`               | 424       | LinkedIn        | No — connect first                                      |
| `SN_CONFLICT`                 | 424       | Sales Navigator | No — already connected                                  |
| `SN_OUT_OF_NETWORK`           | 424       | Sales Navigator | No — upgrade account                                    |
| `NO_VALID_ACCOUNT_CONFIGURED` | 424       | Config          | No — configure identity                                 |
| `INTEGRATION_ERROR`           | 424       | Config          | No - contact support                                    |
| `PROXY_ERROR`                 | 424       | Config          | Yes — Use `postponed_until` if present or wait 1 minute |
| `GENERIC_ERROR`               | 424       | Processing      | No - contact support                                    |
| `NO_DATA_LOADED`              | 424       | Processing      | No                                                      |
| `NO_DATA_AVAILABLE`           | 424       | Processing      | No — no data found for this input                       |
| `MANDATORY_DATA_MISSING`      | 424       | Processing      | No — check input                                        |
| `UNDEFINED_FIELD`             | 424       | Processing      | No — check input                                        |
| `UNKNOWN_ERROR`               | 424       | System          | Contact support                                         |
| `ACTION_ABORTED`              | 422       | System          | No - Check `appendix`                                   |
| `API_MAX_RETRY`               | 424       | System          | Conditional — yes if managed/auto                       |
| `API_TIMEOUT_ERROR`           | 424       | System          | Yes                                                     |
| `GMAPS_NO_INTERCEPT`          | 424       | Input           | No                                                      |
| `HPE_HEADER_OVERFLOW`         | 424       | System          | No                                                      |
| `HTTP_RESPONSE_EMPTY`         | 424       | System          | Depends — see insights                                  |
| `LK_403`                      | 424       | LinkedIn        | No                                                      |
| `LK_409`                      | 424       | LinkedIn        | No                                                      |
| `LK_413`                      | 424       | LinkedIn        | No                                                      |
| `LK_BAD_COOKIE`               | 424       | LinkedIn        | Yes if managed/auto — update integration                |
| `LK_LOGIN_ERROR`              | 424       | LinkedIn        | Yes if managed/auto                                     |
| `LR_ACCOUNT_UPGRADE`          | 424       | LinkedIn        | Yes if managed/auto                                     |
| `MISSING_COOKIE`              | 424       | Config          | Yes if managed/auto                                     |
| `RLS_BAD_COOKIE`              | 424       | LinkedIn        | Yes if managed/auto                                     |
| `SN_ACCOUNT_UPGRADE`          | 424       | Sales Navigator | Yes if managed/auto                                     |
| `SN_LOGIN_ERROR`              | 424       | Sales Navigator | Yes if managed/auto                                     |
| `RLS_LOGIN_ERROR`             | 424       | LinkedIn        | Yes if managed/auto                                     |
| `STATUS_400`                  | 400       | Input           | No — API only                                           |
| `STATUS_409`                  | 409       | System          | No — API only                                           |
| `STATUS_422`                  | 422       | System          | No — API only                                           |
| `HTTP_ERROR`                  | 424       | System          | Yes                                                     |
| `LK_GET_FEATURES_ERROR`       | 424       | LinkedIn        | Yes if managed/auto                                     |
| `LK_ACCOUNT_UPGRADE`          | 424       | LinkedIn        | Yes if managed/auto                                     |
| `RUN_MAX_RETRY`               | 424       | System          | No — run async only; resume resets retry\_count         |
| `OUTPUT_VALIDATION_FAILED`    | 424       | Processing      | No — contact support                                    |

***

## Error Response Structure

The API uses a consistent error response format across all endpoints. When an error occurs, you'll receive a response with the following structure:

```json theme={null}
{
  "error_label": "INVALID_INPUT",
  "error_scope": "input",
  "error_ref": "ERR-12345",
  "message": "The provided input is invalid. Please check your request and try again.",
  "status_code": 400,
  "params": {}
}
```

Each error response includes:

* `error_label`: A machine-readable identifier for the error type
* `error_scope`: Indicates which part of the request caused the error (e.g., "input", "auth", "server")
* `error_ref`: A unique reference code for tracking and debugging
* `message`: A human-readable description of the error
* `status_code`: The HTTP status code
* `params`: Additional error parameters (if any)

Common HTTP status codes:

* `200`: The request was successful (some API calls may return 201 instead)
* `400`: Bad Request - Invalid input or parameters
* `401`: Unauthorized - Invalid or missing API key
* `403`: Forbidden - Insufficient permissions
* `404`: Not Found - Resource doesn't exist
* `424`: Failed Dependency - Used to wrap LinkedIn-specific error codes with an additional `error_label`
* `500`: Internal Server Error - Server-side issue

<Info>
  **Why we use 424 for LinkedIn errors**: We use the `424 Failed Dependency` status code to wrap all LinkedIn-specific error codes. This is because a 404 (or any other error code) from LinkedIn doesn't imply the same error code on our own APIs. For example, if LinkedIn returns a 404 for a profile that doesn't exist, that doesn't mean our API endpoint is returning a 404 — it means the dependency (LinkedIn) failed. The specific LinkedIn error is indicated in the `error_label` field (e.g., `STATUS_404`, `NO_RESULT`, etc.).
</Info>

<Tip>
  Always check the `error_label` and `error_scope` fields to programmatically
  handle different types of errors in your application.
</Tip>

<Info>
  If you encounter an unusual error, such as a 500 or 503, feel free to reach
  out! These are internal errors on our end, and we're happy to help resolve
  them.
</Info>

***

## Understanding Error Scopes

Every error response includes an `error_scope` field that indicates what caused the error:

| Scope    | Description                                 | Typical Action                             |
| -------- | ------------------------------------------- | ------------------------------------------ |
| `input`  | The input data provided is invalid          | Fix the input format or value              |
| `param`  | A parameter in the request is invalid       | Check parameter requirements               |
| `config` | Configuration issue (identity, integration) | Verify your setup in the dashboard         |
| `integ`  | Third-party integration error (LinkedIn)    | Check resource availability or retry later |

<Warning>
  The `retry_after` field from tier provides guidance on how long to wait before making your first retry attempt. For subsequent retries, use an exponential backoff strategy by increasing the wait time between each attempt.
</Warning>

***

## Handling Rate Limit Errors (429)

`429` errors indicate that you've exceeded a rate limit imposed by either Edges or LinkedIn. It's crucial to identify the source of the limit to apply the appropriate handling strategy.

A `429 Too Many Requests` error means you've exceeded a usage limit — but it's important to identify **which system** triggered it.

| Source             | Identifier                    | Retry Strategy                                                                                                                                                               |
| ------------------ | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Edges API          | `X-RateLimit-Type` header     | Use `Retry-After` header + exponential backoff                                                                                                                               |
| LinkedIn (guarded) | `error_label = LIMIT_REACHED` | Check **`params.appendix`** and **`params.timespan`** to distinguish limit type (e.g. `API_FUSE_LIMIT`/Daily, `MINUTE_LIMIT`/Minute). Wait for the relevant window to reset. |
| LinkedIn (raw)     | `error_label = STATUS_429`    | Apply exponential backoff. Do not retry aggressively.                                                                                                                        |

**Example Implementation**:

```javascript theme={null}
if (error.status === 429) {
  if (error.headers['x-ratelimit-type']) {
    // Edges rate limit - use Retry-After header
    const delay = error.headers['retry-after'] * 1000;
    await new Promise(resolve => setTimeout(resolve, delay));
  } else if (error.body.error_label === 'LIMIT_REACHED') {
    // Check params.appendix (e.g. API_FUSE_LIMIT, API_RATE_LIMIT, MINUTE_LIMIT, DAILY_LIMIT) and params.timespan
    const appendix = error.body.params?.appendix;
    const timespan = error.body.params?.timespan;
    console.log('Limit reached:', appendix, timespan);
  } else if (error.body.error_label === 'STATUS_429') {
    // LinkedIn raw - exponential backoff
    const delay = Math.min(1000 * Math.pow(2, retryCount), 30000);
    await new Promise(resolve => setTimeout(resolve, delay));
  }
}
```

**General Recommendations**:

* Monitor identity usage via `/identities/{identity_uid}/actions/{action_slug}/limits`
* Avoid parallel tools or conflicting automation platforms
* Match identity timezones with VPNs and login locations

To know more about rate limits, see our dedicated [Rate Limits](/v1/runs/rate-limits) section and [best practices](/v1/runs/rate-limits#best-practices).

***

## Handling LinkedIn Errors (424)

`424` errors indicate a failed dependency — we use this status code to wrap all LinkedIn-specific error codes. It's important to identify the specific `error_label` to determine the appropriate handling strategy.

A `424 Failed Dependency` error means the external service (LinkedIn) returned an error — the `error_label` will tell you **which LinkedIn error** occurred.

<Info>
  **Why we use 424 for LinkedIn errors**: We use the `424 Failed Dependency` status code to wrap all LinkedIn-specific error codes. This is because a 404 (or any other error code) from LinkedIn doesn't imply the same error code on our own APIs. For example, if LinkedIn returns a 404 for a profile that doesn't exist, that doesn't mean our API endpoint is returning a 404 — it means the dependency (LinkedIn) failed. The specific LinkedIn error is indicated in the `error_label` field (e.g., `STATUS_404`, `NO_RESULT`, etc.).
</Info>

**Example Implementation**:

```javascript theme={null}
if (error.status === 424) {
  const label = error.body.error_label;
  
  switch (label) {
    case 'STATUS_404':
      // Resource doesn't exist - don't retry
      console.log('Resource not found on LinkedIn:', error.body.message);
      break;
    case 'NO_RESULT':
      // No results found - treat as empty result
      console.log('No results found:', error.body.message);
      break;
    case 'LK_ERROR':
    case 'GENERIC_ERROR':
      // Transient error - retry with backoff
      const delay = Math.min(1000 * Math.pow(2, retryCount), 30000);
      await new Promise(resolve => setTimeout(resolve, delay));
      break;
    case 'LIMIT_REACHED':
      // LinkedIn limit - wait for reset
      console.log('Limit reached, waiting for reset...');
      break;
    default:
      console.log('Unhandled error:', label, error.body.message);
  }
}
```
