Download OpenAPI specification:
The Slingshot Public API (v1) provides programmatic access to underwriting cases, documents, exports, and lines of business.
All endpoints require OAuth 2.0 client credentials. Obtain an access token from the token endpoint and include it as a Bearer token:
Authorization: Bearer <access_token>
All request and response bodies follow JSON:API 1.1 conventions:
{ data: { type, id, attributes } } object.{ data: [...] } array.{ errors: [...] }.List endpoints use cursor-based pagination. Pass page[size] to control page
size (default 20, max 100) and page[cursor] from the previous response's
links.next to advance through pages. When links.next is absent the final
page has been reached.
All endpoints are rate-limited per API credential:
X-RateLimit-Remaining on every response429 Too Many Requests is returnedRetry-After in the response indicates when the window resets (seconds)Exports are generated asynchronously. The workflow is:
POST /v1/exports/{type} — submit an export request → 202 Accepted, status pending.GET /v1/exports/{type}/{id} until attributes.status is ready or failed.GET /v1/exports/{type}/{id}/download — fetch the pre-signed download URL.Returns a paginated list of underwriting cases belonging to the caller's
organization. Results are ordered by createdAt descending.
| page[cursor] | string Opaque cursor string from a previous response's |
| page[size] | integer [ 1 .. 100 ] Default: 20 Number of items per page (default 20, max 100). |
| filter[lobId] | string <uuid> Filter cases by Line of Business UUID. |
| filter[phase] | string (CasePhase) Enum: "intake" "clearance" "required_info" "analysis" "terms_conditions" "quote" Filter cases by workflow phase. |
| filter[outcome] | string (CaseOutcome) Enum: "active" "declined" Filter cases by outcome status. |
{- "data": [
- {
- "type": "cases",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "caseNumber": "CASE-20260318-0042",
- "phase": "intake",
- "outcome": "active",
- "lobId": "e225f906-da2a-4abf-bf0a-089ad77ddd2b",
- "broker": {
- "company": "string",
- "contact": "string"
}, - "business": {
- "name": "string",
- "classificationScheme": "string",
- "classificationCode": "string",
- "classificationDescription": "string"
}
}, - "relationships": {
- "lineOfBusiness": {
- "data": {
- "type": "lines-of-business",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
}
}
}
], - "meta": {
- "total": 0
}
}Creates a new underwriting case and links the provided documents to it.
All documents must be in ready status and must not already belong to
another case. The operation is atomic — either all documents are linked
or none are.
required | object |
{- "data": {
- "type": "cases",
- "attributes": {
- "lobId": "e225f906-da2a-4abf-bf0a-089ad77ddd2b",
- "documentIds": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "broker": {
- "company": "string",
- "contact": "string"
}
}
}
}{- "data": {
- "type": "cases",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "caseNumber": "CASE-20260318-0042",
- "phase": "intake",
- "outcome": "active",
- "lobId": "e225f906-da2a-4abf-bf0a-089ad77ddd2b",
- "broker": {
- "company": "string",
- "contact": "string"
}, - "business": {
- "name": "string",
- "classificationScheme": "string",
- "classificationCode": "string",
- "classificationDescription": "string"
}
}, - "relationships": {
- "lineOfBusiness": {
- "data": {
- "type": "lines-of-business",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
}
}
}
}Returns a single case by ID with all related data.
| id required | string <uuid> UUID of the resource. |
{- "data": {
- "type": "cases",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "caseNumber": "CASE-20260318-0042",
- "phase": "intake",
- "outcome": "active",
- "lobId": "e225f906-da2a-4abf-bf0a-089ad77ddd2b",
- "broker": {
- "company": "string",
- "contact": "string"
}, - "business": {
- "name": "string",
- "classificationScheme": "string",
- "classificationCode": "string",
- "classificationDescription": "string"
}, - "tiv": 0,
- "reportedTiv": 0,
- "reportedLocationCount": 0,
- "reportedBuildingCount": 0,
- "documents": [
- {
- "type": "documents",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "filename": "string",
- "documentType": "application",
- "status": "uploading",
- "sizeBytes": 0,
- "mimeType": "application/pdf",
- "uploadedAt": "2019-08-24T14:15:22Z",
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a"
}
}
], - "locations": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "locNumber": "string",
- "addressLine1": "string",
- "addressLine2": "string",
- "city": "string",
- "state": "CA",
- "postalCode": "string",
- "latitude": 0,
- "longitude": 0,
- "tiv": 0,
- "buildingCount": 0,
- "constructionType": "string",
- "yearBuilt": 0,
- "floodZone": "string",
- "ppcCode": "string"
}
]
}, - "relationships": {
- "lineOfBusiness": {
- "data": {
- "type": "lines-of-business",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
}
}
}
}Partially updates a case. Only the fields present in attributes are
modified — absent fields retain their existing values (JSON:API sparse
fieldsets semantics).
Permitted updates: phase, outcome, broker.
Setting broker to null removes it. When provided as an object, company is required.
| id required | string <uuid> UUID of the resource. |
required | object |
{- "data": {
- "type": "cases",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "phase": "intake",
- "outcome": "active",
- "broker": {
- "company": "string",
- "contact": "string"
}
}
}
}{- "data": {
- "type": "cases",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "caseNumber": "CASE-20260318-0042",
- "phase": "intake",
- "outcome": "active",
- "lobId": "e225f906-da2a-4abf-bf0a-089ad77ddd2b",
- "broker": {
- "company": "string",
- "contact": "string"
}, - "business": {
- "name": "string",
- "classificationScheme": "string",
- "classificationCode": "string",
- "classificationDescription": "string"
}, - "tiv": 0,
- "reportedTiv": 0,
- "reportedLocationCount": 0,
- "reportedBuildingCount": 0,
- "documents": [
- {
- "type": "documents",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "filename": "string",
- "documentType": "application",
- "status": "uploading",
- "sizeBytes": 0,
- "mimeType": "application/pdf",
- "uploadedAt": "2019-08-24T14:15:22Z",
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a"
}
}
], - "locations": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "locNumber": "string",
- "addressLine1": "string",
- "addressLine2": "string",
- "city": "string",
- "state": "CA",
- "postalCode": "string",
- "latitude": 0,
- "longitude": 0,
- "tiv": 0,
- "buildingCount": 0,
- "constructionType": "string",
- "yearBuilt": 0,
- "floodZone": "string",
- "ppcCode": "string"
}
]
}, - "relationships": {
- "lineOfBusiness": {
- "data": {
- "type": "lines-of-business",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
}
}
}
}Returns the set of workflow actions currently available for a case. The available actions depend on the case's current phase and outcome. Clients should use this list to determine which controls to render — do not hard-code phase transitions.
Actions are returned as a JSON:API resource collection of type case-actions.
| id required | string <uuid> UUID of the resource. |
| filter[actionType] | string (CaseActionType) Enum: "advance_phase" "revert_phase" "set_outcome" Filter actions by type. |
{- "data": [
- {
- "type": "case-actions",
- "id": "string",
- "attributes": {
- "actionType": "advance_phase",
- "label": "Advance to Analysis",
- "targetPhase": "intake",
- "targetOutcome": "active"
}
}
]
}Requests a pre-signed S3 URL for direct client-to-storage upload. After
receiving the URL, the client uploads the file directly to S3 using the
provided headers, then calls GET /v1/documents/{id} to confirm
completion.
Maximum file size: 50 MB (52,428,800 bytes).
required | object |
{- "data": {
- "type": "documents",
- "attributes": {
- "filename": "string",
- "contentType": "application/pdf",
- "sizeBytes": 1,
- "checksumSha256": "string",
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a",
- "documentType": "application"
}
}
}{- "data": {
- "type": "documents",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "filename": "string",
- "documentType": "application",
- "status": "uploading",
- "sizeBytes": 0,
- "mimeType": "application/pdf",
- "uploadedAt": "2019-08-24T14:15:22Z",
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a"
}, - "meta": {
- "directUpload": {
- "headers": {
- "Content-Type": "string",
- "x-amz-checksum-sha256": "string"
}, - "expiresAt": "2019-08-24T14:15:22Z"
}
}
}
}Returns a paginated list of documents belonging to the caller's
organization. Results are ordered by uploadedAt descending.
| page[cursor] | string Opaque cursor string from a previous response's |
| page[size] | integer [ 1 .. 100 ] Default: 20 Number of items per page (default 20, max 100). |
| filter[caseId] | string <uuid> Filter documents by case UUID. |
| filter[status] | string (DocumentStatus) Enum: "uploading" "ready" "processing" "failed" Filter documents by upload status. |
{- "data": [
- {
- "type": "documents",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "filename": "string",
- "documentType": "application",
- "status": "uploading",
- "sizeBytes": 0,
- "mimeType": "application/pdf",
- "uploadedAt": "2019-08-24T14:15:22Z",
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a"
}
}
], - "meta": {
- "total": 0
}
}Signals that the client has successfully PUT the file to the S3 pre-signed URL
returned by POST /v1/documents. Transitions the document from uploading to
processing and enqueues the document-processing workflow.
The document must be linked to a case (caseId set) before confirmation is
possible. If the document was uploaded without a case, link it to a case first
via POST /v1/cases, then call this endpoint.
Idempotent: If the document is already ready, returns the current state
without re-triggering processing.
| id required | string <uuid> UUID of the resource. |
required | object |
{- "data": {
- "type": "documents",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "status": "uploaded"
}
}
}{- "data": {
- "type": "documents",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "filename": "string",
- "documentType": "application",
- "status": "uploading",
- "sizeBytes": 0,
- "mimeType": "application/pdf",
- "uploadedAt": "2019-08-24T14:15:22Z",
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a"
}
}
}Returns a single document by ID including its current upload and processing status.
Poll this endpoint after calling PATCH /v1/documents/{id} to confirm upload
until attributes.status is ready or failed. Recommended polling interval: 2–5 seconds.
| id required | string <uuid> UUID of the resource. |
{- "data": {
- "type": "documents",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "filename": "string",
- "documentType": "application",
- "status": "uploading",
- "sizeBytes": 0,
- "mimeType": "application/pdf",
- "uploadedAt": "2019-08-24T14:15:22Z",
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a"
}
}
}Returns a short-lived pre-signed URL to download the raw document file from storage. The URL expires after 60 minutes.
| id required | string <uuid> UUID of the resource. |
{- "data": {
- "type": "document-downloads",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
}
}Submits an export generation request and returns immediately with
202 Accepted. The export is generated asynchronously.
Idempotency: If an export with matching content already exists (same case, same type, same content hash), the existing export is returned rather than creating a duplicate.
Poll GET /v1/exports/{type}/{id} until attributes.status is
ready or failed. Once ready, download via
GET /v1/exports/{type}/{id}/download.
| type required | string (ExportType) Value: "narrative" Export type identifier. |
required | object |
{- "data": {
- "type": "exports",
- "attributes": {
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a"
}
}
}{- "data": {
- "type": "exports",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "exportType": "narrative",
- "status": "pending",
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a",
- "version": 0,
- "contentHash": "string",
- "errorMessage": "string"
}
}
}Returns a paginated list of exports for the caller's organization,
optionally filtered by case. Results are ordered by createdAt
descending.
| type required | string (ExportType) Value: "narrative" Export type identifier. |
| page[cursor] | string Opaque cursor string from a previous response's |
| page[size] | integer [ 1 .. 100 ] Default: 20 Number of items per page (default 20, max 100). |
| filter[caseId] | string <uuid> Filter exports by case UUID. |
| filter[status] | string (ExportStatus) Enum: "pending" "ready" "failed" Filter exports by generation status. |
{- "data": [
- {
- "type": "exports",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "exportType": "narrative",
- "status": "pending",
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a",
- "version": 0,
- "contentHash": "string",
- "errorMessage": "string"
}
}
], - "meta": {
- "total": 0
}
}Returns the current status of an export. Poll this endpoint after
POST /v1/exports/{type} until attributes.status is ready or
failed. Recommended polling interval: 2–5 seconds.
| type required | string (ExportType) Value: "narrative" Export type identifier. |
| id required | string <uuid> UUID of the resource. |
{- "data": {
- "type": "exports",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "exportType": "narrative",
- "status": "pending",
- "caseId": "af51d69f-996a-4891-a745-aadfcdec225a",
- "version": 0,
- "contentHash": "string",
- "errorMessage": "string"
}
}
}Returns a short-lived pre-signed URL to download the generated export
file. Only available when attributes.status is ready. The URL
expires after 60 minutes.
| type required | string (ExportType) Value: "narrative" Export type identifier. |
| id required | string <uuid> UUID of the resource. |
{- "data": {
- "type": "export-downloads",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
}
}Returns all Lines of Business configured for the caller's organization. This list is typically small (< 10 items) and is not paginated.
{- "data": [
- {
- "type": "lines-of-business",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "name": "Commercial Property",
- "lobType": "property"
}
}
]
}Returns a single Line of Business by ID.
| id required | string <uuid> UUID of the resource. |
{- "data": {
- "type": "lines-of-business",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "attributes": {
- "createdAt": "2019-08-24T14:15:22Z",
- "updatedAt": "2019-08-24T14:15:22Z",
- "name": "Commercial Property",
- "lobType": "property"
}
}
}