SSP File Upload API
This guide is for SSP (Studio School Pro) developers who want to automatically upload export files to Simply360 for synchronization.
📚 Related: SSP Integration Setup (admin configuration) | SSP File Column Reference (supported files and columns)
Overview
The SSP Sync API allows you to programmatically upload Excel files exported from SSP to Simply360. This enables automated nightly syncs without manual file uploads.
Authentication
The SSP API uses Bearer token authentication with an Integration API Key (not a user JWT token).
Getting Your API Key
- In Simply360, go to Settings → Integrations → Studio School Pro
- Click API Keys
- Generate a new API key for file uploads
- Store the key securely - it won't be shown again
Using the API Key
Authorization: Bearer {api_key}
Base URL
https://api.simply360.app/public/integration/ssp-sync
Endpoints
POST /upload - Upload SSP Files
Upload one or more Excel files for processing.
Request
POST /upload
Authorization: Bearer {api_key}
Content-Type: multipart/form-data
X-Callback-Url: https://your-ssp-server.com/callback (optional)
files: [Classes.xlsx, Contacts.xlsx, Individuals.xlsx, ...]
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| files | File[] | Yes | One or more .xlsx files to upload |
| dryRun | Boolean (query) | No | If true, validate files without creating/updating records |
| X-Callback-Url | String (header) | No | Webhook URL to POST results when processing completes |
Supported Files
| File Name | Description |
|---|---|
| Classes.xlsx | Class/section definitions with enrollment counts |
| Contacts.xlsx | Parent/guardian contact information |
| Individuals.xlsx | Student demographic data |
| Faculty.xlsx | Teacher/instructor information |
| Enrollments.xlsx | Class enrollment records |
Response (202 Accepted)
{
"syncId": "sync_abc123xyz",
"status": "accepted",
"message": "Files queued for processing",
"statusUrl": "/public/integration/ssp-sync/status/sync_abc123xyz",
"filesReceived": ["Classes.xlsx", "Contacts.xlsx", "Individuals.xlsx"]
}
GET /status/{syncId} - Check Sync Status
Poll this endpoint to check the status of a sync job.
Request
GET /status/sync_abc123xyz
Authorization: Bearer {api_key}
Response
{
"syncId": "sync_abc123xyz",
"status": "completed", // pending, processing, completed, failed
"startedAt": "2026-02-01T10:00:00Z",
"completedAt": "2026-02-01T10:05:32Z",
"results": {
"Classes.xlsx": {
"processed": 150,
"created": 12,
"updated": 138,
"errors": 0
},
"Contacts.xlsx": {
"processed": 1200,
"created": 45,
"updated": 1155,
"errors": 3,
"errorDetails": [
{"row": 234, "field": "Email", "error": "Invalid email format"},
{"row": 567, "field": "Phone", "error": "Invalid phone number"}
]
}
}
}
Webhook Callback
If you provide an X-Callback-Url header, Simply360 will POST results when processing completes:
POST https://your-ssp-server.com/callback
Content-Type: application/json
{
"syncId": "sync_abc123xyz",
"status": "completed",
"completedAt": "2026-02-01T10:05:32Z",
"results": { ... }
}
Example: FileMaker Script
Here's a sample FileMaker script to upload files to Simply360:
Set Variable [ $apiKey ; Value: "your_api_key_here" ]
Set Variable [ $baseUrl ; Value: "https://api.simply360.app/public/integration/ssp-sync" ]
# Export files to temporary location
Export Records [ File: "Classes.xlsx" ; Format: Excel ]
Export Records [ File: "Contacts.xlsx" ; Format: Excel ]
# Upload using Insert from URL with cURL options
Set Variable [ $curlOptions ; Value:
"-X POST " &
"-H 'Authorization: Bearer " & $apiKey & "' " &
"-F 'files=@Classes.xlsx' " &
"-F 'files=@Contacts.xlsx'"
]
Insert from URL [ $response ; $baseUrl & "/upload" ; cURL options: $curlOptions ]
# Parse response for syncId
Set Variable [ $syncId ; Value: JSONGetElement ( $response ; "syncId" ) ]
# Poll for completion (loop until status = completed or failed)
Loop
Pause/Resume Script [ Duration: 30 ]
Insert from URL [ $statusResponse ; $baseUrl & "/status/" & $syncId ]
Exit Loop If [ JSONGetElement ( $statusResponse ; "status" ) ≠"processing" ]
End Loop
# Log results
Set Field [ SyncLog::Results ; $statusResponse ]
Rate Limits
| Limit | Value |
|---|---|
| Max file size | 10 MB per file |
| Max files per request | 20 files |
| Requests per minute | 10 |
| Concurrent sync jobs | 1 per team |
Error Codes
| Code | Description |
|---|---|
| 400 | Invalid request (no files, wrong format) |
| 401 | Invalid or missing API key |
| 403 | API key lacks required permission |
| 429 | Rate limit exceeded |
| 500 | Internal server error |
Best Practices
- Schedule during off-peak hours - Run syncs overnight when system load is lower
- Use webhook callbacks - Instead of polling, let Simply360 notify you when complete
- Run dry-run first - Validate files before committing changes
- Log sync IDs - Keep a record for troubleshooting
- Handle partial failures - Check results per-file; some may succeed while others fail
Support
For API issues or questions:
- Email: support@simply360.app
- Include your sync ID and API key prefix (first 8 characters) in support requests