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

# Read the journal for a date range

> Returns every date from `from` to `to`, empty days included, so the journal renders
straight off the response. Each day carries both slots — `morning` and `evening`,
null when there is no entry — and the day's derived `activity`: completed study
minutes and blocks from the planner, and denemeler from the journey. Activity is
derived on every read, so a corrected study block corrects the journal too.

The default window is the last seven days ending today. The range is capped at
62 days — read a month at a time; there is no cursor, because a date range is
already a bounded read. Both dates are local Istanbul dates, the planner convention.



## OpenAPI

````yaml /api-reference/openapi.json get /api/checkins
openapi: 3.1.0
info:
  title: Lala Client API
  description: >-
    The HTTP API behind Lala, the AI study companion for Turkish YKS and LGS
    students. This document is generated from the Zod schemas that validate each
    request at runtime. Do not hand-edit openapi.json. Student-visible text is
    Turkish. All identifiers are English.
  version: 1.0.0
servers:
  - url: https://client-api.lala.ist
    description: production
  - url: http://localhost:3000
    description: local dev
security:
  - supabaseJwt: []
tags:
  - name: chat
    description: The chat stream, the message history, and reactions
  - name: media
    description: Upload and read message attachments
  - name: plan
    description: The study planner — blocks of work on a day
  - name: journey
    description: Deneme results, topic performance, study-hours stats, and the streak
  - name: profile
    description: The student profile and onboarding
  - name: devices
    description: Push notification devices
  - name: system
    description: Health check
paths:
  /api/checkins:
    get:
      tags:
        - checkins
      summary: Read the journal for a date range
      description: >-
        Returns every date from `from` to `to`, empty days included, so the
        journal renders

        straight off the response. Each day carries both slots — `morning` and
        `evening`,

        null when there is no entry — and the day's derived `activity`:
        completed study

        minutes and blocks from the planner, and denemeler from the journey.
        Activity is

        derived on every read, so a corrected study block corrects the journal
        too.


        The default window is the last seven days ending today. The range is
        capped at

        62 days — read a month at a time; there is no cursor, because a date
        range is

        already a bounded read. Both dates are local Istanbul dates, the planner
        convention.
      operationId: getApiCheckins
      parameters:
        - in: query
          name: from
          schema:
            type: string
          description: >-
            Local Istanbul calendar date, `YYYY-MM-DD`. Defaults to six days
            before `to`.
        - in: query
          name: to
          schema:
            type: string
          description: Local Istanbul calendar date, `YYYY-MM-DD`. Defaults to today.
      responses:
        '200':
          description: The journal, by day
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CheckInRangeResponse'
        '400':
          description: The entry or the range is not valid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: The token is missing, expired, or invalid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    CheckInRangeResponse:
      type: object
      properties:
        from:
          type: string
        to:
          type: string
        days:
          type: array
          items:
            $ref: '#/components/schemas/CheckInDay'
          description: Every date in the range, empty days included.
      required:
        - from
        - to
        - days
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
        issues:
          description: >-
            Present only on a 400 raised by request validation, capped at 10
            entries. Every other error carries `error` alone.
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssue'
      required:
        - error
      description: Error body. `error` is a short English string.
    CheckInDay:
      type: object
      properties:
        date:
          type: string
          description: Local Istanbul calendar date, `YYYY-MM-DD`.
        morning:
          anyOf:
            - $ref: '#/components/schemas/CheckIn'
            - type: 'null'
        evening:
          anyOf:
            - $ref: '#/components/schemas/CheckIn'
            - type: 'null'
        activity:
          $ref: '#/components/schemas/CheckInDayActivity'
      required:
        - date
        - morning
        - evening
        - activity
    ValidationIssue:
      type: object
      properties:
        path:
          type: string
          description: Dotted path to the offending field, empty at the root.
        message:
          type: string
      required:
        - path
        - message
    CheckIn:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        date:
          type: string
          description: Local Istanbul calendar date, `YYYY-MM-DD`.
        type:
          $ref: '#/components/schemas/CheckInType'
        mood:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
          description: '"Bugün nasıl geçti?" — 1 (worst) to 5 (best). Null when skipped.'
        feelings:
          type: array
          items:
            $ref: '#/components/schemas/CheckInFeeling'
          description: In the order the student tapped.
        summary:
          anyOf:
            - type: string
            - type: 'null'
          description: The free-text summary of the day.
        ready:
          anyOf:
            - type: boolean
            - type: 'null'
          description: >-
            The closing yes/no. Evening: "Yatmaya hazır hissediyor musun?",
            morning: "Güne hazır hissediyor musun?". Null when the student
            tapped "Atla ve kaydet".
        media:
          type: array
          items:
            $ref: '#/components/schemas/Media'
          description: Photos attached to the summary.
        source:
          type: string
          enum:
            - manual
            - call
            - chat
          description: '`call` or `chat` when Lala filled the entry from a conversation.'
        createdBy:
          type: string
          enum:
            - student
            - lala
        completedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
          description: When the flow was first finished. Edits move `updatedAt`, not this.
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
      required:
        - id
        - date
        - type
        - mood
        - feelings
        - summary
        - ready
        - media
        - source
        - createdBy
        - completedAt
        - createdAt
        - updatedAt
    CheckInDayActivity:
      type: object
      properties:
        studyMin:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            Completed planner minutes on the day. A block with no length counts
            zero.
        blocksDone:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        blocksTotal:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Every block on the day, any status.
        denemeCount:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
      required:
        - studyMin
        - blocksDone
        - blocksTotal
        - denemeCount
      description: >-
        What the day actually held, derived from the planner and the journey on
        every read.
    CheckInType:
      type: string
      enum:
        - morning
        - evening
      description: '`morning` is the Sabah Özeti, `evening` is the Akşam Z-Raporu.'
    CheckInFeeling:
      type: string
      enum:
        - brave
        - content
        - proud
        - loving
        - excited
        - calm
        - happy
        - motivated
        - grateful
        - relieved
      description: >-
        A feeling chip. Turkish labels, in order: Cesur, Memnun, Gururlu, Sevgi
        dolu, Heyecanlı, Sakin, Mutlu, Motive, Minnettar, Rahatlamış. On write,
        the Turkish name is accepted too.
    Media:
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        kind:
          $ref: '#/components/schemas/MediaKind'
        mimeType:
          type: string
        sizeBytes:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
        width:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
        height:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
        durationMs:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
        fileName:
          anyOf:
            - type: string
            - type: 'null'
        status:
          type: string
          enum:
            - pending
            - ready
          description: '`ready` when the bytes are in storage. Only ready media can be sent.'
        url:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Short-lived signed URL, null while the media is pending. It expires
            — read the media or the message again for a new one. Do not cache
            it.
        urlExpiresAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            - type: 'null'
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
      required:
        - id
        - kind
        - mimeType
        - sizeBytes
        - width
        - height
        - durationMs
        - fileName
        - status
        - url
        - urlExpiresAt
        - createdAt
    MediaKind:
      type: string
      enum:
        - image
        - audio
        - video
        - file
  securitySchemes:
    supabaseJwt:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'Supabase access token: `Authorization: Bearer <token>`'

````

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