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

  1. In Simply360, go to Settings → Integrations → Studio School Pro
  2. Click API Keys
  3. Generate a new API key for file uploads
  4. 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

  1. Schedule during off-peak hours - Run syncs overnight when system load is lower
  2. Use webhook callbacks - Instead of polling, let Simply360 notify you when complete
  3. Run dry-run first - Validate files before committing changes
  4. Log sync IDs - Keep a record for troubleshooting
  5. 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

Still need help? Contact Us Contact Us