Build with Softools.
Use the Softools public API to read and update app data, access View reports, and work with images and documents.
Authentication
Send API requests to https://api-gateway.softools.net. Include both headers with every authenticated request:
ApiKey: <your user API key>
Tenant: <your tenant identifier>The API key is user-specific, so record creation and updates retain the correct audit identity. Rotate it from your Softools user profile if it may have been exposed.
Use Views to read data
For new integrations, use Get View and Get View Record rather than the direct single-record or list APIs. Views return the fields defined in the selected View report and support higher request limits: 120 calls per minute, compared with 10 for a direct single-record read and 5 for a direct list read.
Choose a View report for your integration and use its identifier as ViewReportIdentifier. Ask your app administrator which app and View identifiers to use.
Read records from a View:GET /Api/Apps/{AppIdentifier}/View/{ViewReportIdentifier}
Read one record through a View:GET /Api/Apps/{AppIdentifier}/View/{ViewReportIdentifier}/Record/{RecordId}
Use these paths on https://api-gateway.softools.net with your ApiKey and Tenant headers. See Swagger for query options and response schemas. The direct data APIs remain available for existing integrations; use the write APIs when creating or updating records.
Fair-use rate limits
| Request | Partition | Limit |
|---|---|---|
| Get View (including archived) | Per user, per app | 120 calls per minute |
| Get View Record (including archived) | Per user, per app, per record | 120 calls per minute |
| Get a single record directly | Per user, per app, per record | 10 calls per minute |
| Get many records directly | Per user, per app | 5 calls per minute |
| Patch or post a record | Per user, per app | 50 MB per 5 minutes |
| Patch using CSV | Per user, per app | 50 MB per 5 minutes |
A request over its limit returns 429 Too Many Requests with a Retry-After header giving the number of seconds to wait, and a JSON body with the same number of seconds:
{"statusCode":429,"message":"Rate limit is exceeded. Try again in 60 seconds."}