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

# Record daily attendance for many students

> Record up to 200 daily-attendance records in one request. Requires an access token from an API client with the attendance-daily scope (see Authentication). The body is a JSON array of the same records accepted by POST /attendance/daily, with the same matching, code mapping, and idempotency rules. The response carries one result per record, in request order, each with the record's index and, on failure, the HTTP status and error code the single-record endpoint would have returned. The response is 200 when every record succeeded and 207 when any failed. An invalid record fails on its own; an unexpected server error (500) fails every record for the same date, which is safe to resend. Records for the same student and date are applied in request order, so the last one wins. Send larger reconciliations in chunks of at most 200 records.




## OpenAPI

````yaml /api-reference/openapi.json post /attendance/daily/bulk
openapi: 3.1.0
info:
  title: Scout API
  version: 1.0.0
  description: >-
    Programmatic access to Scout rostering data (IMS OneRoster 1.1 & 1.2) and
    related endpoints, authenticated with an API access token.
servers:
  - url: https://api.teachwithscout.com/v1
    description: Production
security: []
tags:
  - name: Access tokens
  - name: Attendance
  - name: Enrollment invitations
  - name: OneRoster 1.1
  - name: OneRoster 1.2
paths:
  /attendance/daily/bulk:
    post:
      tags:
        - Attendance
      summary: Record daily attendance for many students
      description: >
        Record up to 200 daily-attendance records in one request. Requires an
        access token from an API client with the attendance-daily scope (see
        Authentication). The body is a JSON array of the same records accepted
        by POST /attendance/daily, with the same matching, code mapping, and
        idempotency rules. The response carries one result per record, in
        request order, each with the record's index and, on failure, the HTTP
        status and error code the single-record endpoint would have returned.
        The response is 200 when every record succeeded and 207 when any failed.
        An invalid record fails on its own; an unexpected server error (500)
        fails every record for the same date, which is safe to resend. Records
        for the same student and date are applied in request order, so the last
        one wins. Send larger reconciliations in chunks of at most 200 records.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              minItems: 1
              maxItems: 200
              items:
                $ref: '#/components/schemas/DailyAttendanceRecord'
      responses:
        '200':
          description: Every record was recorded, updated, or already current.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DailyAttendanceBulkResult'
        '207':
          description: >-
            Some records failed; see each result's error. The other records were
            recorded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DailyAttendanceBulkResult'
        '400':
          description: >-
            The body is not a JSON array, is empty, or has more than 200
            records. Nothing was recorded.
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: integer
                    example: 400
                  message:
                    type: string
        '403':
          description: Forbidden - requires an API token, and in-person attendance enabled
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: integer
                    example: 403
                  message:
                    type: string
      security:
        - accessToken: []
components:
  schemas:
    DailyAttendanceRecord:
      type: object
      description: >-
        One student's attendance for one school day, reported by an attendance
        vendor.
      properties:
        studentId:
          type: string
          description: >-
            The student the record is for. Accepts the OneRoster identifier
            (student number), the state identifier (e.g. SSID), or the Scout
            student id (OneRoster sourcedId).
        date:
          type: string
          description: The school day, as YYYY-MM-DD. Must not be in the future.
        attendanceCode:
          type: string
          description: >-
            The day's attendance status. Accepts Scout status names
            (case-insensitive) — Present, Late, ExcusedLate, Absent,
            ExcusedAbsence, LeftEarly — or common letter codes: P, T/L (tardy),
            A, E/EA (excused absence), ET/TE (excused tardy), LE (left early).
        arrivalTime:
          type: string
          nullable: true
          description: >-
            When the student arrived, as 24-hour local time (HH:mm or HH:mm:ss)
            on the record's date, read as Pacific time. Stored as a timestamp
            and returned by the attendance reads; also used as the attendance
            log description when no comment is given. Not used to compute late
            minutes.
        comment:
          type: string
          nullable: true
          description: Free-text note, stored as the attendance log description.
      required:
        - studentId
        - date
        - attendanceCode
    DailyAttendanceBulkResult:
      type: object
      description: Outcome of a bulk daily-attendance request.
      properties:
        summary:
          type: object
          description: Count of records by outcome.
          properties:
            recorded:
              type: integer
            updated:
              type: integer
            duplicate:
              type: integer
            failed:
              type: integer
          required:
            - recorded
            - updated
            - duplicate
            - failed
        results:
          type: array
          description: One result per request record, in request order.
          items:
            type: object
            description: Outcome of one record in a bulk daily-attendance request.
            properties:
              index:
                type: integer
                description: Zero-based position of the record in the request array.
              studentId:
                type: string
                description: The record's studentId as sent, when it was a string.
              date:
                type: string
                description: The record's date as sent, when it was a string.
              status:
                type: string
                description: >-
                  recorded — a new attendance day was written; updated — an
                  existing day's status was overwritten (last write wins);
                  duplicate — the day already held this status, nothing changed;
                  error — the record was not recorded, see error.
                enum:
                  - recorded
                  - updated
                  - duplicate
                  - error
              scoutStudentId:
                type: string
                description: >-
                  The Scout id of the matched student. Present unless status is
                  error.
              mappedStatus:
                description: >-
                  The Scout status the attendanceCode mapped to. Present unless
                  status is error.
                type: string
                enum:
                  - Absent
                  - ExcusedAbsence
                  - ExcusedLate
                  - Late
                  - LeftEarly
                  - Present
              error:
                description: Present only when status is error.
                type: object
                properties:
                  status:
                    type: integer
                    description: >-
                      The HTTP status the single-record endpoint would have
                      returned for this record (400 invalid record, 404 student
                      not found, 500 internal error).
                  code:
                    type: string
                    description: >-
                      Stable machine-readable error name, e.g. StudentNotFound,
                      UnknownAttendanceCode, InvalidDailyAttendanceRecord,
                      InvalidAttendanceDate, FutureAttendanceStatusNotAllowed,
                      AmbiguousStudentIdentifier, StudentOnIndependentStudy,
                      AttendanceBlockedByNoShowEnrollment,
                      AttendanceAfterRequestedWithdrawal, InternalError.
                  message:
                    type: string
                    description: Human-readable explanation.
                required:
                  - status
                  - code
                  - message
            required:
              - index
              - status
      required:
        - summary
        - results
  securitySchemes:
    accessToken:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Bearer access token from `POST /oauth/token` (OAuth 2.0 client
        credentials; the OneRoster `/ims/oneroster/v1p1/token` and `/v1p2/token`
        URLs are aliases). Send it as `Authorization: Bearer <access_token>`.
        Tokens expire after 1 hour and carry your API client's granted scopes —
        an endpoint outside them returns 403.

````

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