---
title: "Transfer between provider folder and vault"
method: POST
path: "/connectors/v1/transfer"
tags: ["Connectors"]
---

# Transfer between provider folder and vault

`POST /connectors/v1/transfer`

## Request

- Base URL: `https://api.case.dev`
- URL: `https://api.case.dev/connectors/v1/transfer`
- Auth: HTTP bearer

One-shot import (provider folder → vault), export (vault → provider folder), or both. Direction both creates paired import/export links and defaults export to a CaseMark Output subfolder. Upserts links by (connection_id, direction, remote, vault_id): first call backfills, later calls move only new/changed files via the ledger. Poll GET /links/{id} → active_run for progress.

## Headers

- `x-case-connector-subject` string

## Request body

- object
  - `direction` 'import' | 'export' | 'both', required
  - `connection_id` string, required
  - `remote` object, required
    - `site_id` string
    - `container_id` string
    - `folder_id` string, required
    - `path` string
    - `resource_type` string
  - `export_destination` object: Optional destination for direction both. Defaults to CaseMark Output under remote.
    - `site_id` string
    - `container_id` string
    - `folder_id` string, required
    - `path` string
  - `vault_id` string, required
  - `matter_id` string, nullable
  - `run_mode` 'auto' | 'full_reconcile'
  - `policy` object
    - `deletes` 'mirror' | 'preserve'
    - `collisions` 'version' | 'overwrite' | 'skip'
    - `filters` object
      - `max_size_bytes` integer
      - `exclude_mime` string[]
      - `exclude_folder_ids` string[]: Skip these folders and all descendants during document imports.
      - `exclude_file_ids` string[]: Skip these stable document ids before download, including future versions.

## Response `202`

Link created/re-triggered; run in progress

- object
  - `links` object[]
  - `runs` object[]: Start result for each link when direction is both.
    - `link_id` string, required
    - `started` boolean, required
    - `reason` 'stale_run_recovery' | 'already_running' | 'ingestion_backlog'
    - `backlog` integer
  - `run` object: Whether a provider scan started or was deferred.
    - `started` boolean, required
    - `reason` 'stale_run_recovery' | 'already_running' | 'ingestion_backlog'
    - `backlog` integer

## Other responses

- `400`: Invalid payload
- `401`: Invalid API key
- `403`: Insufficient permissions or provider does not support export
- `404`: Connection or vault not found
- `409`: Connection is not ready, import selection conflicts, or Smokeball is at capacity. data.error.code=connection_capacity means retry after an active import finishes; connection_not_ready means reconnect.

## Changes

- **2026-10-16** `a21d188f4b21`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/casemark/apis/case-dev-api/changes/connectors/v1/transfer/post.md)

---

[API](https://skmtc.dev/casemark/apis/case-dev-api.md) - [All operations](https://skmtc.dev/casemark/apis/case-dev-api/llms.txt) - [OpenAPI document](https://skmtc.dev/casemark/apis/case-dev-api/revisions/9a3245c00044?raw)
