What you’ll need
1
An organization API key
SFTP uses the same organization API key as the REST API. Create one in the SOLO dashboard under Settings → API keys (see Authentication). The key string itself is the SFTP password.
2
An email-form username
The SFTP username is an email address, such as your work email. It selects the environment through an optional plus-tag; it isn’t used to authenticate you or to decide which organization your uploads belong to — the API key does both.
3
The network id
The network you’re furnishing into. Each SFTP feed’s detail page in the dashboard shows it. Your organization must be a furnisher or governor of that network.
Step 1 — Pick an environment
We recommend doing your first upload against sandbox. Sandbox is a separate environment from production: 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 with a plus-tag on the local part of the email:
Usernames are case-insensitive —
Alice@YourBank.com and alice@yourbank.com are the same.
Step 2 — Connect
The SFTP host is the same for every environment:Step 3 — Write a JSONL file
Every upload is a JSONL file: UTF-8 text with one JSON object per line. Each record carries a_type naming the kind of record it is — that’s how the network decides which mappings receive it.
Find the record type in the dashboard: open Feeds, pick the feed you’re delivering, and read its sample record. The sample’s _type is the value to use, and its other fields are the ones the feed’s mapping reads.
For this walkthrough, write one consumer record for a feed whose record type is consumers:
first_upload.jsonl
- One compact object per line — not a JSON array, and not pretty-printed across lines.
- Blank lines are skipped. Every other line is processed independently, so a single bad line won’t fail the rest of the file.
- Identifiers are strings. Write SSNs and tax identifiers as
"012345678", never as numbers — a number drops the leading zero. - Filenames — use a new filename for every upload (a date or batch number works well).
Step 4 — Upload
Put the file innetwork_{network_id}/jsonl_furnish_data/, where {network_id} is the network the records go to:
Step 5 — Verify ingestion
Ingestion starts automatically once the upload completes and runs in the background. Each file has 30 minutes to finish; split very large exports into several files. Check the result in the SOLO dashboard (or production): the Uploads page lists every file your organization has sent, with the records read and the succeeded, filtered, failed, and unmatched counts. The feed’s detail page shows its recent deliveries and names any record types no mapping claimed.Re-sending is safe for identities: records resolve to the existing consumer or business on their natural keys (SSN and date of birth for consumers; federal EIN and jurisdiction of formation for businesses), so a re-upload attaches to the same profiles instead of creating duplicates. Verification events in a re-sent record are added again, so re-send only the records that didn’t ingest.
Common first-upload issues
Authentication failed / Permission denied at login
Authentication failed / Permission denied at login
Confirm the username is an email address (with
+sandbox for sandbox), and the password is the literal organization API key string — no Bearer prefix, no quotes. A revoked key is refused; one revoked moments ago may still be accepted for up to a minute while a previous successful check is 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 upload appears in the dashboard
File uploaded but no upload appears in the dashboard
The file landed outside a
jsonl_furnish_data/ folder, so it was never ingested. Re-upload it into network_{network_id}/jsonl_furnish_data/.Records are counted as unmatched
Records are counted as unmatched
No active mapping in the target network claims their
_type. Compare the value with the feed’s sample record, confirm the feed’s mapping is active rather than a draft, and confirm the folder names the network you expected.The upload fails with an access error
The upload fails with an access error
Your organization doesn’t hold the furnisher or governor role in the network named by the folder. Check the network id in the path, or ask the network’s governor to add your organization as a furnisher.
Only part of a large file was ingested
Only part of a large file was ingested
The file ran out of its 30-minute processing budget or stopped partway. Records processed before that point stay ingested. Check the upload’s results, then upload the remaining records as a new file.
Where to go next
SFTP Overview
The full mental model — directories, environments, how routing works.
JSONL Files
The file format, record types, and results reference.
Furnishing Policies
How mappings turn records into network data.
API Reference
Prefer to furnish over HTTPS? Records can be sent as REST calls.