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

# Bulk Create Records

> Creates or upserts up to 100 records in a single request using either table ID or table name.

Creates up to 100 records in one request using either the table ID or table name. Optionally performs an **upsert** (create or update existing records) by matching on one or more field values.

<Note>
  Use field names or field IDs as keys and field values as data (e.g., `"Email": "user@example.com"` or `"fwtJyga6dso": "user@example.com"`)
</Note>

## Limits

| Parameter | Type  | Required | Min | Max |
| --------- | ----- | -------- | --- | --- |
| `records` | array | Yes      | 1   | 100 |
| `matchOn` | array | No       | 1   | 20  |

<Note>Any `id` key included in a record is ignored — the database generates the record ID.</Note>

## Upsert with `matchOn`

Pass `matchOn` with a list of **field IDs** to upsert instead of always creating. For each incoming record, existing records are matched on **all** of the listed fields:

* If a match is found, that record is **updated** with the provided values.
* If no match is found, a new record is **created**.

```json theme={null}
{
  "records": [
    { "Email": "john@example.com", "Name": "John Doe", "Priority": "high" },
    { "Email": "jane@example.com", "Name": "Jane Smith", "Priority": "low" }
  ],
  "matchOn": ["k8mNp2xQ9rL"]
}
```

<Warning>Unlike the keys inside each record, `matchOn` accepts **field IDs only** — field names are rejected. A record's field IDs are the keys of the `data` object returned by any record endpoint (for example, [List Records](/help/database/api/list-records)).</Warning>

<Note>When `matchOn` is provided, the response status is `200` (records may have been updated) rather than `201`.</Note>


## OpenAPI

````yaml help/database/openapi.json POST /bases/{databaseId}/tables/{tableId}/records/bulk
openapi: 3.0.1
info:
  title: Zite DB REST API
  description: >-
    A REST API for managing Zite databases, tables, fields, and records. Build
    database-driven applications with programmatic access to your structured
    data.


    ## What is REST API


    A **REST API** simplifies interaction with your database data, allowing for
    automation and integration. Following RESTful principles, it seamlessly
    connects to retrieve, create, and modify database data.


    ## Getting Started


    ### Authentication

    All API requests require authentication using your Zite API key in the
    Authorization header:

    ```

    Authorization: Bearer YOUR_API_KEY

    ```


    ### Base URL

    https://tables.zite.com/api/v1


    ### Rate Limits

    API requests are rate limited to ensure service quality. Standard rate
    limits apply to all endpoints.


    ### Error Handling

    The API returns standard HTTP status codes and JSON error responses with
    detailed error messages.
  version: 1.0.0
servers:
  - url: https://tables.zite.com/api/v1
    description: Zite DB API
security:
  - bearerAuth: []
tags:
  - name: Databases
    description: Operations for managing databases
  - name: Tables
    description: Operations for managing tables within databases
  - name: Fields
    description: Operations for managing fields within tables
  - name: Records
    description: Operations for managing records within tables
  - name: Webhooks
    description: >-
      Operations for managing webhook subscriptions to receive real-time
      notifications when database events occur
paths:
  /bases/{databaseId}/tables/{tableId}/records/bulk:
    post:
      tags:
        - Records
      summary: Bulk create records
      description: >-
        Creates up to 100 records in a single request. Optionally performs an
        upsert (create or update existing records) by matching on one or more
        field values via `matchOn`.
      operationId: bulkCreateRecords
      parameters:
        - name: databaseId
          in: path
          required: true
          schema:
            type: string
          description: The unique identifier of the database
        - name: tableId
          in: path
          required: true
          schema:
            type: string
          description: >-
            The unique identifier of the table. You can also use the table name
            instead of the ID.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BulkCreateRecordsRequest'
      responses:
        '201':
          description: >-
            Records created successfully. When `matchOn` is provided (upsert),
            the status is `200` instead of `201`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BulkCreateRecordsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    BulkCreateRecordsRequest:
      type: object
      properties:
        records:
          type: array
          minItems: 1
          maxItems: 100
          description: >-
            Records to create (1-100). Each item is an object with field names
            or field IDs as keys and their corresponding values. Any `id` key is
            ignored — the database generates the record ID.
          items:
            type: object
            additionalProperties: true
          example:
            - Name: John Doe
              Email: john@example.com
              Priority: high
            - Name: Jane Smith
              Email: jane@example.com
              Priority: low
        matchOn:
          type: array
          minItems: 1
          maxItems: 20
          items:
            type: string
          description: >-
            Optional list of field IDs to upsert on (1-20 keys). Must be field
            IDs, not field names (unlike the keys inside each record). When
            provided, each incoming record is matched against existing records
            on all listed fields: a match updates that record, otherwise a new
            record is created. Omit to always create new records.
          example:
            - k8mNp2xQ9rL
      required:
        - records
      example:
        records:
          - Name: John Doe
            Email: john@example.com
            Priority: high
          - Name: Jane Smith
            Email: jane@example.com
            Priority: low
    BulkCreateRecordsResponse:
      type: object
      properties:
        success:
          type: boolean
          description: Whether the bulk operation succeeded
        records:
          type: array
          items:
            $ref: '#/components/schemas/Record'
          description: The created (or upserted) records
      required:
        - success
        - records
      example:
        success: true
        records:
          - id: d4b3c2a3-c46b-46a1-a8ec-81b664bb41cb
            data:
              fwtJyga6dso: John Doe
              k8mNp2xQ9rL: john@example.com
              vB3zXc7Hf2w: high
            fields:
              Name: John Doe
              Email: john@example.com
              Priority: high
            createdAt: '2025-11-13T11:59:45.000Z'
            updatedAt: '2025-11-13T11:59:45.000Z'
    Record:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Unique UUID identifier for the record
        data:
          type: object
          additionalProperties: true
          description: Record data with field IDs as keys
          example:
            fwtJyga6dso: John Doe
            k8mNp2xQ9rL: john.doe@newcompany.com
            vB3zXc7Hf2w: low
        fields:
          type: object
          additionalProperties: true
          description: Record data with field names as keys
          example:
            Name: John Doe
            Email: john.doe@newcompany.com
            Priority: low
        createdAt:
          type: string
          format: date-time
          description: ISO timestamp of when the record was created
        updatedAt:
          type: string
          format: date-time
          description: ISO timestamp of when the record was last updated
      required:
        - id
        - data
        - fields
        - createdAt
        - updatedAt
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Error code
            message:
              type: string
              description: Human-readable error message
          required:
            - code
            - message
      required:
        - error
  responses:
    BadRequest:
      description: Invalid request data or validation failure
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            invalidRecordId:
              value:
                error:
                  code: INVALID_RECORD_ID
                  message: Record ID is not in valid UUID format
            validationError:
              value:
                error:
                  code: BAD_REQUEST
                  message: Invalid request data or validation failure
    Unauthorized:
      description: Invalid or missing API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: UNAUTHORIZED
              message: Invalid or missing API key
    NotFound:
      description: Requested resource does not exist
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: NOT_FOUND
              message: Requested resource does not exist
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Enter your Zite API key. Format: Bearer <api_key>'

````