What you’ll need
A WorkOS API key for your organization
SFTP authentication is delegated to WorkOS. Your SOLO account manager will help you (or your WorkOS admin) mint a key under your organization. The key string itself is the SFTP password.
The email you use to sign in to SOLO
Your email is the SFTP username. It identifies who is connecting and selects the environment via an optional plus-tag. The organization your uploads are attributed to is determined by the API key’s owning organization, not by the email — so a valid key is required no matter what username you present.
Step 1 — Pick an environment
We recommend doing your first upload against sandbox. Sandbox is a fully isolated copy of the network: nothing you upload there reaches production data, so it’s the right place to learn the format and verify your pipeline. You select an environment by appending a plus-tag to the local part of your email:| Environment | Username Format | Example |
|---|---|---|
| Sandbox | email+sandbox@domain.com | alice+sandbox@yourbank.com |
| Production | email@domain.com | alice@yourbank.com |
Alice@YourBank.com and alice@yourbank.com are the same user.
Step 2 — Connect
The SFTP host is the same for every environment:Step 3 — Download a template
Every upload is an Excel workbook (.xlsx) that lands in one of five category directories. Workbook templates are available on the Upload Categories page — they include the required header row, an example row, and the right column names already in place.
For this walkthrough, start with the simplest path: defining a KYC certificate policy that a furnisher can later attach data to.
Download Template
KYC Certificate Policy Template (.xlsx)
Policy and program workbooks define network configuration, so they are accepted only from the network’s governor. If your organization is a furnisher but not a governor, start with a
kyc_furnish_data workbook instead — the steps below are the same, only the directory and columns differ.Step 4 — Fill it in
Open the template in Excel (or any other spreadsheet app) and add one row of real data below the example row:kyc_policy_name | start_date | entity_type | document_capture | liveness_capture | address_verification |
|---|---|---|---|---|---|
| First KYC Test Policy | 2026-01-01 | Consumer | true | true | true |
- Only the first sheet of the workbook is read.
- Row 1 is a banner — anything you put there is ignored.
- Row 2 must contain the column headers.
- Row 3 and below are data rows. Each row is processed independently, so a single bad row won’t fail the rest of the file.
- Headers are normalized (lowercased, non-alphanumerics collapsed to
_), soKYC Policy Name,kyc_policy_name, andKYC-Policy-Nameare all equivalent. - Rows whose identifier column starts with
Ex.are treated as in-workbook examples and skipped.
first-kyc-test.xlsx.
Step 5 — Upload
Drop the workbook into the directory that matches its category:kyc_cert_policy/ is parsed as a KYC certificate policy workbook, a file in programs/ as a programs workbook, and so on.
Step 6 — Verify ingestion
Ingestion is event-driven and asynchronous — processing starts within seconds of the file landing, and a small workbook typically completes in well under a minute. The cleanest way to check is the SOLO dashboard: the Data → Uploads page lists every workbook your organization has sent, along with row-level success, filtered, and error counts. From there you can also drill into the resulting records (policies, programs, furnish events) to confirm they showed up where you expected.Re-sending data is safe at the row level. Data rows upsert on their natural keys (SSN for consumers; tax identifier + jurisdiction for businesses), so a corrected re-upload updates records rather than double-creating them. Re-uploaded policy or program rows that collide with existing names will surface per-row name-conflict errors instead — version the name (e.g.
First KYC Test Policy v2) if you intend a new policy.Common first-upload issues
Authentication failed / Permission denied at login
Authentication failed / Permission denied at login
Confirm the username is your full email address (with
+sandbox for sandbox), and the password is the literal WorkOS API key string — no Bearer prefix, no quotes. If you rotated the key recently, the old value is rejected; a freshly revoked key may take up to a minute to be refused everywhere, since auth results are briefly cached."Permission denied" on ls, get, or overwrite
"Permission denied" on ls, get, or overwrite
Working as intended — SFTP access is upload-only. You can
put new files and create directories; everything else is denied. Use the dashboard to inspect what you’ve uploaded, and use a new filename rather than overwriting an old one."Host key verification failed"
"Host key verification failed"
The first time you connect from a new machine your SSH client doesn’t know the server’s host key yet. Either accept the fingerprint at the prompt, or pre-populate your
known_hosts:File uploaded but no records appear
File uploaded but no records appear
Open the workbook in Excel and confirm:
- Headers are in row 2 (not row 1), and there are no merged cells above them.
- The identifier column on every real data row is not prefixed with
Ex.(those are skipped as examples). - The file was saved as
.xlsx, not.xlsor.csv. - For data workbooks: every row’s
program_namematches a program the governor has configured, and theapplication_datefalls inside an active policy window — rows outside every window are filtered (skipped), which is reported separately from errors.
Policy or program rows fail with an access error
Policy or program rows fail with an access error
Configuration categories (
kyc_cert_policy, kyb_cert_policy, programs) are governor-only. The file itself uploads fine, but every row is rejected at ingest if your organization doesn’t govern the target network. Furnishers should upload to the data categories instead.Row rejected with formula cells that have no cached value
Row rejected with formula cells that have no cached value
Workbooks are read using cached formula results. If a workbook was generated programmatically and never opened in Excel, formula cells may have no cached value — the row is rejected and the error names the offending columns. Open and save the file in Excel (or set cached values when generating it) before uploading.
Where to go next
SFTP Overview
The full mental model — categories, environments, how routing works.
Upload Categories
Required and optional columns for every category, plus downloadable templates.
Workbook Format
Detailed rules for headers, data types, and the row 1 banner convention.
API Reference
Prefer to integrate over HTTPS? The same operations are available as REST endpoints.