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

# Preview a contact import (dry run)

> Dry-run a contact import without writing any data. Each row's phone and email are normalized and classified, and the response returns validation counters plus duplicate detection against existing contacts and within the upload itself, so the import wizard can warn before the operator commits. Capped at 10,000 rows per preview.



## OpenAPI

````yaml /openapi.yaml post /api/v1/contacts/imports/preview
openapi: 3.1.0
info:
  title: Devotel CPaaS API
  description: Orbit by Devotel — Communications Platform as a Service API
  version: 1.0.0
  contact:
    name: Devotel
    url: https://devotel.io
    email: support@devotel.io
  license:
    name: Proprietary
servers:
  - url: https://api.orbit.devotel.io
    description: Production
security:
  - Bearer: []
  - ApiKey: []
tags:
  - name: Messages
    description: >-
      Send and manage messages across all channels (SMS, WhatsApp, RCS, Email,
      Viber, etc.)
  - name: Fax
    description: >-
      List and track fax (MMS/T.38) transmissions on Telnyx-backed fax numbers
      (sending flows through the Messaging API)
  - name: Agents
    description: AI agent creation, configuration, and execution
  - name: Voice
    description: Voice calls, IVR, conferencing, and SIP trunking
  - name: OnCall
    description: On-call rotations and escalation policy planning for incident alerting
  - name: Webhooks
    description: Webhook endpoint management and delivery logs
  - name: Numbers
    description: Phone number search, provisioning, and configuration
  - name: Brand Identity
    description: >-
      Unified cross-channel brand trust posture (10DLC, toll-free, WhatsApp,
      RCS, branded calling, number KYC)
  - name: Contacts
    description: Contact management, segmentation, and lifecycle tracking
  - name: Campaigns
    description: Marketing campaign orchestration and analytics
  - name: Flows
    description: Automation flow builder and execution engine
  - name: Templates
    description: Message template management and approval workflows
  - name: Settings
    description: Organization, channel, and user preference settings
  - name: Verify
    description: OTP generation and verification across channels
  - name: Push
    description: Push notification delivery via FCM and APNs
  - name: Integrations
    description: Third-party service connections and OAuth management
  - name: CDP
    description: >-
      Customer Data Platform — activation surface (CRM object sync, streaming
      destinations, ad-audience activation)
  - name: Files
    description: >-
      Server-to-server media upload, listing, retrieval, and deletion
      (signed-URL backed)
  - name: Commerce
    description: >-
      Omnichannel conversational-commerce — persistent cart + checkout state
      machine, channel-agnostic hosted pay-by-link, native WhatsApp checkout,
      and AP2-style agent payment mandates.
  - name: Sync
    description: >-
      Real-time shared-state primitive (Twilio Sync parity) — Documents, Maps,
      Lists, and ephemeral Streams, with change events relayed over the
      /api/v1/ws/sync WebSocket gateway
  - name: Risk
    description: >-
      Unified cross-channel Trust & Fraud risk scoring — fuses SMS-pumping,
      URL-reputation, Verify Fraud Guard, and Voice Biometrics signals into one
      composite verdict queryable before a send or a call.
  - name: Orby
    description: >-
      In-dashboard Orby operator assistant: streamed assistant turns,
      conversation threads, product knowledge-base search, and the tool-action
      approval gate. Available to signed-in operators only (dashboard session
      auth — API-key requests are rejected).
paths:
  /api/v1/contacts/imports/preview:
    post:
      tags:
        - Contacts
      summary: Preview a contact import (dry run)
      description: >-
        Dry-run a contact import without writing any data. Each row's phone and
        email are normalized and classified, and the response returns validation
        counters plus duplicate detection against existing contacts and within
        the upload itself, so the import wizard can warn before the operator
        commits. Capped at 10,000 rows per preview.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                rows:
                  type: array
                  items:
                    type: object
                    additionalProperties:
                      type: string
                  minItems: 1
                  maxItems: 10000
                  description: >-
                    The rows to preview, each a map of already-mapped field keys
                    (such as `phone`, `email`, `first_name`) to string values.
              required:
                - rows
            example:
              rows:
                - phone: '+14155552671'
                  email: ada@example.com
                  first_name: Ada
                  last_name: Lovelace
                - phone: '+14155552671'
                  email: grace@example.com
                  first_name: Grace
      responses:
        '200':
          description: >-
            Preview summary with per-row verdicts plus validation and duplicate
            counters. No data is written.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      total_rows:
                        type: integer
                      preview_rows:
                        type: array
                        items:
                          type: object
                      validation:
                        type: object
                        properties:
                          rows_with_phone:
                            type: integer
                          rows_with_email:
                            type: integer
                          rows_invalid:
                            type: integer
                          sample_errors:
                            type: array
                            items:
                              type: object
                      duplicates:
                        type: object
                        properties:
                          existing_db_match_count:
                            type: integer
                          in_csv_dup_count:
                            type: integer
                          sample_matches:
                            type: array
                            items:
                              type: object
                  meta:
                    type: object
                    properties:
                      request_id:
                        type: string
                      timestamp:
                        type: string
                        format: date-time
              example:
                data:
                  total_rows: 2
                  preview_rows:
                    - row_index: 1
                      phone: '+14155552671'
                      email: ada@example.com
                      normalized_phone: '+14155552671'
                      first_name: Ada
                      last_name: Lovelace
                      will_duplicate: false
                      dup_match_field: null
                      validation_errors: []
                    - row_index: 2
                      phone: '+14155552671'
                      email: grace@example.com
                      normalized_phone: '+14155552671'
                      first_name: Grace
                      last_name: null
                      will_duplicate: true
                      dup_match_field: phone
                      validation_errors:
                        - Duplicate phone within this file (first seen at row 1)
                  validation:
                    rows_with_phone: 2
                    rows_with_email: 2
                    rows_invalid: 0
                    sample_errors: []
                  duplicates:
                    existing_db_match_count: 0
                    in_csv_dup_count: 1
                    sample_matches: []
                meta:
                  request_id: req_01HZX9ABCDEF
                  timestamp: '2026-02-02T12:00:00.000Z'
components:
  securitySchemes:
    Bearer:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Dashboard JWT token from Clerk
    ApiKey:
      type: apiKey
      name: X-API-Key
      in: header
      description: Server-to-server API key (dv_live_sk_*)

````