Build with Softools.

Use the Softools public API to read and update app data, access View reports, and work with images and documents.

Explore the Swagger API Download OpenAPI JSON

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

RequestPartitionLimit
Get View (including archived)Per user, per app120 calls per minute
Get View Record (including archived)Per user, per app, per record120 calls per minute
Get a single record directlyPer user, per app, per record10 calls per minute
Get many records directlyPer user, per app5 calls per minute
Patch or post a recordPer user, per app50 MB per 5 minutes
Patch using CSVPer user, per app50 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."}