SFTP Integration Guide
A comprehensive guide to setting up and using SFTP (Secure File Transfer Protocol) for bulk data operations with Oho, including file-based imports, exports, and automated integrations.
Overview
Base URL: sftp://sftp.weareoho.com
Authentication: SSH key-based authentication (recommended) or username/password
Port: 22 (default SFTP port)
This guide covers everything you need to set up secure file transfers for bulk operations with Oho, including constituent imports, accreditation exports, and automated data synchronization.
Why Use SFTP with Oho?
SFTP provides a secure, reliable way to handle bulk data operations that complement the Oho API:
- ✅ Bulk imports - Upload hundreds or thousands of constituents via CSV files
- ✅ Scheduled exports - Automated daily/weekly data exports for reporting
- ✅ Large file transfers - Handle files too large for standard API requests
- ✅ Legacy system integration - Connect older systems without REST API capabilities
- ✅ Audit trails - Complete file transfer logs and history
- ✅ Secure encryption - Industry-standard SSH encryption for data in transit
Prerequisites
Ensure you have:
- Active Oho account with SFTP access enabled (contact Oho Support to request)
- SFTP client installed (FileZilla, Cyberduck, or command-line sftp)
- SSH key pair generated (recommended for production use)
- Understanding of CSV file formats for bulk operations
- Valid API authentication token for validation operations
SFTP access must be enabled for your Oho account before you can use it. Contact Oho Support to request SFTP credentials and setup instructions for your organization.
Understanding SFTP
What is SFTP?
SFTP (SSH File Transfer Protocol) is a secure file transfer protocol that runs over SSH. It provides encrypted file transfers and is the industry standard for secure data exchange.
Key differences from FTP:
- Encrypted connection (vs plain text)
- Single port (22) vs multiple ports
- Built on SSH protocol
- Better firewall compatibility
When to Use SFTP vs API
Use SFTP when:
- Regularly importing/exporting 1000+ records at once
- Integrating with legacy systems without API support
- Scheduling automated daily/weekly data synchronization
- Transferring large data sets or attachments
- Your workflow involves file-based processing
Use REST API when:
- Making real-time individual requests
- Building interactive applications
- Receiving webhook notifications
- Performing single record operations
- Need immediate response validation
SFTP Workflow with Oho
Prepare Data File → Connect via SFTP → Upload to Dropbox → Oho Processes File
↓
Validation Report Generated
↓
Download Results via SFTP
Setting Up SFTP Access
Request SFTP Credentials
Contact Oho Support to request SFTP access. You'll receive:
- SFTP hostname (e.g.,
sftp.weareoho.com) - Username (typically your organization identifier)
- Initial temporary password
- Instructions for SSH key setup
Directory Structure
Once connected, you'll see a standardized directory structure for bidirectional data flow:
/
├── upload/ # YOUR SYSTEM → OHO (import to Oho)
└── archive # store of old files
├── download/ # OHO → YOUR SYSTEM (export from Oho)
└── archive # store of old files
Directory Purpose
upload/ - Files your system sends to Oho:
- Place files here for Oho to import and process
- Oho automatically detects new files and begins processing
- File selection policy: Oho processes the most recently created file of each type
- Processed files are automatically moved to
upload/archive/after completion - Failed files remain in place with error reports generated
download/ - Files Oho generates for your system:
- Credential status updates (e.g., daily status file)
- Validation results and processing reports
- Scheduled compliance exports
- Download these files regularly to sync Oho data back to your system
Upload File Types
Oho accepts one required file and one optional file for upload:
1. Employee and Credential File (Required)
Contains your active employees and their credentials. See detailed schema below.
2. Position Requirements File (Optional)
Contains position-to-license mappings. Only needed if your organization has specific license requirements per position/role. See detailed schema below.
Note: Not all organizations use position requirements. Contact Oho Support to determine if this applies to your use case.
File Naming Conventions
Oho uses standardized file naming patterns to identify file types and processing order:
Recommended Pattern
<source>-<type>-<timestamp>.csv
Components:
<source>- Your organization or system identifier (e.g., "HRMS", "PayGlobal", "MyOrg")<type>- File content type (optional - use if uploading position requirements)- Omit for employee/credential file
- Use
POSfor position requirements file
<timestamp>- ISO format timestamp (YYYYMMDD_HHMMSS) or date (YYYYMMDD)
Examples:
HRMS-20260129_143000.csv # Employee & credential import (required)
HRMS-POS-20260129_143000.csv # Position requirements (optional)
Oho-20260129_143000.csv # Oho status export
File Selection Policy
How Oho processes files:
- Oho selects the most recently created file of each type in the upload directory
- Files are processed based on modification timestamp (newest first)
- Employee/credential file and position file are processed independently
- Wait for processing to complete before uploading the next batch
- Frequency: Files are typically processed daily, but contact Oho Support for custom scheduling
Best practices:
- Use consistent naming patterns for reliable processing
- Include timestamps to ensure proper ordering
- Don't reuse filenames (creates ambiguity)
- Archive old files locally after successful processing
File Formats and Specifications
General CSV Requirements
All CSV files must follow these standards:
| Requirement | Specification |
|---|---|
| Format | CSV (Comma-Separated Values) |
| Encoding | UTF-8 (without BOM) |
| Header Row | Required - first row must contain column names |
| Delimiter | Comma (,) |
| String Delimiter | Double quotes (") - all values should be quoted |
| Line Ending | CRLF (\r\n) or LF (\n) |
| Date Format | YYYY-MM-DD (ISO 8601) |
| Maximum Rows | 10,000 per file (split larger datasets) |
Example formatting:
"external_id","first_name","last_name","email","date_of_birth"
"EMP001","Sarah","Chen","sarah.chen@example.com","1992-03-15"
"EMP002","Michael","Wong","michael.wong@example.com","1988-07-22"
Important:
- All values must be string-delimited (wrapped in double quotes)
- Dates must use YYYY-MM-DD format
- Empty values should be represented as
""(empty string), not left blank
Employee and Credential Import CSV
Oho accepts a single file format that combines employee data with their credentials. Each row represents one credential per employee (employees with multiple credentials appear on multiple rows).
Required Fields:
| Field | Type | Description |
|---|---|---|
external_id | String | Unique employee identifier from your system (part of primary key) |
first_name | String | First/given name |
last_name | String | Last name/surname |
dob | Date (YYYY-MM-DD) | Date of birth |
email | String | Email address (must be unique) |
position_id | String | Position/role identifier |
licence_type | String | Type of credential/license (part of primary key) |
licence_number | String | Credential/license number (part of primary key) |
issue_date | Date (YYYY-MM-DD) | Credential issue date |
expiry_date | Date (YYYY-MM-DD) | Credential expiry date |
Optional Fields:
| Field | Type | Description |
|---|---|---|
middle_name | String | Middle name(s) |
Example Import File:
"external_id","pageup_id","first_name","middle_name","last_name","dob","email","position_id","licence_type","licence_number","issue_date","expiry_date"
"EMP001","","Sarah","Jane","Chen","1992-03-15","sarah.chen@example.com","RN-001","AHPRA","NMW0001234567","2020-06-01","2026-05-31"
"EMP001","","Sarah","Jane","Chen","1992-03-15","sarah.chen@example.com","RN-001","VICWWC","1234567A","2023-01-15","2028-01-14"
"EMP002","PU-2024-001","Michael","","Thompson","1988-07-22","michael.thompson@example.com","DOC-001","AHPRA","MED0001234567","2015-03-01","2026-05-31"
"EMP003","","Jessica","Marie","Martinez","1995-11-08","jessica.martinez@example.com","EN-001","NDIS","NDIS-789012","2024-01-01","2029-01-01"
Primary Key: external_id + licence_type + licence_number
Important Notes:
- Each row represents ONE credential
- Employees with multiple credentials appear on multiple rows with repeated personal data
- Employee fields (name, email, dob, etc.) should be identical across all rows for the same
external_id
Active/Inactive Logic:
- Only active employees should be included in the upload file
- Employees not present in the file but existing in Oho will be marked as inactive/deactivated
- This "by exclusion" approach ensures Oho stays synchronized with your source system
- To reactivate an employee, include them in a subsequent upload
Validation Rules:
external_idmust be unique per employee in your systememailmust be valid format and unique within organization- All date fields must use YYYY-MM-DD format
- Primary key combination (
external_id+licence_type+licence_number) must be unique
Credential Status Export (Download from Oho)
Oho generates credential status files for your system to consume. These files contain the current state of all active credentials in Oho.
Fields in Status Export:
| Field | Type | Required | Description |
|---|---|---|---|
external_id | String | True | Employee identifier (matches your system) |
licence_type | String | True | Type of credential |
licence_number | String | True | Credential number |
issue_date | Date (YYYY-MM-DD) | True | Credential issue date |
expiry_date | Date (YYYY-MM-DD) | False | Credential expiry date (if applicable) |
licence_status | String | True | Oho status: green, yellow, red |
Example: Status Export
"external_id","licence_type","licence_number","issue_date","expiry_date","licence_status"
"EMP001","AHPRA","NMW0001234567","2020-06-01","2026-05-31","green"
"EMP001","VICWWC","1234567A","2023-01-15","2028-01-14","green"
"EMP002","AHPRA","MED0001234567","2015-03-01","2026-05-31","yellow"
"EMP003","VICWWC","9876543Z","2020-05-01","2025-05-01","red"
Licence Status Values:
green- Valid and current, no action neededyellow- Needs attention (expiring soon, renewal pending, has conditions, non-practising)red- Invalid, expired, suspended, or cannot practice
Usage:
- Download this file from
/download/directory - Import into your HR/payroll system
- Use to flag compliance issues and trigger renewals
- Only active credentials are included (inactive/deleted credentials are excluded)
Position Requirements CSV (Optional Upload to Oho)
When to use: Only if your organization has specific license requirements per position/role. This file defines which licenses are required for each position, allowing Oho to validate employee compliance based on their assigned role.
Required Fields:
| Field | Type | Required | Description |
|---|---|---|---|
position_id | String | True | Position/role identifier (matches position_id in employee file) |
license_code | String | True | Code of the license required for this position |
Optional Fields:
| Field | Type | Required | Description |
|---|---|---|---|
state | String | False | State where position operates (required for state-specific licenses like driver's licenses, WWC) |
Example: Position Requirements File
"position_id","license_code","state"
"RN-001","AHPRA",""
"RN-001","VICWWC","VIC"
"RN-001","NDIS",""
"DOC-001","AHPRA",""
"DOC-001","VICWWC","VIC"
"EN-001","AHPRA",""
"EN-001","QLDWWC","QLD"
"DRIVER-001","DL-VIC","VIC"
How it works:
- Each row maps ONE license requirement to ONE position
- Positions with multiple requirements appear on multiple rows (normalized table)
- Oho uses this to automatically flag compliance gaps when employees are assigned to positions
- When an employee's
position_idis set, Oho validates they have all required licenses for that position
File naming: <source>-POS-<timestamp>.csv
Important:
- This file is optional - only upload if you have position-specific license requirements
- The
license_codevalues must match thelicence_typevalues used in your employee/credential file - For state-specific licenses (WWC, driver's licenses), include the
statefield - Contact Oho Support to discuss if position requirements apply to your use case
Configuration and Mappings
Licence Type Mappings
Before uploading data, you must configure how your system's licence types map to Oho's verification types.
Process:
- Provide Oho Support with your list of licence types (as they appear in
licence_typefield) - Oho configures the mapping between your codes and Oho's verification types
- Any new licence types require a mapping request to Oho Support
Example Mappings:
| Your licence_type Code | Description | Oho Verification Type |
|---|---|---|
RN-AHPRA | Registered Nurse AHPRA | ahpra |
VIC-WWCC | Victoria WWC | vicwwc |
QLD-BLUE | Queensland Blue Card | qldblue |
NDIS-WORKER | NDIS Worker Screening | ndis |
Important:
- Mappings are configured per organization before go-live
- All licence types must be mapped before they can be processed
- Contact Oho Support to add new licence types
- Use consistent codes in all your uploads
- Test mappings before production use
Processing Frequency
Default Schedule:
- Files are processed daily (typically overnight)
- Processing starts when new files are detected in upload directories
- Results are available within 1-4 hours after processing begins
Custom Schedules:
- Contact Oho Support for different processing frequencies
- Available options: hourly, twice-daily, weekly
- Real-time processing available for critical workflows
Status Synchronization
How bidirectional sync works:
YOUR SYSTEM OHO
│ │
│ 1. Upload single CSV │
├──────────────────────────>│
│ (employees + │
│ credentials) │
│ │
│ 2. Oho verifies all │
│ credentials │
│ │
│ 3. Download status │
│<───────────────────────────┤
│ export CSV │
│ │
│ 4. Update your │
│ system with │
│ Oho statuses │
Recommended workflow:
- Daily upload - Send ONE CSV file with active employees and all their credentials
- Oho processes - Verifies credentials against registries (AHPRA, WWC, NDIS, etc.)
- Daily download - Retrieve status export CSV with updated credential statuses
- Sync back - Import status file into your HR/payroll system
- Alerts - Flag any
redoryellowstatus credentials for review
Troubleshooting
File Upload Issues
Problem: "No such file or directory" when uploading
Cause: Target directory doesn't exist or incorrect path
Solutions:
- ✅ List directories:
ls -la - ✅ Navigate to correct upload directory:
cd upload/constituents - ✅ Verify file exists locally:
!ls -l constituents.csv - ✅ Use absolute paths in put command
Problem: File uploads but never gets processed
Cause: Invalid file format or naming convention
Solutions:
- ✅ Check file naming follows convention (e.g.,
constituents_*.csv) - ✅ Verify CSV format matches template
- ✅ Check file encoding is UTF-8
- ✅ Ensure no hidden characters or BOM
- ✅ Download templates from
/templatesdirectory
FAQ
Q: How long does it take for uploaded files to be processed?
A: Processing time depends on file size:
- Small files (< 100 rows): 2-5 minutes
- Medium files (100-1,000 rows): 5-15 minutes
- Large files (1,000-10,000 rows): 15-30 minutes
You'll know processing is complete when the file moves from upload/ to upload/archive/ and results appear in download/results/.
Q: Can I schedule automated uploads?
A: Yes, use cron (Linux/macOS) or Task Scheduler (Windows) to automate uploads. See "Workflow 2: Automated Daily Export" for examples.
Q: How long are files retained on the SFTP server?
A:
- upload/: Processed files moved to archive after processing
- upload/archive/: Retained for 30 days
- download/: Files retained for 90 days
- Contact Oho Support for different retention requirements
Q: Can I use SFTP for real-time integrations?
A: SFTP is designed for batch operations, not real-time. For real-time integrations, use the REST API and Webhooks.
Q: What file size limits apply?
A:
- Maximum file size: 100MB per file
- Maximum rows: 10,000 per CSV file
- For larger data sets, split into multiple files
Q: Can I automate downloads of new result files?
A: Yes, use a script that polls the download/results/ directory for new files. See "Workflow 4: Monitoring Upload Processing" for an example.
Q: What if I need to cancel a file upload?
A: If a file is still in the upload directory and hasn't been processed yet, you can connect via SFTP and delete it:
Q: How does bidirectional sync work?
A: Bidirectional sync enables two-way data flow:
- Your system → Oho (upload/): Send active employees and credentials daily
- Oho → Your system (download/): Receive updated credential statuses daily
- Import Oho's status export to keep your HR system synchronized with current verification statuses
This ensures your source system always reflects the latest credential validation results from Oho.
Q: How do I set up licence type mappings?
A: Contact Oho Support with:
- Your list of licence types (as they appear in the
licence_typefield) - Description of each licence type
- Which Oho verification type each should map to
Oho will configure the mappings and confirm when ready for testing. All licence types must be mapped before go-live.
Q: What file naming convention should I use?
A: Follow these patterns:
Required file (employees & credentials):
<source>-<timestamp>.csv- Example:
HRMS-20260129_143000.csv
Optional file (position requirements):
<source>-POS-<timestamp>.csv- Example:
HRMS-POS-20260129_143000.csv
Download file (Oho status export):
Oho-<timestamp>.csv- Example:
Oho-20260129.csv
Use consistent naming for reliable processing. Include timestamps to ensure proper ordering.
Q: Do I need to upload the position requirements file?
A: Only if your organization has specific license requirements per position/role. Many organizations don't use this feature. Contact Oho Support to determine if position requirements apply to your use case.
Related Documentation
- Constituent Management Guide - API-based constituent operations
- Webhooks Integration Guide - Real-time event notifications
- WWC Integration Guide - Working with Children Check integrations
- Authentication Guide - API authentication setup
Support
For questions or issues with SFTP integration:
- Verify connection with verbose output:
sftp -vvv oho-sftp - Check file formats against templates in
/templatesdirectory - Review results files in
/download/resultsfor error details - Contact Oho Support with:
- Your username
- Timestamp of upload/download
- Filename experiencing issues
- Error messages or logs
Version: 1.0 Last Updated: 2026-01-29 Status: Production Ready