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

# List all saved items

> Read the items of every saved list you can see in one call, each with its `list_id` and current summary. Use `per_list` for an overview of what the workspace has saved.

**Cost:** 1 API credit per item returned.

```bash
curl -G "https://api.alura.io/v1/research/saved/items" \
  -H "Authorization: Bearer $ALURA_API_KEY" \
  --data-urlencode "per_list=3"
```

Lists come oldest first, as [List saved lists](https://docs.alura.io/api-reference/research/saved/lists/list.md) orders them. Each list's items come as [List saved items](https://docs.alura.io/api-reference/research/saved/items/list.md) orders them: products, then shops, then keywords. Needs the `saved:read` scope.

Items carry the same summaries and `status` values as a list's items, and are charged the same way. Reading never fetches anything from Etsy.

## Get an overview with per\_list

`per_list=3` keeps the first 3 items of each list (1 to 25). Without it, every item comes back. `type` keeps one kind.

`total` counts the items this read returns, with each list cut at `per_list`, not every saved item. For the real sizes, read `summary.lists`:

| Field | Meaning |
| - | - |
| `list_id` | A list with items on this page |
| `item_count` | All its items (of `type`, when given), not only those returned |
| `truncated` | `true` when `per_list` left some out. Read the list with [List saved items](https://docs.alura.io/api-reference/research/saved/items/list.md) for the rest. |

> [accordion] Paging while items change
>
> Items saved or removed while you page may move the window. Each page reserves a charge for every item it can return, then settles to the items with `data`. See [Pagination](https://docs.alura.io/api-reference/introduction.md#pagination) and [Credits and limits](https://docs.alura.io/api-reference/credits-and-limits.md).


## OpenAPI

````yaml /openapi.json get /v1/research/saved/items
openapi: 3.1.0
info:
  title: Alura API
  version: 1.0.0
  description: Etsy market research for scripts and AI assistants.
servers:
  - url: https://api.alura.io
security:
  - apiKey: []
paths:
  /v1/research/saved/items:
    get:
      summary: List all saved items
      description: >-
        The items of every saved list you can see, each with its `list_id`:
        lists oldest first (as `GET /v1/research/saved/lists` orders them), each
        list's items as `GET /v1/research/saved/lists/{id}/items` orders them.
        `per_list` keeps only the first items of each list, for an overview.
        `total` counts the items this read returns (each list cut at
        `per_list`), not every saved item; `summary.lists` gives each list on
        the page with its `item_count` (all its items) and `truncated`
        (`per_list` left some out: read the list with `GET
        /v1/research/saved/lists/{id}/items` for the rest). Items come with the
        same summaries, statuses and prices as a list's items: 1 API credit per
        item with data, reserved as the items the page can return. Items saved
        or removed while you page may move the window. Reading never fetches
        anything from Etsy.


        Cost: 1 API credit per item returned.
      operationId: research.saved.items.search
      parameters:
        - name: type
          in: query
          required: false
          description: 'Only items of this type: `product`, `shop` or `keyword`.'
          schema:
            description: 'Only items of this type: `product`, `shop` or `keyword`.'
            type: string
            enum:
              - product
              - shop
              - keyword
        - name: per_list
          in: query
          required: false
          description: >-
            At most this many items of each list, 1-25: its first ones
            (products, then shops, then keywords). Without it, every item.
          schema:
            description: >-
              At most this many items of each list, 1-25: its first ones
              (products, then shops, then keywords). Without it, every item.
            type: string
            pattern: ^[1-9][0-9]?$
            example: '3'
        - name: limit
          in: query
          required: false
          description: 'Page size: default 25, at most 100.'
          schema:
            type: integer
            minimum: 1
            maximum: 100
        - name: cursor
          in: query
          required: false
          description: >-
            The `next_cursor` of the previous page. Bound to the query, the
            workspace and the key.
          schema:
            type: string
        - name: fields
          in: query
          required: false
          description: >-
            Comma-separated dotted paths to return; `id`, `object` and `as_of`
            always come back.
          schema:
            type: string
      responses:
        '200':
          description: OK
          headers:
            Request-Id:
              $ref: '#/components/headers/Request-Id'
            Alura-Credits-Cost:
              $ref: '#/components/headers/Alura-Credits-Cost'
            Alura-Credits-Remaining:
              $ref: '#/components/headers/Alura-Credits-Remaining'
          content:
            application/json:
              schema:
                type: object
                properties:
                  object:
                    type: string
                    const: list
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        object:
                          type: string
                          const: research.saved_item
                          description: Always `research.saved_item`.
                        id:
                          type: string
                          description: >-
                            The saved item ID (`itm_...`); remove it from the
                            list with this.
                        list_id:
                          type: string
                          description: The list it is saved in (`lst_...`).
                        type:
                          type: string
                          enum:
                            - product
                            - shop
                            - keyword
                          description: >-
                            `product`, `shop` or `keyword`. New kinds may be
                            added.
                        ref_id:
                          description: >-
                            What it saves: the Etsy listing ID (product), the
                            Etsy shop ID (shop) or Alura's keyword ID (keyword);
                            null when the Alura app stored none.
                          type:
                            - string
                            - 'null'
                        added_at:
                          description: >-
                            When it was saved (ISO 8601, UTC); null when the
                            Alura app did not record it.
                          type:
                            - string
                            - 'null'
                        status:
                          type: string
                          description: >-
                            `available`: `data` holds it. `unavailable`: Alura
                            no longer has it. `shop_opted_out`: its shop asked
                            Alura not to track it. Only `available` items cost
                            API credits. New values may be added.
                        data:
                          anyOf:
                            - oneOf:
                                - type: object
                                  properties:
                                    object:
                                      type: string
                                      const: research.product
                                    id:
                                      type: string
                                      description: Etsy ID, as a string.
                                    title:
                                      type:
                                        - string
                                        - 'null'
                                    url:
                                      type: string
                                      description: The listing on Etsy.
                                    shop:
                                      type: object
                                      properties:
                                        id:
                                          type: string
                                          description: Etsy ID, as a string.
                                        name:
                                          type:
                                            - string
                                            - 'null'
                                      required:
                                        - id
                                        - name
                                      additionalProperties: false
                                    price:
                                      anyOf:
                                        - type: object
                                          properties:
                                            amount:
                                              type: string
                                              description: >-
                                                Decimal string in the listing's own
                                                currency.
                                            currency:
                                              type: string
                                              description: ISO 4217 code.
                                            usd:
                                              description: >-
                                                The same price in USD, as a decimal
                                                string; null when no exchange rate is
                                                known.
                                              type:
                                                - string
                                                - 'null'
                                          required:
                                            - amount
                                            - currency
                                            - usd
                                          additionalProperties: false
                                          description: >-
                                            The listing's current price. Amounts are
                                            decimal strings, not JSON numbers, so
                                            they keep exact decimals at each
                                            currency's precision (two for USD, none
                                            for JPY); parse them with a decimal type
                                            before doing arithmetic.
                                        - type: 'null'
                                    image_url:
                                      description: The primary image (570px wide).
                                      type:
                                        - string
                                        - 'null'
                                    category:
                                      anyOf:
                                        - type: object
                                          properties:
                                            id:
                                              anyOf:
                                                - type: string
                                                  description: Etsy ID, as a string.
                                                - type: 'null'
                                            path:
                                              type: array
                                              items:
                                                type: string
                                          required:
                                            - id
                                            - path
                                          additionalProperties: false
                                        - type: 'null'
                                    sales:
                                      type: object
                                      properties:
                                        est_lifetime:
                                          description: >-
                                            Estimated lifetime sales; null when
                                            unknown, including a stored estimate
                                            that fails a consistency check.


                                            Estimate: see the methodology (version
                                            2026-10) at
                                            https://docs.alura.io/methodology/sales-estimates.
                                          type:
                                            - number
                                            - 'null'
                                        est_monthly_avg:
                                          description: >-
                                            Lifetime average, not the current pace:
                                            estimated lifetime sales over the months
                                            since listing, in whole units (0 = under
                                            half a sale a month). Recent sales:
                                            `est_last_month` and `est_trend_3m`.
                                            null when `est_lifetime` is.


                                            Estimate: see the methodology (version
                                            2026-10) at
                                            https://docs.alura.io/methodology/sales-estimates.
                                          type:
                                            - number
                                            - 'null'
                                        est_lifetime_revenue_usd:
                                          type:
                                            - number
                                            - 'null'
                                          description: >-
                                            Estimate: see the methodology (version
                                            2026-10) at
                                            https://docs.alura.io/methodology/sales-estimates.
                                        est_last_month:
                                          description: >-
                                            Estimated sales in the last completed
                                            UTC month (recent sales;
                                            `est_monthly_avg` is the lifetime
                                            average). null when unknown, which is
                                            common: about 38% of listings carry no
                                            recent-sales estimate yet, and a stored
                                            one for an older month is not served.
                                            Also null when it is above the lifetime
                                            total (a history that contradicts it).
                                            null is unknown, never zero. In a bulk
                                            get by `ids`: the product detail's
                                            value.


                                            Estimate: see the methodology (version
                                            2026-10) at
                                            https://docs.alura.io/methodology/sales-estimates.
                                          type:
                                            - number
                                            - 'null'
                                        est_trend_3m:
                                          description: >-
                                            The last 3 completed months against the
                                            3 before (0.12 = +12%); null when
                                            unknown or when `est_last_month` is
                                            (null is unknown, never zero).


                                            Estimate: see the methodology (version
                                            2026-10) at
                                            https://docs.alura.io/methodology/sales-trend.
                                          type:
                                            - number
                                            - 'null'
                                      required:
                                        - est_lifetime
                                        - est_monthly_avg
                                        - est_lifetime_revenue_usd
                                        - est_last_month
                                        - est_trend_3m
                                      additionalProperties: false
                                      description: >-
                                        Estimates (methodology:
                                        https://docs.alura.io/methodology/sales-estimates).
                                        Revenue is valued at the current price.
                                    reviews:
                                      type: object
                                      properties:
                                        count:
                                          anyOf:
                                            - type: integer
                                            - type: 'null'
                                        average:
                                          description: null when there are no reviews.
                                          type:
                                            - number
                                            - 'null'
                                      required:
                                        - count
                                        - average
                                      additionalProperties: false
                                    favorites:
                                      anyOf:
                                        - type: integer
                                        - type: 'null'
                                    listing_score:
                                      anyOf:
                                        - type: integer
                                        - type: 'null'
                                      description: Alura's 0-100 listing score.
                                    listed_at:
                                      anyOf:
                                        - type: string
                                          description: ISO 8601, UTC.
                                        - type: 'null'
                                    metrics_as_of:
                                      x-alura-switch: RESEARCH_READS_V2
                                      description: >-
                                        When Etsy last confirmed `favorites` and
                                        `quantity` as served here; null when
                                        unknown. Present only where Alura serves
                                        its per-field freshest reads.
                                      anyOf:
                                        - type: string
                                          description: ISO 8601, UTC.
                                        - type: 'null'
                                    state_as_of:
                                      x-alura-switch: RESEARCH_READS_V2
                                      description: >-
                                        When `state` was last observed; null
                                        when unknown. Present only where Alura
                                        serves its per-field freshest reads.
                                      anyOf:
                                        - type: string
                                          description: ISO 8601, UTC.
                                        - type: 'null'
                                    estimates_as_of:
                                      x-alura-switch: RESEARCH_READS_V2
                                      description: >-
                                        When the estimates served here (`sales`,
                                        `reviews`, `listing_score`) were last
                                        recomputed from complete inputs; null
                                        when unknown. Present only where Alura
                                        serves its per-field freshest reads.
                                      anyOf:
                                        - type: string
                                          description: ISO 8601, UTC.
                                        - type: 'null'
                                    as_of:
                                      anyOf:
                                        - type: string
                                          description: ISO 8601, UTC.
                                        - type: 'null'
                                      description: >-
                                        When this data was last updated. In
                                        search-backed summaries with
                                        RESEARCH_READS_V2 on: null until P9c
                                        projects source-normalized clocks. With
                                        the switch off: when Alura's search copy
                                        of the product was last synced (an
                                        approximation for older copies; null
                                        when unknown), which can differ from the
                                        product detail's `as_of`. In a bulk get
                                        by `ids`: the product detail's `as_of`.
                                  required:
                                    - object
                                    - id
                                    - title
                                    - url
                                    - shop
                                    - price
                                    - image_url
                                    - category
                                    - sales
                                    - reviews
                                    - favorites
                                    - listing_score
                                    - listed_at
                                    - as_of
                                  additionalProperties: false
                                - type: object
                                  properties:
                                    object:
                                      type: string
                                      const: research.shop
                                    id:
                                      type: string
                                      description: Etsy ID, as a string.
                                    name:
                                      type:
                                        - string
                                        - 'null'
                                    url:
                                      description: >-
                                        The shop on Etsy; null when its name is
                                        unknown.
                                      type:
                                        - string
                                        - 'null'
                                    icon_url:
                                      type:
                                        - string
                                        - 'null'
                                    country:
                                      description: ISO 3166-1 alpha-2.
                                      type:
                                        - string
                                        - 'null'
                                    category:
                                      anyOf:
                                        - type: object
                                          properties:
                                            name:
                                              type:
                                                - string
                                                - 'null'
                                            sub_category:
                                              type:
                                                - string
                                                - 'null'
                                          required:
                                            - name
                                            - sub_category
                                          additionalProperties: false
                                        - type: 'null'
                                      description: >-
                                        The shop's main category and
                                        sub-category, by name (shops have no
                                        category IDs).
                                    sales:
                                      type: object
                                      properties:
                                        lifetime:
                                          anyOf:
                                            - type: integer
                                            - type: 'null'
                                          description: Etsy's own count of the shop's sales.
                                        est_monthly_avg:
                                          description: >-
                                            Lifetime average, not the current pace:
                                            sales over the months since the shop
                                            opened, in whole units (0 = under half a
                                            sale a month). Recent sales:
                                            `est_last_month` and `est_trend_3m`.


                                            Estimate: see the methodology (version
                                            2026-10) at
                                            https://docs.alura.io/methodology/sales-estimates.
                                          type:
                                            - number
                                            - 'null'
                                        est_lifetime_revenue_usd:
                                          description: >-
                                            Estimated lifetime revenue, whole USD;
                                            null when unknown, including a stored 0
                                            for a shop with sales (a revenue never
                                            calculated).


                                            Estimate: see the methodology (version
                                            2026-10) at
                                            https://docs.alura.io/methodology/sales-estimates.
                                          type:
                                            - number
                                            - 'null'
                                        est_last_month:
                                          description: >-
                                            Estimated sales in the last completed
                                            UTC month (recent sales;
                                            `est_monthly_avg` is the lifetime
                                            average). null when unknown, which is
                                            common: many shops carry no recent-sales
                                            estimate yet, and a stored one for an
                                            older month is not served. Also null
                                            when it is above Etsy's count
                                            (`lifetime`). null is unknown, never
                                            zero.


                                            Estimate: see the methodology (version
                                            2026-10) at
                                            https://docs.alura.io/methodology/sales-estimates.
                                          type:
                                            - number
                                            - 'null'
                                        est_trend_3m:
                                          description: >-
                                            The last 3 completed months against the
                                            3 before (0.12 = +12%); null when
                                            unknown or when `est_last_month` is
                                            (null is unknown, never zero).


                                            Estimate: see the methodology (version
                                            2026-10) at
                                            https://docs.alura.io/methodology/sales-trend.
                                          type:
                                            - number
                                            - 'null'
                                      required:
                                        - lifetime
                                        - est_monthly_avg
                                        - est_lifetime_revenue_usd
                                        - est_last_month
                                        - est_trend_3m
                                      additionalProperties: false
                                      description: >-
                                        `lifetime` is Etsy's count; the rest are
                                        estimates (methodology:
                                        https://docs.alura.io/methodology/sales-estimates).
                                    reviews:
                                      type: object
                                      properties:
                                        count:
                                          anyOf:
                                            - type: integer
                                            - type: 'null'
                                        average:
                                          description: null when there are no reviews.
                                          type:
                                            - number
                                            - 'null'
                                      required:
                                        - count
                                        - average
                                      additionalProperties: false
                                    catalog:
                                      type: object
                                      properties:
                                        active_listings:
                                          anyOf:
                                            - type: integer
                                            - type: 'null'
                                      required:
                                        - active_listings
                                      additionalProperties: false
                                    as_of:
                                      description: >-
                                        ISO 8601, UTC. With RESEARCH_READS_V2
                                        on: null until P9c projects
                                        source-normalized clocks. With the
                                        switch off: when Alura's search copy of
                                        this shop was last synced (an
                                        approximation for older copies); null
                                        when unknown. It can differ from the
                                        shop detail's `as_of`.
                                      type:
                                        - string
                                        - 'null'
                                  required:
                                    - object
                                    - id
                                    - name
                                    - url
                                    - icon_url
                                    - country
                                    - category
                                    - sales
                                    - reviews
                                    - catalog
                                    - as_of
                                  additionalProperties: false
                                - type: object
                                  properties:
                                    object:
                                      type: string
                                      const: research.keyword
                                      description: Always `research.keyword`.
                                    id:
                                      type: string
                                      description: >-
                                        Alura's keyword ID, as a string; one per
                                        keyword and language. Use it with the
                                        other keyword endpoints.
                                    keyword:
                                      type: string
                                      description: >-
                                        The keyword in canonical form: trimmed,
                                        single spaces, lowercase, Unicode NFC.
                                    language:
                                      type: string
                                      description: >-
                                        The ISO code of its language (GET
                                        /v1/etsy/languages).
                                    volume:
                                      type: object
                                      properties:
                                        etsy_monthly:
                                          anyOf:
                                            - type: integer
                                            - type: 'null'
                                          description: >-
                                            Alura's estimate of monthly searches on
                                            Etsy: the average of the 12 months
                                            through the keyword's last complete Etsy
                                            month, from the months the keyword's
                                            history serves, rounded to a whole
                                            number. That month is never the month of
                                            `as_of`, sometimes earlier, and later
                                            when the estimate was redone after
                                            `as_of`. Null when any of those months
                                            is missing or has no figure, and
                                            whenever
                                            `competition.competing_listings` is 0 or
                                            null.
                                        google_monthly:
                                          anyOf:
                                            - type: integer
                                            - type: 'null'
                                          description: >-
                                            Average monthly Google searches; null
                                            when unknown, and for Swedish and
                                            Chinese (Traditional) while their Google
                                            data cannot be told apart.
                                      required:
                                        - etsy_monthly
                                        - google_monthly
                                      additionalProperties: false
                                      description: >-
                                        How often people search for the keyword,
                                        on Etsy and on Google.
                                    competition:
                                      type: object
                                      properties:
                                        level:
                                          description: >-
                                            `very_low`, `low`, `moderate`, `high` or
                                            `very_high` (open-ended); null whenever
                                            `competing_listings` is null.
                                          type:
                                            - string
                                            - 'null'
                                        competing_listings:
                                          anyOf:
                                            - type: integer
                                            - type: 'null'
                                          description: >-
                                            Etsy listings competing for the keyword;
                                            0 is a real zero. Null when unknown,
                                            including when the count came back 0
                                            although Alura found listings ranking
                                            for the keyword.
                                      required:
                                        - level
                                        - competing_listings
                                      additionalProperties: false
                                      description: >-
                                        How many Etsy listings compete for the
                                        keyword, and how hard that makes it.
                                    trend:
                                      type: object
                                      properties:
                                        change_3m:
                                          description: >-
                                            Etsy search volume, the keyword's last 3
                                            complete Etsy months (see
                                            `volume.etsy_monthly`) against the 3
                                            before them (0.12 = +12%), from the
                                            months the keyword's history serves;
                                            null when a month is missing or the base
                                            is 0, and when `etsy_monthly` is
                                            unknown.
                                          type:
                                            - number
                                            - 'null'
                                        change_yoy:
                                          description: >-
                                            Etsy search volume, the keyword's last
                                            complete Etsy month (see
                                            `volume.etsy_monthly`) against the same
                                            month a year earlier (0.30 = +30%), from
                                            the months the keyword's history serves;
                                            null when either month is missing or the
                                            base is 0, and when `etsy_monthly` is
                                            unknown.
                                          type:
                                            - number
                                            - 'null'
                                      required:
                                        - change_3m
                                        - change_yoy
                                      additionalProperties: false
                                      description: >-
                                        How Etsy search volume for the keyword
                                        is changing.
                                    market:
                                      type: object
                                      properties:
                                        avg_price_usd:
                                          description: >-
                                            Average price of the USD-priced listings
                                            ranking for the keyword; null when there
                                            are none.
                                          type:
                                            - number
                                            - 'null'
                                        est_avg_monthly_sales:
                                          description: >-
                                            Estimated average monthly sales of the
                                            listings ranking for the keyword. Always
                                            null in this version.


                                            Estimate: see the methodology (version
                                            2026-10) at
                                            https://docs.alura.io/methodology/keyword-market.
                                          type:
                                            - number
                                            - 'null'
                                      required:
                                        - avg_price_usd
                                        - est_avg_monthly_sales
                                      additionalProperties: false
                                      description: >-
                                        Prices and sales of the listings ranking
                                        for the keyword.
                                    as_of:
                                      type: string
                                      description: When the keyword was last calculated.
                                  required:
                                    - object
                                    - id
                                    - keyword
                                    - language
                                    - volume
                                    - competition
                                    - trend
                                    - market
                                    - as_of
                                  additionalProperties: false
                            - type: 'null'
                          description: >-
                            The product or shop summary search returns, or the
                            keyword object a keyword lookup returns; null unless
                            `status` is `available`.
                      required:
                        - object
                        - id
                        - list_id
                        - type
                        - ref_id
                        - added_at
                        - status
                        - data
                      additionalProperties: false
                  has_more:
                    type: boolean
                  next_cursor:
                    type:
                      - string
                      - 'null'
                  total:
                    type: object
                    properties:
                      value:
                        type: integer
                      relation:
                        type: string
                        enum:
                          - eq
                          - gte
                    required:
                      - value
                      - relation
                    additionalProperties: false
                  summary:
                    type: object
                    properties:
                      lists:
                        maxItems: 100
                        type: array
                        items:
                          type: object
                          properties:
                            list_id:
                              type: string
                              description: The list (`lst_...`).
                            item_count:
                              type: integer
                              minimum: 0
                              description: >-
                                Items the list holds (of `type`, when given):
                                all of them, not only the ones this read
                                returns.
                            truncated:
                              type: boolean
                              description: >-
                                `true` when `per_list` left some of its items
                                out of this read: read the list by its ID for
                                all of them.
                          required:
                            - list_id
                            - item_count
                            - truncated
                          additionalProperties: false
                        description: Each list with items on this page, in page order.
                    required:
                      - lists
                    additionalProperties: false
                required:
                  - object
                  - data
                  - has_more
                  - next_cursor
                  - total
                  - summary
                additionalProperties: false
              example:
                object: list
                data:
                  - object: research.saved_item
                    id: itm_00000000000000000004000001
                    list_id: lst_0000000000000000000000001B
                    type: product
                    ref_id: '4524717183'
                    added_at: '2026-09-02T09:00:00.000Z'
                    status: available
                    data:
                      object: research.product
                      id: '4524717183'
                      title: Personalized Name Mug, Custom Coffee Mug
                      url: https://www.etsy.com/listing/4524717183
                      shop:
                        id: '48911633'
                        name: MugCo
                      price:
                        amount: '24.99'
                        currency: EUR
                        usd: '27.10'
                      image_url: >-
                        https://i.etsystatic.com/48911633/r/il/0a1b2c/4524717183/il_570xN.4524717183_mug1.jpg
                      category:
                        id: '1062'
                        path:
                          - Home & Living
                          - Kitchen & Dining
                          - Drink & Barware
                          - Drinkware
                          - Mugs
                      sales:
                        est_lifetime: 6400
                        est_monthly_avg: 210
                        est_lifetime_revenue_usd: 173440
                        est_last_month: 236
                        est_trend_3m: 0.12
                      reviews:
                        count: 842
                        average: 4.9
                      favorites: 3120
                      listing_score: 86
                      listed_at: '2023-04-02T10:11:00.000Z'
                      as_of: '2026-10-13T08:05:00.000Z'
                  - object: research.saved_item
                    id: itm_00000000000000000008000001
                    list_id: lst_0000000000000000000000001B
                    type: shop
                    ref_id: '48911633'
                    added_at: '2026-09-02T09:00:00.000Z'
                    status: available
                    data:
                      object: research.shop
                      id: '48911633'
                      name: MugCo
                      url: https://www.etsy.com/shop/MugCo
                      icon_url: >-
                        https://i.etsystatic.com/iusa/0a1b2c/48911633/iusa_fullxfull.48911633_mugco.jpg
                      country: US
                      category:
                        name: Home & Living
                        sub_category: Kitchen & Dining
                      sales:
                        lifetime: 48210
                        est_monthly_avg: 1150
                        est_lifetime_revenue_usd: 1272700
                        est_last_month: 1240
                        est_trend_3m: 0.08
                      reviews:
                        count: 9120
                        average: 4.9
                      catalog:
                        active_listings: 1661
                      as_of: '2026-10-13T09:47:00.000Z'
                  - object: research.saved_item
                    id: itm_0000000000000000000C000001
                    list_id: lst_0000000000000000000000001B
                    type: keyword
                    ref_id: '88123'
                    added_at: '2026-09-02T09:00:00.000Z'
                    status: available
                    data:
                      object: research.keyword
                      id: '88123'
                      keyword: personalized mug
                      language: en
                      volume:
                        etsy_monthly: 12400
                        google_monthly: 40500
                      competition:
                        level: high
                        competing_listings: 182000
                      trend:
                        change_3m: 0.12
                        change_yoy: 0.3
                      market:
                        avg_price_usd: 24.1
                        est_avg_monthly_sales: null
                      as_of: '2026-10-12T04:00:00.000Z'
                has_more: false
                next_cursor: null
                total:
                  value: 3
                  relation: eq
                summary:
                  lists:
                    - list_id: lst_0000000000000000000000001B
                      item_count: 4
                      truncated: true
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '402':
          $ref: '#/components/responses/Problem402'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '405':
          $ref: '#/components/responses/Problem405'
        '429':
          $ref: '#/components/responses/Problem429'
        '500':
          $ref: '#/components/responses/Problem500'
        '503':
          $ref: '#/components/responses/Problem503'
      x-codeSamples:
        - lang: bash
          label: cURL
          source: |-
            curl "https://api.alura.io/v1/research/saved/items?per_list=3" \
              -H "Authorization: Bearer $ALURA_API_KEY"
        - lang: typescript
          label: TypeScript
          source: >-
            const res = await
            fetch('https://api.alura.io/v1/research/saved/items?per_list=3', {
              headers: {
                Authorization: `Bearer ${process.env.ALURA_API_KEY}`,
              },
            });

            console.log(await res.json());
        - lang: python
          label: Python
          source: |-
            import json
            import os
            import urllib.request

            request = urllib.request.Request(
                "https://api.alura.io/v1/research/saved/items?per_list=3",
                headers={
                    "Authorization": f"Bearer {os.environ['ALURA_API_KEY']}",
                },
            )
            with urllib.request.urlopen(request) as response:
                print(json.load(response))
components:
  headers:
    Request-Id:
      description: '`req_` + ULID; quote it when reporting a problem.'
      schema:
        type: string
    Alura-Credits-Cost:
      description: API credits this call cost.
      schema:
        type: integer
    Alura-Credits-Remaining:
      description: >-
        API credits left in the workspace's monthly allowance, counting calls
        still in flight. Absent when it cannot be read right now.
      schema:
        type: integer
  responses:
    Problem400:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/invalid_request
            title: Invalid request
            status: 400
            code: invalid_request
            detail: Invalid request
            suggestion: Fix the request as the detail says, then send it again.
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem401:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/unauthorized
            title: Unauthorized
            status: 401
            code: unauthorized
            detail: Unauthorized
            suggestion: 'Send a valid API key as `Authorization: Bearer alura_sk_...`.'
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem402:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/credits_exhausted
            title: API credits exhausted
            status: 402
            code: credits_exhausted
            detail: API credits exhausted
            suggestion: Upgrade the plan or wait for the monthly reset.
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem403:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/plan_required
            title: Plan required
            status: 403
            code: plan_required
            detail: Plan required
            suggestion: Upgrade the workspace plan to use this operation.
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem404:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/not_found
            title: Not found
            status: 404
            code: not_found
            detail: Not found
            suggestion: Check the ID, or search for it first.
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem405:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/method_not_allowed
            title: Method not allowed
            status: 405
            code: method_not_allowed
            detail: Method not allowed
            suggestion: Use one of the methods in the Allow header.
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem429:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/rate_limited
            title: Rate limited
            status: 429
            code: rate_limited
            detail: Rate limited
            suggestion: Wait for Retry-After, then retry.
            retryable: true
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem500:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/internal_error
            title: Internal error
            status: 500
            code: internal_error
            detail: Internal error
            suggestion: Retry; if it keeps failing, report the request_id.
            retryable: true
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem503:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/credits_unavailable
            title: API credits unavailable
            status: 503
            code: credits_unavailable
            detail: API credits unavailable
            suggestion: Retry shortly.
            retryable: true
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
  schemas:
    Problem:
      type: object
      description: RFC 9457 problem details.
      properties:
        type:
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
        code:
          type: string
          description: A code from the error catalog; new codes may be added.
          x-extensible-enum:
            - invalid_request
            - unknown_parameter
            - invalid_cursor
            - cursor_window_exceeded
            - invalid_reference
            - id_type_mismatch
            - invalid_keyword
            - shop_id_required
            - listing_not_publishable
            - sales_window_not_covered
            - unauthorized
            - credits_exhausted
            - plan_required
            - insufficient_scope
            - workspace_required
            - workspace_locked
            - your_shop_unavailable
            - writes_suspended
            - browser_refused
            - role_required
            - impersonation_refused
            - recent_sign_in_required
            - etsy_scope_required
            - etsy_partner_required
            - not_found
            - not_collected
            - not_found_on_etsy
            - shop_opted_out
            - method_not_allowed
            - conflict
            - key_limit_reached
            - reconnect_required
            - settings_not_fetched
            - listing_busy
            - settings_busy
            - shop_create_busy
            - idempotency_partial_unverifiable
            - listing_has_variations
            - changed_since
            - change_not_revertable
            - listing_in_ab_test
            - activation_skipped
            - idempotency_processing
            - confirmation_required
            - test_shop_active_cap
            - write_outcome_unknown
            - unprocessable
            - listing_removed_on_etsy
            - endpoint_removed
            - rate_limited
            - throttled
            - daily_credit_cap_exceeded
            - credits_reserved
            - fetch_limit_reached
            - write_rate_limited
            - sync_cooldown
            - shop_write_budget_exhausted
            - internal_error
            - write_misconfigured
            - upstream_unavailable
            - credits_unavailable
            - service_unavailable
            - fetch_unavailable
            - create_lock_unavailable
            - writes_paused
            - etsy_capacity
            - upstream_timeout
        detail:
          type: string
        suggestion:
          type: string
        retryable:
          type: boolean
        request_id:
          type: string
        upgrade_url:
          type: string
          format: uri
          description: 'credits_exhausted and plan_required: where to upgrade the plan.'
        credits_needed:
          type: integer
          description: 'API credit refusals: what the call needed.'
        credits_remaining:
          type: integer
          description: >-
            API credit refusals: what is left (of the month, or of the day for
            daily_credit_cap_exceeded).
        resets_at:
          type: string
          format: date-time
          description: >-
            credits_exhausted and daily_credit_cap_exceeded: when the limit
            resets.
      required:
        - type
        - title
        - status
        - code
        - detail
        - suggestion
        - retryable
        - request_id
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: 'An API key: `Authorization: Bearer alura_sk_...`.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.