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

# Submit Job via Bulk Document Upload

> Submit multiple documents using signed S3 URLs for processing as a single job. The company must be active to submit a job. The size limit of each individual document is **25MB**, and the page limit for PDF files is **800**. Returns a job ID that can be used to track the status of all submitted documents. Use the job status endpoint to monitor processing progress and retrieve document IDs once completed. You can also pin every document in this batch to a specific site or utility account by passing the corresponding `siteId` and/or `accountId`. When provided, every parsed bill in the job is allocated to that site/account instead of relying on best-effort auto-matching — recommended for compliance-sensitive uploads to prevent bills from landing on the wrong site. Free-text `notes` are shared with document processing as background context.



## OpenAPI

````yaml /api-reference/openapi-v2-1.json post /job/company/{company_id}/bulk
openapi: 3.1.0
info:
  title: Nectar API Documentation
  version: 1.0.0 (v1)
  description: >-
    Complete API documentation for v2.1 endpoints to managing companies, sites,
    data, and documents
servers:
  - url: https://external.nectarclimate.com/v2.1
    description: Nectar API Server
security: []
paths:
  /job/company/{company_id}/bulk:
    post:
      tags:
        - Jobs
      summary: Submit Job via Bulk Document Upload
      description: >-
        Submit multiple documents using signed S3 URLs for processing as a
        single job. The company must be active to submit a job. The size limit
        of each individual document is **25MB**, and the page limit for PDF
        files is **800**. Returns a job ID that can be used to track the status
        of all submitted documents. Use the job status endpoint to monitor
        processing progress and retrieve document IDs once completed. You can
        also pin every document in this batch to a specific site or utility
        account by passing the corresponding `siteId` and/or `accountId`. When
        provided, every parsed bill in the job is allocated to that site/account
        instead of relying on best-effort auto-matching — recommended for
        compliance-sensitive uploads to prevent bills from landing on the wrong
        site. Free-text `notes` are shared with document processing as
        background context.
      operationId: job_company_bulk_create
      parameters:
        - in: path
          name: company_id
          schema:
            type: string
            format: uuid
          description: ID of the company for which to submit jobs.
          required: true
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/JobBulkCreateRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/JobBulkCreateRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/JobBulkCreateRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Job'
          description: ''
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: ''
        '403':
          description: 'Forbidden: Access to the company is denied.'
        '404':
          description: Company not found.
      security:
        - ExternalAuthentication: []
components:
  schemas:
    JobBulkCreateRequest:
      type: object
      description: Serializer for form fields during job bulk submission.
      properties:
        documents:
          type: array
          items:
            type: string
            minLength: 1
          description: List of presigned URLs for files to be processed by the job.
        siteId:
          type:
            - string
            - 'null'
          format: uuid
          description: >-
            UUID of the site to pin all uploaded documents to. When provided,
            every parsed bill in this job is allocated to this site instead of
            relying on best-effort auto-matching.
        accountId:
          type:
            - string
            - 'null'
          format: uuid
          description: >-
            UUID of the utility account to pin all uploaded documents to. When
            provided, every parsed bill in this job is associated with this
            account (and its parent utility connection) instead of relying on
            best-effort auto-matching.
        notes:
          type: string
          description: >-
            Optional free-text notes about the submitted documents (for example,
            what they contain or which site they belong to). Shared with
            document processing as background context.
      required:
        - documents
    Job:
      type: object
      description: Serializer for the response of job status endpoint.
      properties:
        id:
          type: string
          description: The ID of the job.
          maxLength: 255
        status:
          allOf:
            - $ref: '#/components/schemas/CostReprocessJobStatusEnum'
          description: >-
            The current status of the job, one of: PENDING, COMPLETED,
            TERMINATED, FAILED.If the job status is FAILED, please contact our
            support team.


            * `PENDING` - Pending

            * `COMPLETED` - Completed

            * `FAILED` - Failed
        parsedDocumentIds:
          type: array
          items:
            type: string
          description: >-
            List of document IDs that were processed successfully by the job.
            This is only populated if the job is completed.
        duplicates:
          type: integer
          description: >-
            Number of duplicate files detected by the job. This is only
            populated if the job is completed.
        duplicateDocumentIds:
          type: array
          items:
            type: string
          description: >-
            List of document IDs that were identified as duplicates by the job.
            This is only populated if the job is completed.
        nonUtilityDocumentIds:
          type: array
          items:
            type: string
          description: >-
            List of document IDs that were identified as non-utility documents
            by the job. This is only populated if the job is completed.
        terminationReason:
          type: string
          description: >-
            The reason the job was terminated. This is only populated if the job
            is terminated.
      required:
        - id
        - status
    ErrorResponse:
      type: object
      description: Serializer for error responses.
      properties:
        detail:
          type: string
        error:
          type: string
    CostReprocessJobStatusEnum:
      enum:
        - PENDING
        - COMPLETED
        - FAILED
      type: string
      description: |-
        * `PENDING` - Pending
        * `COMPLETED` - Completed
        * `FAILED` - Failed
  securitySchemes:
    ExternalAuthentication:
      type: apiKey
      in: header
      name: X-API-KEY

````