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

# Start an import (parse + suggested mapping)

> Starts an import from a spreadsheet. Two intake shapes: a multipart request carrying the file (CSV/XLS/XLSX, ≤10MB — larger files go through `POST /business/imports/presign` first) or a JSON body naming a presigned upload's `importId`. Without a destination the call parses the file and answers 200 with the mapping-confirmation payload — `rowCount`, the detected `headers`, up to five `sampleRows`, and `suggestedMapping` (source header → standard field label such as `First Name`, `Email`, `Company`; null when nothing was suggested) — to confirm via `POST /business/imports/{importId}/commit`. With `listId` or `listName` (plus optional `mapping` and `enrich`) the import commits in the same call and answers 202 `{ import: { importId, listId, jobId } }`. Parsing spends no credits; enrichment chosen with `enrich` bills as `POST /business/lists/{listId}/enrich` does.

Errors:
- `400` `IMPORT_FILE_MISSING` — Neither a multipart file part nor an importId was sent.
- `404` `IMPORT_NOT_FOUND` — importId does not decode to an upload of the token owner, or the uploaded object is gone.
- `404` `LIST_NOT_FOUND` — One-call flow: the destination listId is unknown or not owned.
- `409` `LIST_NAME_AMBIGUOUS` — One-call flow: more than one list carries listName — reference the destination by id.
- `422` `IMPORT_FILE_UNSUPPORTED` — The multipart Content-Type is not CSV/XLS/XLSX, or the file could not be parsed.
- `422` `IMPORT_FILE_TOO_LARGE` — Multipart file over 10MB, or a presigned object over 50MB.
- `422` `IMPORT_FILE_EMPTY` — The file has no data rows.
- `422` `LIST_NAME_RESERVED` — One-call flow: listName is a system/dynamic list title and cannot be a destination.
- `422` `VALIDATION_FAILED` — Both listId and listName sent, an unknown body key, or an invalid enrich mode.
- `429` `RATE_LIMITED` — The lists rate bucket (120 requests/minute, 10,000/day per token owner) is exhausted.

Requires one of the following token scopes: lists.



## OpenAPI

````yaml /openapi.json post /business/imports
openapi: 3.1.0
info:
  title: Fuse Business API
  version: 1.0.0
  description: >-
    External API for lists, campaigns, prospect search and contacts.
    Authenticate with your API token as HTTP Basic. All paths are under /api/v1.
servers:
  - url: https://api.tryfuse.ai/api/v1
    description: Production
security:
  - basicAuth: []
tags:
  - name: Lists
  - name: Custom columns
  - name: Smart columns
  - name: Exports
  - name: Campaigns
  - name: Knowledge hubs
  - name: Analytics
  - name: Website intent
  - name: Account
  - name: Prospect search
  - name: Campaign steps
  - name: Scheduled sends
  - name: Campaign templates
  - name: Agents
  - name: Research
  - name: Company search
  - name: Saved searches
  - name: Folders
  - name: Contacts
paths:
  /business/imports:
    post:
      tags:
        - Lists
      summary: Start an import (parse + suggested mapping)
      description: >-
        Starts an import from a spreadsheet. Two intake shapes: a multipart
        request carrying the file (CSV/XLS/XLSX, ≤10MB — larger files go through
        `POST /business/imports/presign` first) or a JSON body naming a
        presigned upload's `importId`. Without a destination the call parses the
        file and answers 200 with the mapping-confirmation payload — `rowCount`,
        the detected `headers`, up to five `sampleRows`, and `suggestedMapping`
        (source header → standard field label such as `First Name`, `Email`,
        `Company`; null when nothing was suggested) — to confirm via `POST
        /business/imports/{importId}/commit`. With `listId` or `listName` (plus
        optional `mapping` and `enrich`) the import commits in the same call and
        answers 202 `{ import: { importId, listId, jobId } }`. Parsing spends no
        credits; enrichment chosen with `enrich` bills as `POST
        /business/lists/{listId}/enrich` does.


        Errors:

        - `400` `IMPORT_FILE_MISSING` — Neither a multipart file part nor an
        importId was sent.

        - `404` `IMPORT_NOT_FOUND` — importId does not decode to an upload of
        the token owner, or the uploaded object is gone.

        - `404` `LIST_NOT_FOUND` — One-call flow: the destination listId is
        unknown or not owned.

        - `409` `LIST_NAME_AMBIGUOUS` — One-call flow: more than one list
        carries listName — reference the destination by id.

        - `422` `IMPORT_FILE_UNSUPPORTED` — The multipart Content-Type is not
        CSV/XLS/XLSX, or the file could not be parsed.

        - `422` `IMPORT_FILE_TOO_LARGE` — Multipart file over 10MB, or a
        presigned object over 50MB.

        - `422` `IMPORT_FILE_EMPTY` — The file has no data rows.

        - `422` `LIST_NAME_RESERVED` — One-call flow: listName is a
        system/dynamic list title and cannot be a destination.

        - `422` `VALIDATION_FAILED` — Both listId and listName sent, an unknown
        body key, or an invalid enrich mode.

        - `429` `RATE_LIMITED` — The lists rate bucket (120 requests/minute,
        10,000/day per token owner) is exhausted.


        Requires one of the following token scopes: lists.
      operationId: createImport
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                importId:
                  type: string
                  minLength: 8
                  maxLength: 800
                  description: >-
                    The importId returned by POST /business/imports/presign,
                    once the file has been PUT to its uploadUrl; omit when the
                    file is sent as a multipart part of this request.
                listId:
                  type: string
                  description: >-
                    24-character hex id of an existing contact list to append
                    the rows to; mutually exclusive with listName, and an
                    unknown or non-owned id answers 404 LIST_NOT_FOUND.
                listName:
                  type: string
                  minLength: 1
                  maxLength: 255
                  description: >-
                    Name of the destination contact list (1-255 characters): an
                    existing list with this exact name (case-insensitive) is
                    reused, otherwise it is created; mutually exclusive with
                    listId. Two lists sharing the name answer 409
                    LIST_NAME_AMBIGUOUS and reserved system titles answer 422
                    LIST_NAME_RESERVED.
                mapping:
                  type: object
                  properties: {}
                  description: >-
                    Column mapping from source column header to target field,
                    e.g. {"fname": "First Name"} (up to 200 entries). Each key
                    is a column header spelled exactly as it appears in the file
                    (the `headers` of the import preview). Each value is one of
                    exactly these 21 target labels, spelled and cased exactly
                    like this: Full Name, First Name, Last Name, LinkedIn URL,
                    Company, Company Domain, Job Title, Job Level, Department,
                    Industry, Country, State, City, Email, Phone — plus six
                    aliases, each read only when the label it follows is missing
                    or empty: Company Name (after Company), Mobile Phone (after
                    Phone), Seniority then Level (after Job Level), and
                    linkedinUrl then linkedin (after LinkedIn URL). Map to the
                    primary label where you can. A label outside those 21 is
                    ACCEPTED and then silently drops that column — no error, no
                    custom column. Headers that already match a label
                    case-insensitively (email, first_name, title, domain) need
                    no entry, a header with no target carries null and is
                    ignored — so the suggestedMapping from POST
                    /business/imports can be sent back unchanged — and when two
                    headers name the same target only the last one is used.
                enrich:
                  type: string
                  enum:
                    - none
                    - email
                    - phone
                    - phone_and_email
                    - demographics
                  description: >-
                    Enrichment to run on the imported rows: none (default, rows
                    saved exactly as uploaded), email, phone or phone_and_email
                    (the enrichment waterfall, billed per contact processed) or
                    demographics (resolve rows to canonical contacts, 2 credits
                    per resolved contact).
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    The spreadsheet to import (.csv or .xlsx). Any part name is
                    accepted; the first non-empty file part is used.
                listId:
                  type: string
                  description: Destination list id. Omit to create a list from `listName`.
                listName:
                  type: string
                  description: Name for a new destination list when `listId` is omitted.
                enrich:
                  type: string
                  description: >-
                    Enrichment to run on commit: none, email, phone,
                    phone_and_email or demographics.
              required:
                - file
      responses:
        '200':
          description: Success
          headers:
            RateLimit-Limit:
              schema:
                type: integer
              description: Requests permitted in the current window.
            RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window.
            RateLimit-Reset:
              schema:
                type: integer
              description: Seconds until the current window resets.
          content:
            application/json:
              schema:
                type: object
                required:
                  - import
                properties:
                  import:
                    type: object
                    required:
                      - importId
                      - filename
                      - rowCount
                      - headers
                      - sampleRows
                      - suggestedMapping
                    properties:
                      importId:
                        type: string
                      filename:
                        type:
                          - string
                          - 'null'
                      rowCount:
                        type: integer
                      headers:
                        type: array
                        items:
                          type: string
                      sampleRows:
                        type: array
                        items:
                          type: object
                          additionalProperties: true
                      suggestedMapping:
                        type:
                          - object
                          - 'null'
                        additionalProperties:
                          type:
                            - string
                            - 'null'
              example:
                import:
                  importId: >-
                    dXBsb2Fkcy82ODU0MGY4YmI1NWU5OTYyODE3MGM3NTcvZmU2NWZmZmEtNDllYi00ODk1LWE2YTgtOTBiNWI0N2I4YzhiLmNzdg
                  filename: leads.csv
                  rowCount: 1240
                  headers:
                    - First Name
                    - Last Name
                    - Email
                    - Company
                    - Tel
                    - Deal stage
                  sampleRows:
                    - First Name: Sam
                      Last Name: Rivera
                      Email: sam@brightpay.com
                      Company: Brightpay
                      Tel: '+13015023231'
                      Deal stage: Discovery
                    - First Name: Ada
                      Last Name: Nwosu
                      Email: ada@brightpay.com
                      Company: Brightpay
                      Tel: '+13015023232'
                      Deal stage: Proposal
                  suggestedMapping:
                    First Name: First Name
                    Last Name: Last Name
                    Email: Email
                    Company: Company
                    Tel: Phone
                    Deal stage: null
        '400':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - basicAuth: []
components:
  schemas:
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
            param:
              type:
                - string
                - 'null'
            doc_url:
              type:
                - string
                - 'null'
            request_id:
              type:
                - string
                - 'null'
          required:
            - code
            - message
      required:
        - error
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
      description: >-
        Your API token (`af_…`) as the Basic-auth username, with an empty
        password.

````