---
title: "Fetch private data onto the node via a stored connection"
method: POST
path: "/preview/nodes/{name}/imports"
tags: ["nodes"]
---

# Fetch private data onto the node via a stored connection

`POST /preview/nodes/{name}/imports`

## Request

- Base URL: `https://autoresearch.sfcompute.com`
- URL: `https://autoresearch.sfcompute.com/preview/nodes/{name}/imports`
- Auth: HTTP bearer

Fetch private data onto a RUNNING node using a stored org connection (list_connections): the platform exercises the access on the host - never in this chat, never inside the node - and the bytes appear at dest_path, owned by dev. Returns {import_id} immediately; poll get_import(node, import_id). `source` must sit inside the connection's scope: an s3:// url (object, or a prefix ending in "/" to import the subtree; on storage/<bucket> connections a non-slash source that names no exact object imports every key it prefixes, so a flat prefix splits into chunks: .../items/a, .../items/b) for s3 kinds - and on a storage/<bucket> connection, which already names its bucket, that url may also be written bucket-relative, "train/" meaning the same as "s3://<bucket>/train/" (the spelling autor storage and list_storage_objects speak); an s3-keys connection reaches a bucket we do not own, so there the full url is required. A repo id like "acme/corpus-v3" (optionally "repo@revision"; "datasets/owner/name" for HF dataset repos) for huggingface, "model:<id>" (its newest published version) or "version:<id>" (one specific version; the numeric ids from civitai.com URLs; where a version ships same-named file variants the primary one is taken, and with no primary they land disambiguated by file id) for civitai, an https url for https. A stopped node is a refusal and never a wake. A run_command wakes the node, and the wake bills. Import time is node time: you're billed while it streams, same as running curl yourself, and the transfer holds the node out of grace so the disk stays mounted. Sizes are bounded by the node's volume (the refusal names the numbers), and one import enumerates at most max_import_files objects (list_limits shows yours; the chunk form above is how a bigger prefix gets under it). Every call is recorded to your org's audit log (connection, node, source - never any credential).

## Path parameters

- `name` string, required: Node name (from `list_nodes`).

## Query parameters

- `workspace` string

## Request body

- object
  - `connection` string, required: Connection name (from `list_connections`).
  - `dest_path` string, required: Directory on the node the data lands under, absolute or ~-relative (e.g. "~/data/corpus-v3"). Created if absent; existing files are overwritten by same-named incoming files.
  - `mission` string, nullable: Attribute this work to a mission (from open_mission). Omit and it joins the node's own mission, which is usually what you want.
  - `source` string, required: What to fetch, inside the connection's scope (e.g. "s3://acme-ml/corpus-v3/", "acme/corpus-v3@main", "version:456789", "https://data.corp.example/exports/v3.tar").

## Response `200`

The capability's JSON result.

- Result: The capability's result: the same object the MCP tool returns as structuredContent. Resources carry an `object` type discriminator and an immutable id; money is integer micro-dollars in `*_usd_micros` fields.
  - `object` string: The resource type, when the result is one resource.

## Other responses

- `400`: Malformed request: bad JSON, a parameter that does not parse, or a value outside its range. Code `invalid`.
- `401`: No bearer token, or one this API cannot verify. Code `unauthenticated`.
- `403`: Authenticated, but the token's scopes or the account's role do not reach this operation. The message names the scope word to request. Code `forbidden`.
- `404`: No such route. Code `not_found`; the body names the OpenAPI document.
- `422`: A well-formed request the platform declined: no such node, a cap reached, a state that forbids the move. The message says which, and what to do instead. Code `refused`.
- `429`: Over this door's per-customer budget. Wait `Retry-After` seconds. Code `rate_limited`.
- `500`: Our fault. Retry; if it persists, quote the request-id. Code `internal`.

---

[API](https://skmtc.dev/givemeanode/apis/autoresearch-customer-api.md) · [All operations](https://skmtc.dev/givemeanode/apis/autoresearch-customer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/givemeanode/apis/autoresearch-customer-api/revisions/f88dcb70ac6c?raw)
