OneRoster CSV Integration over SFTP
How to deliver OneRoster v1.1 CSV rostering files to Lingco via SFTP
Overview
Lingco can roster your students, teachers, classes, courses, and enrollments from a nightly OneRoster v1.1 CSV export delivered over SFTP. Your SIS (PowerSchool, Infinite Campus, Skyward, ClassLink, Clever, etc.) generates the file set, and Lingco picks it up on a schedule and syncs it into your Lingco organization.
Important: Lingco supports full (bulk) exports only. Delta files are not currently supported. Every upload must contain the complete, current picture of your data. If delta-only export is a hard requirement for your district, let us know and we'll discuss options.
SFTP Connection Details
Lingco provisions a dedicated SFTP account for your district. Your connection details:
Setting | Value |
Host | sftp-oneroster.lingco.io |
Port | 22 |
Protocol | SFTP (SSH File Transfer Protocol) |
Username |
|
Password |
|
Upload directory | / |
Notes on connecting
Only SFTP is supported. Plain FTP and FTPS are not accepted.
If your district firewalls outbound traffic, allow outbound TCP on port 22 to the host above.
Your account is chrooted to your own directory — you will not see or be able to reach other districts' files.
Please store these credentials in your district's password manager. If they're ever exposed, contact Lingco support and we'll rotate them.
Uploading
Connect with any standard SFTP client (WinSCP, FileZilla, Cyberduck,
sftp/scpon the command line) or your SIS's built-in scheduled export/delivery feature.Upload a single
.ziparchive containing the CSV files (see below).Upload to a temporary name and rename into place, or use your client's atomic upload option, so Lingco never picks up a partially written file.
Lingco processes the most recent archive on each scheduled run and archives the previous one.
Recommended schedule: nightly, outside of school hours (for example between 1:00 AM and 4:00 AM local time). Weekly is acceptable for districts whose rosters change infrequently. Confirm your intended schedule with Lingco during setup so our pickup window lines up with your export window.
What Lingco Does With the Data
Entity | How it's used | Fields read |
Organization | Builds the district/school hierarchy so users only see data within their own organizations |
|
Course | Links to Lingco classes; codes and titles drive display in reports and content mapping |
|
Class | The core unit assignments and assessments bind to |
|
User | Creates Lingco student and teacher accounts with the right roles and org assignments |
|
Enrollment | Links users to classes with role and enrollment period |
|
Academic Session | Organizes classes temporally into terms and grading periods |
|
Setup Checklist
Before your first upload
[ ] Receive SFTP host, username, and credentials from Lingco
[ ] Send Lingco your IP address so we can whitelist
[ ] Confirm your district can reach the host on port 22
[ ] Configure your SIS export for OneRoster v1.1 bulk CSV
First upload
[ ] Upload a sample archive and notify Lingco support
[ ] Lingco reviews file structure, org hierarchy, and course codes
[ ] Lingco maps SIS course codes to the Lingco course catalog
[ ] Verify a small sample of classes, users, and enrollments in Lingco
[ ] Confirm teacher vs. student role assignments look correct
Ongoing
[ ] Switch to the agreed nightly/weekly schedule
[ ] Monitor for sync failures during the first two weeks
[ ] Notify Lingco before major changes (new school year rollover, SIS upgrade, org restructuring)
[ ] Rotate SFTP credentials periodically
Troubleshooting
Connection refused or timeout Confirm port 22 outbound is open from the machine or SIS service doing the upload, and that you're using SFTP rather than FTP/FTPS. Double-check the host for typos. Ensure Lingco has whitelisted SIS IP address
Authentication failed Verify the username and password/key. If you recently rotated credentials, make sure your SIS's saved configuration was updated too. Contact Lingco support to re-issue credentials if needed.
Upload succeeds but nothing syncs Usually a structure problem: the CSVs are nested in a folder inside the zip, extra files are present in the archive, a required file is missing, or the manifest lists a file as absent or delta.
Some records are skipped Most often a broken reference — an enrollment pointing at a classSourcedId or userSourcedId that doesn't exist in the same archive, or a class pointing at a missing course or term. Bulk exports must be internally complete and consistent.
Classes appear but no students Check that the enrollment rows exist for those classes and that enabledUser is true on the relevant users.
Users can't sign in Confirm SSO is configured and that username/email in users.csv match what your identity provider sends. Rostered users have no local password.
Old classes and users won't go away Because Lingco treats each archive as the complete picture, anything omitted from the latest upload is removed. If stale records persist, the export is probably still including them.
Support
Lingco support — credential provisioning, course mapping, and sync troubleshooting.
Your SIS vendor — help generating a compliant OneRoster v1.1 bulk CSV export and scheduling automated SFTP delivery.
1EdTech — the OneRoster v1.1 specification and the CSV ZIP File Validation tool.
Technical Specs
Technical Specs
File Format Requirements
All files must conform to the OneRoster v1.1 CSV binding.
Archive: one
.zipfile containing the CSVs at the root of the archive — no nested folders, no extra files.Encoding: UTF-8. A byte order mark (BOM) is tolerated but not required.
Format: RFC 4180 CSV. Fields containing commas or double quotes must be wrapped in double quotes; a literal double quote inside a quoted field is escaped by doubling it (
""). Carriage returns are not permitted inside a field.Header row: required in every file. Headers must be spelled exactly as specified and must appear in exactly the order listed below.
All columns required: every column defined for a file must be present, even when you have no data for it. Leave the value empty rather than omitting the column.
Filenames and headers are case sensitive.
users.csv, notUsers.csv.Dates:
YYYY-MM-DD(note: this differs from the RESTful API's datetime format).Bulk processing: because Lingco only accepts full exports, the
statusanddateLastModifiedcolumns must be present but empty in every row. Records that disappear from a subsequent export are treated as removed.Multi-value fields (
grades,subjects,subjectCodes,orgSourcedIds,termSourcedIds,periods,userIds) hold comma-separated lists inside a single quoted field — for example"09,10,11".sourcedId values must be globally unique, stable across exports, and under 256 characters. If a
sourcedIdchanges between runs, Lingco sees it as a brand new record.
Before your first delivery, we strongly recommend validating your archive with the 1EdTech CSV ZIP File Validation tool (a free 1EdTech account is required).
Required Files
Send all seven files below in every archive. If a file legitimately has no rows, still include it with its header row.
File | Contents |
| Inventory of which files are included and how they should be processed |
| Districts and schools |
| School years, terms, semesters, grading periods |
| Course catalog offerings |
| Individual class sections |
| Students and teachers |
| Which users belong to which classes, and in what role |
demographics.csv is optional and not used by Lingco.
File Specifications
manifest.csv
Two columns: propertyName and value. Each row is one property/value pair.
propertyName | value |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Name of your SIS (e.g. |
| Your SIS vendor/instance code |
Every file we consume must be marked bulk. Files marked delta will not be processed.
orgs.csv
Column order: sourcedId, status, dateLastModified, name, type, identifier, parentSourcedId
Field | Required | Notes |
| Yes | Unique, stable ID for the org |
| Leave empty | Bulk mode |
| Leave empty | Bulk mode |
| Yes | Display name of the district or school |
| Yes | One of |
| No | Local/state school code |
| Conditional | Each school should point at its district's |
Lingco uses the org hierarchy to scope permissions — users only see data inside the organizations they belong to.
academicSessions.csv
Column order: sourcedId, status, dateLastModified, title, type, startDate, endDate, parentSourcedId, schoolYear
Field | Required | Notes |
| Yes |
|
| Leave empty |
|
| Leave empty |
|
| Yes | e.g. |
| Yes |
|
| Yes |
|
| Yes |
|
| No | e.g. a semester's parent school year |
| Yes | Four-digit year the session ends in, e.g. |
Date ranges matter: Lingco uses them to determine which classes are current. Make sure terms cover the actual instructional dates.
courses.csv
Column order: sourcedId, status, dateLastModified, schoolYearSourcedId, title, courseCode, grades, orgSourcedId, subjects, subjectCodes
Field | Required | Notes |
| Yes |
|
| Leave empty |
|
| Leave empty |
|
| No | Points at an |
| Yes | e.g. |
| No | Your SIS course code — used for mapping to Lingco content |
| No | Comma-separated grade codes, e.g. |
| Yes | The school or district that owns the course |
| No | e.g. |
| No |
|
Course codes and titles are what Lingco's team uses to map your SIS courses to the Lingco course catalog, so accurate, consistent values here make setup much faster.
classes.csv
Column order: sourcedId, status, dateLastModified, title, grades, courseSourcedId, classCode, classType, location, schoolSourcedId, termSourcedIds, subjects, subjectCodes, periods
Field | Required | Notes |
| Yes |
|
| Leave empty |
|
| Leave empty |
|
| Yes | Shown to teachers and students in Lingco — make it recognizable, e.g. |
| No |
|
| Yes | Must match a row in |
| No | Section code from the SIS |
| Yes |
|
| No | Room number |
| Yes | Must match a |
| Yes | One or more |
| No |
|
| No |
|
| No | e.g. |
The class is the core unit in Lingco — assignments and grades attach to it.
users.csv
Column order: sourcedId, status, dateLastModified, enabledUser, orgSourcedIds, role, username, userIds, givenName, familyName, middleName, identifier, email, sms, phone, agentSourcedIds, grades, password
Field | Required | Notes |
| Yes |
|
| Leave empty |
|
| Leave empty |
|
| Yes |
|
| Yes | School(s) the user belongs to, comma-separated inside quotes |
| Yes |
|
| Yes | Must match the identifier your SSO provider sends |
| No |
|
| Yes | First name |
| Yes | Last name |
| No |
|
| No | Student/staff ID |
| Recommended | Should match the email in your identity provider |
| No | Leave empty |
| No | Leave empty |
| No | Parent/guardian links — not used by Lingco |
| No | Student grade level |
| No | Leave empty. Lingco never sets local passwords from a roster file. |
Authentication: OneRoster-provisioned accounts are SSO-only. Users sign in through your district identity provider (Google, Clever, ClassLink, Microsoft, or LTI launch) — they do not have Lingco passwords. Make sure the username and email values here match what your IdP asserts, or accounts won't link up.
enrollments.csv
Column order: sourcedId, status, dateLastModified, classSourcedId, schoolSourcedId, userSourcedId, role, primary, beginDate, endDate
Field | Required | Notes |
| Yes |
|
| Leave empty |
|
| Leave empty |
|
| Yes | Must match a row in |
| Yes | Must match a |
| Yes | Must match a row in |
| Yes |
|
| Conditional |
|
| No |
|
| No |
|
Every student and every teacher needs a separate row for each class they're in.
