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

# Create contacts

> Create one or more contacts associated with the organization in a single request. The batch is atomic — if any contact fails validation, none are created.



## OpenAPI

````yaml https://api.nova.net/.well-known/openapi post /v1/contacts
openapi: 3.0.4
info:
  title: Nova API
  version: 1.1.0
  contact:
    name: Nova Engineering
    email: support@nova.net
  description: >-
    The Nova API exposes programmatic access to fund operations including
    distributions, vehicles, entities, and contacts. Authentication is via
    OAuth2 client_credentials with per-scope authorization. All write operations
    require an `X-Organization-Id` header identifying the acting organization.
servers:
  - url: https://api.nova.net
  - url: https://api-sandbox.nova.net
security:
  - OAuth2: []
tags:
  - name: Authentication
    description: OAuth2 client_credentials token exchange
  - name: Distributions
    description: Manage distributions
  - name: Entities
    description: Manage entities
  - name: Payment Instructions
    description: Manage payment instructions for entities
  - name: Contacts
    description: Manage contacts
paths:
  /v1/contacts:
    post:
      tags:
        - Contacts
      summary: Create contacts
      description: >-
        Create one or more contacts associated with the organization in a single
        request. The batch is atomic — if any contact fails validation, none are
        created.
      operationId: createContacts
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/ContactCreateInput'
              minItems: 1
      responses:
        '201':
          description: Contacts created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactList'
        '400':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid access token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Missing required OAuth scope or organization access
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: Contact with these external references already exists
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              schema:
                type: integer
                description: >-
                  Seconds until the rate-limit window resets. Present on 429
                  responses.
              required: true
              description: >-
                Seconds until the rate-limit window resets. Present on 429
                responses.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '502':
          description: Upstream service unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - OAuth2:
            - contacts:write
components:
  parameters:
    OrganizationId:
      schema:
        $ref: '#/components/schemas/OrganizationId'
      required: false
      description: >-
        ID of the organization the request acts on. Optional when the access
        token is bound to a specific `organization`, or when the integration has
        access to exactly one organization.
      name: X-Organization-Id
      in: header
    IdempotencyKey:
      schema:
        $ref: '#/components/schemas/IdempotencyKey'
      required: false
      description: >-
        Supply a unique key to make a mutating request safely retryable. Any
        retry that sends the same key returns that stored response without
        performing the operation again.


        - **Retention:** keys are kept for **24 hours**. Within that window a
        retry replays the original response.

        - **Same key, different request:** reusing a key with a different
        request body returns a 409 with code `idempotency_mismatch`. Use a fresh
        key for each distinct operation.

        - **Still processing:** if the first request has not finished, a retry
        returns `409` with code `conflict` (wait briefly and retry).

        - **Server or transient errors** (`5xx`, `408`, `429`) are not stored,
        so you may retry with the same key and the operation will be attempted
        again.


        Only applies to POST, PUT, PATCH, and DELETE; ignored on reads.
      name: Idempotency-Key
      in: header
  schemas:
    ContactCreateInput:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 255
          description: Full legal name
          example: Jane Doe
        email:
          type: string
          format: email
          description: Email address
          example: jane.doe@example.com
        external_reference:
          type: string
          nullable: true
          description: Your own identifier for this contact
          example: contact-123
      required:
        - name
        - email
      additionalProperties: false
    ContactList:
      type: object
      properties:
        object:
          type: string
          enum:
            - list
          description: Object type identifier.
          example: list
        data:
          type: array
          items:
            $ref: '#/components/schemas/Contact'
          description: The page of items.
        has_more:
          type: boolean
          description: Whether there are more items available after this page.
        url:
          type: string
          description: The URL for this list endpoint.
          example: /v1/contacts
      required:
        - object
        - data
        - has_more
        - url
      additionalProperties: false
    Error:
      type: object
      properties:
        object:
          type: string
          enum:
            - error
          description: Object type identifier.
          example: error
        type:
          $ref: '#/components/schemas/ApiErrorType'
        code:
          $ref: '#/components/schemas/ApiErrorCode'
        message:
          type: string
          description: Human-readable error message intended for developers, not end-users.
        status:
          type: integer
          description: HTTP status code.
          example: 404
        doc_url:
          type: string
          format: uri
          description: Link to documentation about this error.
        request_id:
          type: string
          description: Request identifier for support inquiries.
        invalid-params:
          type: array
          items:
            type: object
            properties:
              code:
                $ref: '#/components/schemas/ApiErrorCode'
              name:
                type: string
                description: The request parameter that caused the error.
              reason:
                type: string
                description: Human-readable explanation of why the parameter is invalid.
              value:
                oneOf:
                  - type: string
                  - type: number
                  - type: boolean
                  - nullable: true
                description: >-
                  The value of the request parameter that caused the error, if
                  applicable.
              conflicts_with:
                type: string
                description: >-
                  For conflict errors, the id of the existing resource this
                  parameter conflicts with.
            required:
              - code
              - name
              - reason
          description: The request parameters that caused the error, if applicable.
      required:
        - object
        - type
        - code
        - message
        - status
      example:
        object: error
        type: invalid_request_error
        code: parameter_invalid
        message: The 'limit' parameter must be between 1 and 100.
        status: 400
        invalid-params:
          - code: parameter_invalid
            name: body.[0].limit
            value: 200
            reason: out of range
    OrganizationId:
      type: string
      pattern: ^org_[A-Za-z0-9]+$
      description: >-
        ID of the organization the request acts on. Optional when the access
        token is bound to a specific `organization`, or when the integration has
        access to exactly one organization.
      example: org_Xk7d2pQR9m3nBwYz
    IdempotencyKey:
      type: string
      description: >-
        Supply a unique key to make a mutating request safely retryable. Any
        retry that sends the same key returns that stored response without
        performing the operation again.


        - **Retention:** keys are kept for **24 hours**. Within that window a
        retry replays the original response.

        - **Same key, different request:** reusing a key with a different
        request body returns a 409 with code `idempotency_mismatch`. Use a fresh
        key for each distinct operation.

        - **Still processing:** if the first request has not finished, a retry
        returns `409` with code `conflict` (wait briefly and retry).

        - **Server or transient errors** (`5xx`, `408`, `429`) are not stored,
        so you may retry with the same key and the operation will be attempted
        again.


        Only applies to POST, PUT, PATCH, and DELETE; ignored on reads.
    Contact:
      type: object
      properties:
        object:
          type: string
          enum:
            - contact
          description: Object type identifier.
          example: contact
        livemode:
          type: boolean
          description: >-
            Whether this object exists in live mode (`true`) or test mode
            (`false`).
        id:
          type: string
          pattern: ^cnt_[A-Za-z0-9]+$
          description: ID of the contact
          example: cnt_tSfCZrNE8O3c4QATSkzuCljMZ2DI
        name:
          type: string
          minLength: 1
          maxLength: 255
          description: Full legal name
          example: Jane Doe
        email:
          type: string
          format: email
          description: Email address
          example: jane.doe@example.com
        external_reference:
          type: string
          nullable: true
          description: Your own identifier for this contact
          example: contact-123
      required:
        - object
        - livemode
        - id
        - name
        - email
        - external_reference
      additionalProperties: false
    ApiErrorType:
      type: string
      enum:
        - authentication_error
        - permission_error
        - invalid_request_error
        - not_found_error
        - request_timeout_error
        - conflict_error
        - rate_limit_error
        - api_error
      description: Machine-readable high-level error category.
    ApiErrorCode:
      oneOf:
        - type: string
          enum:
            - unauthorized
            - forbidden
            - resource_not_found
            - request_timeout
            - conflict
            - idempotency_mismatch
            - rate_limit_exceeded
            - internal_error
            - not_implemented
            - bad_gateway
        - $ref: '#/components/schemas/ValidationCode'
      description: Machine-readable high-level error code.
    ValidationCode:
      type: string
      enum:
        - parameter_missing
        - parameter_unknown
        - parameter_invalid
        - parameter_invalid_string
        - parameter_invalid_string_empty
        - parameter_invalid_integer
        - validation_error
      description: Machine-readable validation error code.
  securitySchemes:
    OAuth2:
      type: oauth2
      description: >-
        OAuth2 client_credentials grant for server-to-server access. Onboard via
        your Nova admin to receive a `client_id` and `client_secret`, then `POST
        /oauth/token` to exchange them for a short-lived access token. Send the
        token as `Authorization: Bearer <access_token>` on every authenticated
        request. Tokens expire after 3600 seconds — refresh by re-exchanging
        credentials.
      flows:
        clientCredentials:
          tokenUrl: /oauth/token
          scopes:
            organizations:read: Read organization data
            organizations:write: Create or update organization data
            organizations:*: Full access to organization data
            distributions:read: Read distribution data
            distributions:write: Create or update distributions
            distributions:*: Full access to distributions
            vehicles:read: Read vehicle data
            vehicles:write: Create or update vehicles
            vehicles:*: Full access to vehicles
            entities:read: Read entity data
            entities:write: Create or update entities
            entities:*: Full access to entities
            contacts:read: Read contact data
            contacts:write: Create or update contacts
            contacts:*: Full access to contacts

````