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

# Import Historical Form Packet

> Attach historical issued PDF documents directly to an existing quote or
policy, without a form template. The packet appears in the record's Forms
tab with a Historical label and the original issuance date. Importing does
not complete or bind a quote, change a policy, or populate its working forms.

Supply a stable caller-generated UUID as `packetId` and retain it across
import runs. An identical retry returns the same id indefinitely; reusing
the id for different metadata, documents, ordering, or another entity returns
409. This endpoint uses `packetId`, not the Idempotency-Key header.

`issuedAt` is the original issuance time in Unix milliseconds. It cannot be
in the future. The time of import is recorded separately. Historical PDFs
retain legacy provenance: unavailable template and generation history is
not invented. Documents remain in the supplied order. Each individual PDF
is stored unchanged; a single-document packet also downloads byte for byte.
For multiple documents the packet download concatenates their pages.

Accepts 1–50 readable, unencrypted PDFs, at most 20 MB combined before base64
encoding. For claim/incident working forms use
[Upload Event Form](./upload-event-form) instead.

**Required permission:** `form.create`, plus `quote.view` or `policy.view`
for the target record.




## OpenAPI

````yaml /openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/forms/packets/import
openapi: 3.0.3
info:
  title: AI Insurance External API
  description: External API for AI Insurance platform
  version: 1.0.0
  contact:
    email: support@aiinsurance.io
servers:
  - url: https://go.aiinsurance.io
    description: Production
security:
  - ApiKeyAuth: []
paths:
  /api/v1/companies/{companyId}/forms/packets/import:
    post:
      tags:
        - Forms
      summary: Import Historical Form Packet
      description: >
        Attach historical issued PDF documents directly to an existing quote or

        policy, without a form template. The packet appears in the record's
        Forms

        tab with a Historical label and the original issuance date. Importing
        does

        not complete or bind a quote, change a policy, or populate its working
        forms.


        Supply a stable caller-generated UUID as `packetId` and retain it across

        import runs. An identical retry returns the same id indefinitely;
        reusing

        the id for different metadata, documents, ordering, or another entity
        returns

        409. This endpoint uses `packetId`, not the Idempotency-Key header.


        `issuedAt` is the original issuance time in Unix milliseconds. It cannot
        be

        in the future. The time of import is recorded separately. Historical
        PDFs

        retain legacy provenance: unavailable template and generation history is

        not invented. Documents remain in the supplied order. Each individual
        PDF

        is stored unchanged; a single-document packet also downloads byte for
        byte.

        For multiple documents the packet download concatenates their pages.


        Accepts 1–50 readable, unencrypted PDFs, at most 20 MB combined before
        base64

        encoding. For claim/incident working forms use

        [Upload Event Form](./upload-event-form) instead.


        **Required permission:** `form.create`, plus `quote.view` or
        `policy.view`

        for the target record.
      operationId: importHistoricalFormPacket
      parameters:
        - $ref: '#/components/parameters/companyId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - packetId
                - entityType
                - entityId
                - name
                - issuedAt
                - documents
              properties:
                packetId:
                  type: string
                  format: uuid
                  description: >-
                    Stable caller-generated packet id, retained across retries
                    and import runs.
                entityType:
                  type: string
                  enum:
                    - quote
                    - policy
                entityId:
                  type: string
                  format: uuid
                  description: An existing live quote or policy in this company.
                name:
                  type: string
                  minLength: 1
                  maxLength: 255
                  description: Name of the historical packet.
                issuedAt:
                  type: integer
                  format: int64
                  minimum: -62135596800000
                  maximum: 8640000000000000
                  description: >-
                    Original issuance time in Unix milliseconds, no later than
                    the current time.
                documents:
                  type: array
                  minItems: 1
                  maxItems: 50
                  description: >-
                    PDFs in page order, at most 20 MB combined before base64
                    encoding.
                  items:
                    type: object
                    required:
                      - name
                      - fileBase64
                    properties:
                      name:
                        type: string
                        minLength: 1
                        maxLength: 255
                        description: Display name of this historical document.
                      fileBase64:
                        type: string
                        format: byte
                        minLength: 1
                        maxLength: 26666668
                        description: Base64-encoded PDF bytes, without a data URL prefix.
            examples:
              historicalPolicy:
                summary: A previously issued policy packet
                value:
                  packetId: 550e8400-e29b-41d4-a716-446655440091
                  entityType: policy
                  entityId: 550e8400-e29b-41d4-a716-446655440092
                  name: Original policy documents
                  issuedAt: 1517616000000
                  documents:
                    - name: Policy packet
                      fileBase64: JVBERi0xLjcKLi4u
      responses:
        '201':
          description: Historical packet stored, or an identical prior import returned.
          content:
            application/json:
              schema:
                type: object
                required:
                  - id
                properties:
                  id:
                    type: string
                    format: uuid
              examples:
                imported:
                  summary: Packet available for listing and download
                  value:
                    id: 550e8400-e29b-41d4-a716-446655440091
        '400':
          description: >-
            Invalid request shape, unsupported entity type, or encoded size
            limit exceeded.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Target record not found, deleted, or outside this company.
        '409':
          description: >-
            Packet id already belongs to a different import or an existing
            packet.
        '422':
          description: >-
            Invalid, encrypted, empty, or oversized PDF, or future issuance
            date.
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  parameters:
    companyId:
      name: companyId
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: Company identifier
  responses:
    Unauthorized:
      description: Unauthorized - Invalid or missing API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            missingApiKey:
              summary: Missing API key
              value:
                error:
                  code: AuthenticationError
                  message: API key authentication required
                  userMessages:
                    - API key authentication required
            invalidApiKey:
              summary: >-
                Invalid API key (e.g. unknown key, or a Bearer token used
                instead of an API key)
              value:
                error:
                  code: AuthenticationError
                  message: Invalid API key
                  userMessages:
                    - Invalid API key
    Forbidden:
      description: Forbidden - Insufficient permissions
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            insufficientPermissions:
              summary: Insufficient permissions
              value:
                error:
                  code: AuthorizationError
                  message: User is not authorized to perform the requested action
                  userMessages:
                    - User is not authorized to perform the requested action
            companyMismatch:
              summary: A valid API key naming another company in the URL
              value:
                error:
                  code: AuthorizationError
                  message: API key is not scoped to the requested company
                  userMessages:
                    - API key is not scoped to the requested company
    InternalServerError:
      description: Internal Server Error - Unexpected error occurred
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            internalError:
              summary: Unexpected server error
              value:
                error:
                  code: UncaughtActionError
                  message: Uncaught error occurred in <actionName>
                  userMessages:
                    - An unexpected error occurred. Please try again later.
  schemas:
    ErrorResponse:
      type: object
      description: Standard error response for all external API endpoints
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Machine-readable error code
              example: VALIDATION_ERROR
            message:
              type: string
              description: Human-readable error message
              example: 'submissionId: Required field is missing'
            userMessages:
              type: array
              description: >-
                Clean, verbatim-displayable messages — one entry per failure,
                free of error-code tags, field paths, and internal noise.
                Suitable for showing to end users as-is.
              items:
                type: string
              example:
                - Exposures of type 'company' require an address
            details:
              type: array
              description: Additional details for validation errors (field-level errors)
              items:
                type: object
                properties:
                  field:
                    type: string
                    description: The field that caused the error
                    example: submissionId
                  code:
                    type: string
                    description: Stable problem code for this individual validation failure
                    example: BLANK_LIST_ELEMENT
                  reason:
                    type: string
                    description: Stable reason the value violates its canonical contract
                    example: blank-list-element
                  expected:
                    type: string
                    description: The expected canonical value contract
                    example: nonblank trimmed string
                  message:
                    type: string
                    description: Description of the field error
                    example: Required field is missing
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        API key authentication. Send your raw API key as the `Authorization`
        header value with NO scheme prefix — `Authorization: YOUR-API-KEY`. Do
        NOT prefix it with `Bearer ` or `ApiKey `, and do not use an `X-API-Key`
        header; those are not accepted.

````

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