---
title: "Batch-read bookmarks"
method: POST
path: "/v1/bookmarks/batch-read"
tags: ["Bookmarks"]
---

# Batch-read bookmarks

`POST /v1/bookmarks/batch-read`

## Request

- Base URL: `https://stashr.me`
- URL: `https://stashr.me/v1/bookmarks/batch-read`
- Auth: HTTP bearer

Read up to 20 bookmarks in full in one call. POST is used only because the id list does not fit a query string — this is a pure read requiring the read scope. items preserves request order; missing lists ids that were not found.

## Request body

- object
  - `ids` string[], required

## Response `200`

The requested bookmarks, in request order, plus any ids not found

- object
  - `data` object, required
    - `items` Bookmark[], required
      - `author` Author, nullable
        - `avatarUrl` string, nullable
        - `displayName` string, nullable
        - `profileUrl` string, nullable
        - `username` string, required
      - `capturedAt` string, date-time, required
      - `content` object[], required: Portable Text blocks holding the full body
      - `contentCreatedAt` string, date-time, nullable
      - `contentType` string, required: One of: repo, image, post, video, comment, article, page, snippet
      - `deletedAt` string, date-time, nullable
      - `id` string, uuid, required
      - `isFavorite` boolean
      - `media` Media[], required
        - `altText` string, nullable
        - `duration` number, nullable
        - `height` integer, nullable
        - `ref` string, required: Stable media ref usable with the media preview
        - `storedUrl` string, nullable
        - `thumbUrl` string, nullable: 800px webp derivative of storedUrl, when generated. Prefer it for previews/grids; storedUrl is the full-resolution archive.
        - `type` 'image' | 'video', required
        - `url` string, required
        - `width` integer, nullable
      - `note` string, nullable
      - `platform` 'github' | 'instagram' | 'reddit' | 'tiktok' | 'twitter' | 'web' | 'youtube', required: Platform id. X/Twitter is "twitter".
      - `platformId` string
      - `tags` Tag[], required
        - `color` string, required
        - `count` integer, required: Active bookmarks currently carrying this tag
        - `id` string, uuid, required
        - `name` string, required
      - `title` string, nullable: Present on titled content such as X articles
      - `url` string, uri, required
    - `missing` string[], required

## Other responses

- `400`: Malformed request (error.code bad_request or invalid_json)
- `401`: Missing, invalid, or expired credentials (error.code unauthorized)
- `402`: A Pro plan or active trial is required (error.code payment_required)
- `403`: The credential lacks the required scope (error.code forbidden)
- `404`: The resource does not exist or belongs to another account (error.code not_found)
- `422`: Validation failed; error.details.issues lists the fields (error.code validation_error)
- `429`: Too many requests (error.code rate_limited); wait Retry-After seconds, also given as error.retryAfterMs
- `500`: Something failed on Stashr's side (error.code internal_error); retryable

---

[API](https://skmtc.dev/stashr/apis/stashr-api.md) · [All operations](https://skmtc.dev/stashr/apis/stashr-api/llms.txt) · [OpenAPI document](https://skmtc.dev/stashr/apis/stashr-api/revisions/bcab186e0646?raw)
