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

# browse-products

> List your whole available catalog, filtered by status and stock.

Pull the full catalog in one call, filtered by whether parts are active and/or in stock. Unlike [Catalog](/api/catalog) (which looks up specific parts you name), this returns everything that matches the filters.

```http theme={null}
GET https://api.skynet-docs.skynetparts.com/public/api/v1/b2b/products
```

Requires an API key. See [Authentication](/authentication).

## Headers

| Header          | Required | Value                |
| --------------- | -------- | -------------------- |
| `Authorization` | Yes      | `Bearer sk_live_...` |

## Query parameters

<ParamField query="active" type="boolean" default="true">
  `true` (default) returns only **active** products. `false` returns only **non-active** products (drafts/archived), excluding active ones.
</ParamField>

<ParamField query="in_stock" type="boolean" default="false">
  When `true`, only parts with stock on hand (`available_stock > 0`).
</ParamField>

<RequestExample>
  ```bash curl theme={null}
  curl "https://api.skynet-docs.skynetparts.com/public/api/v1/b2b/products?active=true&in_stock=true" \
    -H "Authorization: Bearer $SKYNET_API_KEY"
  ```
</RequestExample>

<ResponseExample>
  ```json Success theme={null}
  {
    "success": true,
    "products": [
      {
        "part_id": "skynet_part_BWxLDSfV...",
        "part_number": "MS21042L3",
        "part_name": "Self-Locking Nut",
        "title": "Self-Locking Nut, MS21042L3",
        "description": "COVER: CUSHION, ASSEMBLY",
        "condition": "NE",
        "unit_of_measure": "EA",
        "available_stock": 87,
        "price": { "amount": "12.40", "currency": "USD" },
        "status": "ACTIVE"
      }
    ],
    "summary": { "total": 412, "truncated": false, "cap": 1000, "filters": { "active": true, "in_stock": false } }
  }
  ```
</ResponseExample>

## Response fields

<ResponseField name="products" type="object[]">
  Each entry has the same shape as a part in the [Catalog](/api/catalog) response (`part_id`, `part_number`, `part_name`, `title`, `description`, `condition`, `unit_of_measure`, `available_stock`, `price`, `status`).
</ResponseField>

<ResponseField name="summary.total" type="integer">
  Number of parts returned.
</ResponseField>

<ResponseField name="summary.truncated" type="boolean">
  `true` if the full matching set was larger than the cap (1,000) and the response was truncated.
</ResponseField>

<ResponseField name="summary.filters" type="object">
  Echoes the `active` and `in_stock` filters applied.
</ResponseField>

## Errors

These codes apply to this endpoint:

| Code               | HTTP | Meaning                                                                                           |
| ------------------ | ---- | ------------------------------------------------------------------------------------------------- |
| `INVALID_API_KEY`  | 401  | Your API key is missing, malformed, or wrong.                                                     |
| `KEY_REVOKED`      | 401  | The key was revoked. Email [info@skynetparts.com](mailto:info@skynetparts.com) for a replacement. |
| `RATE_LIMITED`     | 429  | Catalog is busy. Retry in a few seconds.                                                          |
| `UPSTREAM_ERROR`   | 502  | Listing failed on our end. Safe to retry.                                                         |
| `UPSTREAM_TIMEOUT` | 504  | Listing timed out. Safe to retry.                                                                 |

See [Error codes](/reference/errors) for the full list.
