FTP¶
Read and write files on a plain FTP server. Use CSV, JSON, or spreadsheet mode for tabular records, or raw-file mode to preserve bytes.
Use the shared connection workflow to create this data source in your workspace. You can read this guide without an account or provider resources. Running examples requires your own non-production system and synthetic data.
Connection settings¶
| Field | Required | Type | Default | Notes |
|---|---|---|---|---|
host |
yes | string | — | Hostname or IP of the FTP server |
port |
yes | integer | 21 | 1–65535 |
base_path |
no | string | — | Base directory for file listing and relative paths |
connect_timeout |
no | integer | 5 | Connection timeout in seconds (1–300) |
allow_private_hosts |
no | boolean | false |
Requires private host access to be enabled for the deployment; hosted/default deployments reject true |
Authentication and permissions¶
| Field | Required | Notes |
|---|---|---|
username |
yes | FTP user |
password |
yes | FTP password |
Credentials belong in the connection, never in an operation statement. They are
encrypted at rest and are not returned in API responses. Hosted/default
deployments block loopback and private network endpoints; your laptop’s
localhost is not the hosted worker’s network.
Use a read-restricted FTP account for sources and a separately scoped writer for destinations. Only plain FTP is supported; credentials and data do not gain transport encryption from this connector. FTPS and SFTP are unsupported.
Test and discover¶
Test server access and refresh metadata to list and sample files under the base path. CSV headers, JSON fields, and workbook samples provide field names. Unreadable files may be omitted.
Read example¶
Place a synthetic customers.csv file in the configured base path or prefix:
id,email
1,alex@example.com
This read returns one row with id and email. Adapt the path and, for Git,
the branch to your connection.
{
"type": "ftp",
"operation": "read",
"path": "customers.csv",
"format": "csv",
"has_header": true
}
Write example¶
This direct write example stores one synthetic record as JSON. With
overwrite: false, an existing target causes the write to fail. For a pipeline
sink, upstream input replaces the inline content; do not rely on inline sample
content being written when the pipeline supplies rows.
{
"type": "ftp",
"operation": "write",
"path": "exports/customers.json",
"format": "json",
"content": [
{
"id": 1,
"email": "alex@example.com"
}
],
"overwrite": false
}
Operation reference¶
| Field | Meaning |
|---|---|
type |
Connector operation discriminator shown in the examples |
operation |
read or write |
path |
Relative file path or object key |
format |
auto, csv, json, spreadsheet, or file |
delimiter, has_header |
CSV parsing controls |
sheet, range, has_header |
Worksheet and A1 range controls |
content |
Direct write payload; pipeline input takes precedence |
overwrite |
Whether an existing file may be replaced; choose explicitly |
Use {{parameter_name}} in supported paths and worksheet/range fields. Runtime
values such as {{runtime.run_date}} use UTC and are supplied by Braidplane;
do not declare your own query parameters under the reserved runtime. prefix.
Pipeline and format behavior¶
Use operation_type: ftp. Structured reads normalize CSV, JSON, and Excel
workbooks to rows. format: file preserves opaque bytes for pass-through sinks.
Sink operations receive upstream input; it takes precedence over saved inline
content. CSV input stays raw for CSV output. JSON and spreadsheet output require
structured input, so CSV-to-JSON or CSV-to-spreadsheet needs an explicit transform.
Reads are bounded full-file/full-object operations with no watermark or cursor checkpoints. Results expose row counts and fields for structured reads, write counts where available, and safe file metadata. Raw bytes are not retained in historical run diagnostics for later download.
Spreadsheet example¶
Given an Excel workbook with a sheet named Customers and header cells
id,email, this operation reads the selected table as rows:
{
"type": "ftp",
"operation": "read",
"path": "customers.xlsx",
"format": "spreadsheet",
"sheet": "Customers",
"range": "A1:B20",
"has_header": true
}
Supported workbook extensions are .xlam, .xlsm, .xlsx, .xltm, and .xltx.
When sheet is omitted, the first worksheet is used; worksheets are not merged.
range belongs to that sheet and does not include its name. Explicit
has_header: true makes the first selected row the column names. Without an
explicit choice, an all-numeric first row is treated as headless with col_N
column names. Empty selected cells become empty strings.
For writes, range is the top-left starting cell. Braidplane creates a new
workbook; it does not preserve existing formatting, charts, macros, or template
metadata and does not evaluate formulas. OpenDocument workbooks are unsupported.
Limits and troubleshooting¶
- No pagination, incremental checkpoints, FTPS, or SFTP.
- Missing files: check the base path, exact name, and FTP account permissions.
- Connection success but transfer failure: verify passive data connectivity and server permissions, not just the control port.
- Existing target: review overwrite behavior before repeating the write.
See operation and pipeline basics for where to use these statements, parameters, environment bindings, and replay safety. Return to the connector directory.