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

# Set sample expiration (bulk)

> All-or-nothing: if any sample fails the permission gate the whole call is rejected before any writes. Max 500 IDs per call.



## OpenAPI

````yaml PATCH /samples/expiration
openapi: 3.1.0
info:
  title: Strand AI Platform API
  version: v1
  description: >-
    REST surface for uploading WSIs, submitting Lattice inference jobs, and
    streaming results. All endpoints require an `Authorization: Bearer
    sk-strand-...` header. Generate keys at `/settings/api-keys`.
servers:
  - url: https://app.strandai.com/api/v1
    description: Production
security:
  - ApiKey: []
paths:
  /samples/expiration:
    patch:
      tags:
        - Samples
      summary: Set sample expiration (bulk)
      description: >-
        All-or-nothing: if any sample fails the permission gate the whole call
        is rejected before any writes. Max 500 IDs per call.
      operationId: setSamplesExpirationBulk
      requestBody:
        required: true
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/ExpirationUpdate'
                - type: object
                  required:
                    - sampleIds
                  properties:
                    sampleIds:
                      type: array
                      minItems: 1
                      maxItems: 500
                      items:
                        type: string
                        format: uuid
      responses:
        '200':
          description: Bulk update result
          content:
            application/json:
              schema:
                type: object
                required:
                  - updated
                  - batchId
                properties:
                  updated:
                    type: integer
                  batchId:
                    type: string
                    format: uuid
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: One or more samples are not in the API key's org
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Invalid input
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    ExpirationUpdate:
      type: object
      description: >-
        Provide exactly one of `expiresAt`, `neverExpire: true`, or
        `useOrgDefault: true`. `neverExpire: true` is sugar for `expiresAt:
        null` (custom). `useOrgDefault: true` clears the custom expiration and
        follows the org's default policy.
      properties:
        expiresAt:
          type: string
          format: date-time
          nullable: true
        neverExpire:
          type: boolean
        useOrgDefault:
          type: boolean
        reason:
          type: string
          maxLength: 500
    Error:
      type: object
      required:
        - error
        - message
      properties:
        error:
          type: string
        message:
          type: string
        required:
          type: integer
          nullable: true
  securitySchemes:
    ApiKey:
      type: http
      scheme: bearer
      bearerFormat: sk-strand-XXXXXXXXXXXXXXXXXXXXXXXX

````