# List Products

`GET /v1/products`

Endpoints: `https://{tenant}.core.server.test.neobits.ai/v1/products`, `https://{tenant}.core.server.prod.neobits.ai/v1/products`
OpenAPI document: https://docs.neobits.ai/openapi/core-authz.json

Authentication: `bearer` (Bearer token authentication using OAuth 2.0 client credentials flow.)

Lists the products of your tenant's active subscriptions (started, and not ended), each once, in ascending ID order. Use `page.after` from a response as `after` to get the next page. The products decide which data Fuse returns: [Get a person](https://docs.neobits.ai/api-reference/operation/person/method/get.md) returns only the fields the products of your client's subscription include. With one subscription, these are its products. Your token must carry `products:read`, which every role except `guest` grants.

## Parameters

| Name | In | Required | Schema | Description |
| --- | --- | --- | --- | --- |
| `size` | query | no | integer; minimum 1; maximum 5000; default `50`; example `50` | Maximum products to return (1–5,000). Defaults to 50. |
| `after` | query | no | string (uuid) | Exclusive product ID cursor. Returns products after it; use `page.after` from a previous response. |
| `before` | query | no | string (uuid) | Exclusive product ID cursor. Returns products before it; use `page.before` from a previous response. |

Full schemas:

- `size` (query): `{"type":"integer","minimum":1,"maximum":5000,"default":50}`
- `after` (query): `{"type":"string","format":"uuid"}`
- `before` (query): `{"type":"string","format":"uuid"}`

## Example request

```bash
curl --request GET \
  --url 'https://your-tenant.core.server.test.neobits.ai/v1/products?size=50&after=SOME_STRING_VALUE&before=SOME_STRING_VALUE' \
  --header 'Authorization: Bearer REPLACE_BEARER_TOKEN'
```

## Responses

### 200 Your tenant's products

Content type: `application/json`

Schema (JSON Schema):

```json
{"title":"ProductsList","type":"object","required":["data","page"],"properties":{"data":{"type":"array","items":{"title":"Product","type":"object","required":["id","name","app","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid","description":"Product ID","example":"0197a1b2-0000-7000-8000-000000000201"},"name":{"type":"string","description":"The product's name. Fuse products are named after the data they give, such as `Fuse inntektsinformasjon: A-meldingen` for income from A-meldingen.","example":"Fuse inntektsinformasjon: A-meldingen"},"app":{"type":["string","null"],"description":"The Neobits web app the product gives access to, such as `logic`. Null for a product that gives data through an API, such as Fuse's.","example":null},"created_at":{"type":"string","format":"date-time","example":"2019-09-16T22:14:45.624Z","description":"When the product was created"},"updated_at":{"type":"string","format":"date-time","example":"2019-09-16T22:14:45.624Z","description":"When the product was last changed"}}}},"page":{"title":"PaginationInfo","type":"object","required":["size","total","before","after"],"properties":{"size":{"type":"integer","description":"Number of items returned in this page"},"total":{"type":"integer","description":"Total number of items, independent of the cursor"},"before":{"type":["string","null"],"format":"uuid","description":"First returned ID. Use as `before` to request the preceding page. Null for an empty page."},"after":{"type":["string","null"],"format":"uuid","description":"Last returned ID. Use as `after` to request the following page. Null for an empty page."}}}},"example":{"data":[{"id":"0197a1b2-0000-7000-8000-000000000201","name":"Fuse inntektsinformasjon: A-meldingen","app":null,"created_at":"2026-01-15T09:00:00.000Z","updated_at":"2026-01-15T09:00:00.000Z"},{"id":"0197a1b2-0000-7000-8000-000000000202","name":"Fuse personinformasjon: Person","app":null,"created_at":"2026-01-15T09:00:00.000Z","updated_at":"2026-01-15T09:00:00.000Z"}],"page":{"size":2,"total":2,"before":"0197a1b2-0000-7000-8000-000000000201","after":"0197a1b2-0000-7000-8000-000000000202"}}}
```

Example:

```json
{
  "data": [
    {
      "id": "0197a1b2-0000-7000-8000-000000000201",
      "name": "Fuse inntektsinformasjon: A-meldingen",
      "app": null,
      "created_at": "2026-01-15T09:00:00.000Z",
      "updated_at": "2026-01-15T09:00:00.000Z"
    },
    {
      "id": "0197a1b2-0000-7000-8000-000000000202",
      "name": "Fuse personinformasjon: Person",
      "app": null,
      "created_at": "2026-01-15T09:00:00.000Z",
      "updated_at": "2026-01-15T09:00:00.000Z"
    }
  ],
  "page": {
    "size": 2,
    "total": 2,
    "before": "0197a1b2-0000-7000-8000-000000000201",
    "after": "0197a1b2-0000-7000-8000-000000000202"
  }
}
```

## Error responses

Error bodies follow the format in the [error reference](https://docs.neobits.ai/api-reference/errors.md), which lists every error code.

| Status | Meaning | Example body |
| --- | --- | --- |
| 400 | OAuth 2.0 Bad Request | `{"error":"invalid_request","error_code":"400-000","error_uri":"https://docs.neobits.ai/api-reference/errors","error_description":"The request is missing a required parameter.","error_timestamp":"2025-06-25T15:29:49.992Z"}` |
| 401 | OAuth 2.0 Unauthorized | `{"error":"invalid_client","error_code":"401-000","error_uri":"https://docs.neobits.ai/api-reference/errors","error_description":"Client authentication failed.","error_timestamp":"2025-06-25T15:29:49.992Z"}` |
| 403 | OAuth 2.0 Forbidden. The token doesn't carry the scope this endpoint needs, or it was issued for another host. Request a token from your tenant's Core host with `resource` set to that host and `scope` including the endpoint's scope, or with a `role` that grants it. | `{"error":"access_denied","error_code":"403-000","error_uri":"https://docs.neobits.ai/api-reference/errors","error_description":"An unknown forbidden error occurred.","error_timestamp":"2026-11-06T19:42:10.512Z"}` |
| 429 | OAuth 2.0 Too Many Requests. When the rate limit rejects a request, the response carries `Retry-After` and no `error_timestamp` or `X-Request-ID`, as the request never reached the API. | `{"error":"too_many_requests","error_code":"429-000","error_uri":"https://docs.neobits.ai/api-reference/errors","error_description":"Too many requests. Please try again later."}` |
| 500 | OAuth 2.0 Internal Server Error | `{"error":"server_error","error_code":"500-000","error_uri":"https://docs.neobits.ai/api-reference/errors","error_description":"The authorization server encountered an unexpected condition.","error_timestamp":"2025-06-25T15:29:49.992Z"}` |
| 504 | OAuth 2.0 Gateway Timeout | `{"error":"gateway_timeout","error_code":"504-000","error_uri":"https://docs.neobits.ai/api-reference/errors","error_description":"Timeout of 29s reached. Closing connection.","error_timestamp":"2025-06-25T15:29:49.992Z"}` |