---
title: "Bootstrap native offline account data"
method: GET
path: "/api/v1/me/sync"
tags: ["Account"]
---

# Bootstrap native offline account data

`GET /api/v1/me/sync`

## Request

- Base URL: `https://spoonjoy.app`
- URL: `https://spoonjoy.app/api/v1/me/sync`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `__session`
  - OAuth 2 (authorization code, authorization URL `https://spoonjoy.app/oauth/authorize`, token URL `https://spoonjoy.app/oauth/token`, scopes: `account:read`, `kitchen:read`)

## Query parameters

- `cursor` string
- `limit` integer

## Headers

- `X-Request-Id` string

## Response `200`

Success

- NativeAccountSyncEnvelope
  - `ok` unknown, required
  - `requestId` string, required
  - `data` NativeAccountSyncData, required
    - `freshness` NativeSyncFreshness, required
      - `accountId` string, required
      - `environment` 'local' | 'preview' | 'production', required
      - `schemaVersion` integer, required
      - `sourceEndpoint` '/api/v1/me/sync', required
      - `generatedAt` string, date-time, required
      - `lastValidatedAt` string, date-time, required
    - `entries` NativeSyncEntry[], required
      - `action` 'upsert' | 'delete', required
      - `kind` 'profile' | 'recipe' | 'cookbook' | 'shoppingItem', required
      - `resourceId` string, required
      - `updatedAt` string, date-time, required
      - `payload` union
        - NativeProfileSnapshot
          - `id` string, required
          - `email` string, email, required
          - `username` string, required
          - `photoUrl` string, nullable, required
          - `joinedLabel` string, required
          - `createdAt` string, date-time, required
          - `updatedAt` string, date-time, required
        - RecipeDetail
          - `id` string, required
          - `title` string, required
          - `description` string, nullable, required
          - `servings` string, nullable, required
          - `chef` ChefSummary, required
            - `id` string, required
            - `username` string, required
            - `photoUrl` string, uri, nullable
          - `coverImageUrl` string, nullable, required: Public cover image URL for transient display. Spoonjoy-hosted /photos/ URLs accept ?w=<pixels> for a smaller WebP; see photoVariants in the API root. API v1 does not provide image alt text or a license to copy/store photos outside Spoonjoy.
          - `coverProvenanceLabel` string, nullable, required: Human-readable active cover provenance label such as Original photo, Editorial photo, Imported photo, or AI generated.
          - `coverSourceType` 'ai-placeholder' | 'chef-upload' | 'import' | 'spoon' | 'null', nullable, required: Active cover provenance source. Null when the recipe has no active public cover.
          - `coverVariant` 'image' | 'stylized' | 'null', nullable, required: Active cover variant: image is verbatim/pure AI/imported display; stylized is an editorialized chef photo. Null when no active cover is available.
          - `href` string, required
          - `canonicalUrl` string, uri, required
          - `attribution` RecipeAttribution, required
            - `creditText` string, required
            - `canonicalUrl` string, uri, required
            - `sourceUrl` string, nullable, required: User-provided provenance URL. Validate and allow-list schemes before rendering as a link.
            - `sourceHost` string, nullable, required
            - `sourceRecipe` SourceRecipeAttribution, required
              - …
          - `createdAt` string, date-time, required
          - `updatedAt` string, date-time, required
          - `steps` RecipeStep[], required: Recipe steps returned in ascending stepNum order.
            - `id` string, required
            - `stepNum` integer, required: Display order. Recipe detail responses return steps in ascending stepNum order.
            - `stepTitle` string, nullable, required: Optional author-provided step heading. Render as text, not HTML.
            - `description` string, required: Author-provided instruction text. Render as text, not HTML.
            - `duration` integer, nullable, required: Minutes, when the author supplied a duration. Null means no duration was set.
            - `ingredients` RecipeIngredient[], required: Ingredients attached to this step, in API order. API v1 does not expose a separate ingredient display-text field.
              - …
            - `usingSteps` RecipeStepOutputUse[], required: Prior recipe steps whose outputs this step uses, ordered by outputStepNum.
              - …
          - `cookbooks` CookbookLink[], required
            - `id` string, required
            - `title` string, required
            - `href` string, required
            - `canonicalUrl` string, uri, required
        - CookbookDetail
          - `id` string, required
          - `title` string, required
          - `chef` ChefSummary, required
            - `id` string, required
            - `username` string, required
            - `photoUrl` string, uri, nullable
          - `recipeCount` integer, required
          - `coverImageUrls` string[], required: Public recipe cover image URLs for transient display. API v1 does not provide image alt text or a license to copy/store photos outside Spoonjoy.
          - `href` string, required
          - `canonicalUrl` string, uri, required
          - `attribution` CookbookAttribution, required
            - `creditText` string, required
            - `canonicalUrl` string, uri, required
          - `createdAt` string, date-time, required
          - `updatedAt` string, date-time, required
          - `recipes` RecipeSummary[], required: Currently public, non-deleted recipe summaries in cookbook order.
            - `id` string, required
            - `title` string, required
            - `description` string, nullable, required
            - `servings` string, nullable, required
            - `chef` ChefSummary, required
              - …
            - `coverImageUrl` string, nullable, required: Public cover image URL for transient display. Spoonjoy-hosted /photos/ URLs accept ?w=<pixels> for a smaller WebP; see photoVariants in the API root. API v1 does not provide image alt text or a license to copy/store photos outside Spoonjoy.
            - `coverProvenanceLabel` string, nullable, required: Human-readable active cover provenance label such as Original photo, Editorial photo, Imported photo, or AI generated.
            - `coverSourceType` 'ai-placeholder' | 'chef-upload' | 'import' | 'spoon' | 'null', nullable, required: Active cover provenance source. Null when the recipe has no active public cover.
            - `coverVariant` 'image' | 'stylized' | 'null', nullable, required: Active cover variant: image is verbatim/pure AI/imported display; stylized is an editorialized chef photo. Null when no active cover is available.
            - `href` string, required
            - `canonicalUrl` string, uri, required
            - `attribution` RecipeAttribution, required
              - …
            - `createdAt` string, date-time, required
            - `updatedAt` string, date-time, required
        - ShoppingItem
          - `id` string, required
          - `name` string, required
          - `quantity` number, nullable, required
          - `unit` string, nullable, required
          - `checked` boolean, required
          - `checkedAt` string, date-time, nullable, required
          - `deletedAt` string, date-time, nullable, required
          - `categoryKey` string, nullable, required
          - `iconKey` string, nullable, required
          - `sortIndex` integer, required
          - `updatedAt` string, date-time, required
        - object
      - `tombstone` NativeSyncTombstone
        - `resourceType` 'recipe' | 'cookbook' | 'shoppingItem', required
        - `resourceId` string, required
        - `parentResourceId` string, nullable, required
        - `title` string, nullable, required
        - `deletedAt` string, date-time, required
        - `updatedAt` string, date-time, required
    - `nextCursor` string, nullable, required
    - `hasMore` boolean, required

## Other responses

- `400`: Errors: invalid_cursor, validation_error
- `401`: Errors: authentication_required, invalid_token
- `403`: Errors: insufficient_scope
- `404`: Errors: not_found
- `405`: Errors: method_not_allowed
- `429`: Errors: rate_limited
- `500`: Errors: internal_error
- `503`: Errors: temporarily_unavailable

---

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