Skip to content
Staircase

Product

The registry that defines other products: their APIs, their flows, and the uniform endpoint surface every vertical inherits.

A product is created, deployed and documented through this registry. It holds the API definitions, the flow bindings, and the generated interface description each product publishes.

The uniform surface every mortgage vertical carries — request and response schema, the vendor ordering, invocation history, partner list, report templates — is defined once here rather than re-implemented per vertical.

How it works

Two products from different categories expose the same shape, so a caller that has integrated one has most of the work done for the next.

The registry that creates an API is the registry that can list them, so the catalogue is readable as data rather than only as a document.

Operations

APIs

POST /apis

Create API

create_api

Creates API with provided product ID and base path. Next steps are: create resources, create method, deploy the API

Request
application/json
{
  "product_identifier": "ed011136-4199-4efe-8ba1-71b6eb302744",
  "base_path": "product-product",
  "product_category": "Integration",
  "product_family": "Platform",
  "product_name": "Product"
}
Response
application/json

OK Response

{
  "api_id": "3f6eb765-459d-4a84-a985-620628e7a2cf",
  "product_identifier": "ed011136-4199-4efe-8ba1-71b6eb302744",
  "base_path": "credit"
}
Request bodyapplication/json
5 fields
FieldTypeDescription
product_identifierstring (uuid)Product ID.
base_pathstringBase path
product_categorystringProduct category from Staircase Ontology
product_familystringProduct family from Staircase Ontology
product_namestringProduct name from Staircase ontology
Response 201application/json
3 fields

OK Response

FieldTypeDescription
api_idstring (uuid)API ID
product_identifierstring (uuid)Product ID
base_pathstringBase path
Response 400application/json
1 fields

Request data failed validation

FieldTypeDescription
messageone ofMessage
Response 403application/json
1 fields

Missing API key

FieldTypeDescription
messagestringMessage
Response 409application/json
1 fields

Resource already exists.

FieldTypeDescription
messagestringError Message.
Response 422application/json
1 fields

Resource already exists.

FieldTypeDescription
messagestringError Message.
POST /apis/{product_identifier}/endpoints

Create Endpoint

create_endpoint

Create endpoint.

Create endpoint for API, that was created with specified product identifier. Endpoint contains two parts: it's public definition, that will be available and will be presented in OpenAPI file and integration with any Staircase API. When your endpoint will be invoked request parameters and body will be mapped according to your definition and request will be sent to specified Staircase API, same will happen with the response. To create valid integration you need to specify HTTP method that will be used for request in integration.http_method, url without domain name, f.e. /persistence/transactions in integration.url, request schema, if needed, in request_schema in JSON Schema format. Incoming requests will be validated against that schema and in case of invalid request your customer will receive response with status code 400 and error message in body. To map request parameters you need to fill integration.request_parameters parameter with an object, where keys are location where to put them for request to Staircase service in format {location}.{name} where location is querystring , path , or header and name is a valid and unique parameter name and values are static value or, if you want to map them from the request, value should match patter request.{location}.{name} where location is querystring , path , or header and name must be a valid and unique method request parameter name. To map request body you need to specify integration.request_template in format of VTL template. VTL is simple template language, you can find information about all possibilities here. Basic examples can be found in request examples for this endpoint. Inside template, you will be to access two variables: $input and $util. The $input variable represents the method request payload and parameters to be processed by a mapping template. It provides four functions:

Show the rest
Variable and function Description
$input.body Returns the raw request payload as a string.
$input.json(x) This function evaluates a JSONPath expression and returns the results as a JSON string. For example, $input.json('$.pets') returns a JSON string representing the pets structure. For more information about JSONPath, see JSONPath
$input.params Returns a map of all the request parameters. We recommend that you use $util.escapeJavaScript to sanitize the result to avoid a potential injection attack. For full control of request sanitization, use a proxy integration without a template and handle request sanitization in your integration.
$input.params(x) Returns the value of a method request parameter from the path, query string, or header value (searched in that order), given a parameter name string x. We recommend that you use $util.escapeJavaScript to sanitize the parameter to avoid a potential injection attack. For full control of parameter sanitization, use a proxy integration without a template and handle request sanitization in your integration.
$input.path(x) Takes a JSONPath expression string (x) and returns a JSON object representation of the result. This allows you to access and manipulate elements of the payload natively in Apache Velocity Template Language (VTL).

$input Variable template examples

Parameter mapping template example

The following parameter-mapping example passes all parameters, including path, querystring, and header, through to the integration endpoint via a JSON payload:

#set($allParams = $input.params)
{
 "params" : {
 #foreach($type in $allParams.keySet)
 #set($params = $allParams.get($type))
 "$type" : {
 #foreach($paramName in $params.keySet)
 "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
 #if($foreach.hasNext),#end
 #end
 }
 #if($foreach.hasNext),#end
 #end
 }
}

In effect, this mapping template outputs all the request parameters in the payload as outlined as follows:

{
 "params" : {
 "path" : { 
 "path_name" : "path_value", 
 ...
 }
 "header" : { 
 "header_name" : "header_value",
 ...
 }
 "querystring" : {
 "querystring_name" : "querystring_value",
 ...
 }
 }
}
Example JSON mapping template using $input

The following example shows how to use a mapping to read a name from the query string and then include the entire POST body in an element:

{
 "name" : "$input.params('name')",
 "body" : $input.json('$') 
}

If the JSON input contains unescaped characters that cannot be parsed by JavaScript, a 400 response may be returned. Applying $util.escapeJavaScript($input.json('$')) above will ensure that the JSON input can be parsed properly.

Example mapping template using $input

The following example shows how to pass a JSONPath expression to the json method. You could also read a specific property of your request body object by using a period (.), followed by your property name:

{
 "name" : "$input.params('name')",
 "body" : $input.json('$.mykey') 
}

If a method request payload contains unescaped characters that cannot be parsed by JavaScript, you may get 400 response. In this case, you need to call $util.escapeJavaScript function in the mapping template, as shown as follows:

{
 "name" : "$input.params('name')",
 "body" : $util.escapeJavaScript($input.json('$.mykey')) 
}
Example request and response using $input

Request template

Resource: /things/{id}

With input template:
{
 "id" : "$input.params('id')",
 "count" : "$input.path('$.things').size",
 "things" : $util.escapeJavaScript($input.json('$.things'))
}

POST /things/abc
{
 "things" : {
 "1" : {},
 "2" : {},
 "3" : {}
 }
}

Response:

{
 "id": "abc",
 "count": "3",
 "things": {
 "1": {},
 "2": {},
 "3": {}
 }
}

$util Variables

Function Description
$util.escapeJavaScript Escapes the characters in a string using JavaScript string rules. Note: This function will turn any regular single quotes (') into escaped ones ('). However, the escaped single quotes are not valid in JSON. Thus, when the output from this function is used in a JSON property, you must turn any escaped single quotes (') back to regular single quotes ('). This is shown in the following example: $util.escapeJavaScript(data).replaceAll("\\'","'")
$util.parseJson Takes "stringified" JSON and returns an object representation of the result. You can use the result from this function to access and manipulate elements of the payload natively in Apache Velocity Template Language (VTL). For example, if you have the following payload: {"errorMessage":"{\"key1\":\"var1\",\"key2\":{\"arr\":[1,2,3]}}"} and use the following mapping template #set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage'))) { "errorMessageObjKey2ArrVal" : $errorMessageObj.key2.arr[0] } You will get the following output: {"errorMessageObjKey2ArrVal": 1}
$util.urlEncode Converts a string into "application/x-www-form-urlencoded" format.
$util.urlDecode Decodes an "application/x-www-form-urlencoded" string.
$util.base64Encode $util.base64Encode
$util.base64Decode Decodes the data from a base64-encoded string.
Request
application/json

POST request with request body

{
  "path": "/loans",
  "http_method": "POST",
  "product_api_identifiers": [
    "5b3b5eb4-f32f-487f-9969-2a9b0ddef89e",
    "e37b044f-b992-4c23-b588-1c34dbb3008b"
  ],
  "product_component": "Loans",
  "product_endpoint": "Create loan",
  "product_sequence": 1,
  "operation_id": "create_loan",
  "description": "Create Loan",
  "example": {
    "loan_label": "foo"
  },
  "request_schema": {
    "type": "object",
    "properties": {
      "loan_label": {
        "type": "string"
      }
    },
    "required": [
      "loan_label"
    ],
    "additionalProperties": false
  },
  "integration": {
    "http_method": "POST",
    "url": "/persistence/transactions",
    "request_template": "{\"label\": \"$input.path('$.loan_label')\"}",
    "responses": {
      "201": {
        "documentation": {
          "description": "Loan created.",
          "example": {
            "loan_label": "foo",
            "loan_id": "01GKF9A4QZ79RSCMJ041HEZSMK"
          }
        },
        "schema": {
          "type": "object",
          "properties": {
            "loan_label": {
              "type": "string"
            },
            "loan_id": {
              "type": "string"
            }
          }
        },
        "response_template": "#set($inputRoot = $input.path('$'))\n{\n  \"loan_label\": \"$inputRoot.label\",\n  \"loan_id\": \"$inputRoot.transaction_id\"\n}\n"
      }
    }
  }
}
Response
application/json

OK Response

{
  "product_identifier": "ed011136-4199-4efe-8ba1-71b6eb302744",
  "path": "/loans",
  "http_method": "POST"
}
Parameters
1
ParameterTypeExampleDescription
product_identifier required string (uuid) path foo Product ID
Request bodyapplication/json
12 fields
FieldTypeDescription
pathrequiredstringPath of your endpoint. Have to start with '/'
http_methodrequiredstringHTTP method of your endpoint.DELETEGETPATCHPOSTPUT
operation_idrequiredstringOperation id of your endpoint. Used for OpenAPI generation.
request_schemaobjectRequest schema
product_api_identifiersrequiredstring[]Product API identifiers
product_componentrequiredstringProduct component
product_endpointrequiredstringProduct endpoint
product_sequencerequiredintegerProduct sequence for Site product
descriptionstringDescription
exampleobjectRequest body example
parametersobject[]Description and examples for path/query/headers parameters
inrequiredstringLocation, where your parameters is presented.headerpathquery
namerequiredstringName of your parameter
schemarequiredobjectJSON schema of your parameter
typerequiredstringData type of your parameterbooleanintegernumberstring
examplerequiredstringExample of your parameter
integrationrequiredobjectYour integration information
http_methodstringHTTP method of request your API will make to Staircase API
urlstringURL part without domain name of request your API will make to Staircase API
request_templatestringVTL request template that defines request body of request your API will make to Staircase API
request_parametersstringMapping between path/query/header parameters from request that your API receives to the Staircase API
responsesobjectInformation about processing responses from Staircase API, that you call. Key has to be status code, that will process.
Response 201application/json
3 fields

OK Response

FieldTypeDescription
product_identifierstring (uuid)Product ID
pathstring (string)path
http_methodstringmethod
Response 400application/json
1 fields

Request data failed validation

FieldTypeDescription
messageone ofMessage
Response 403application/json
1 fields

Missing API key

FieldTypeDescription
messagestringMessage
Response 404application/json
1 fields

Requested resource is not found

FieldTypeDescription
messagestringMessage
GET /apis

List APIs [new]

list_apis

List APIs

List APIs. Response may not have APIs but contains next_token. That means that there are results on next pages

Response
application/json

OK Response

{
  "next_token": "7b22504b223a2022666f6f222c2022534b223a2022626172227d",
  "apis": [
    {
      "product_identifier": "ed011136-4199-4efe-8ba1-71b6eb302744",
      "base_path": "product-product",
      "is_deployed": true
    },
    {
      "product_identifier": "0206ce61-ed46-492d-98be-9d7f5f166e7d",
      "base_path": "foo/bar",
      "is_deployed": false
    }
  ]
}
Parameters
2
ParameterTypeExampleDescription
next_token string query 31132629274945519779805322857203735586714454643391594505 Next token for pagination
limit integer query 5 Items limit
Response 200application/json
2 fields

OK Response

FieldTypeDescription
next_tokenstringPagination token
apisobject[]APIs
product_identifierstring (uuid)Product ID
base_pathstringBase path
is_deployedbooleanIndicator if API was deployed at least once
Response 400application/json
1 fields

Request data failed validation

FieldTypeDescription
messageone ofMessage
Response 403application/json
1 fields

Missing API key

FieldTypeDescription
messagestringMessage
Response 404application/json
1 fields

Requested resource is not found

FieldTypeDescription
messagestringMessage
POST /apis/{product_identifier}/deploy

Deploy API

deploy_api

Deploys your API with specified product identifier. Deployed changes will be available in few minutes after deployment

Response
application/json

OK Response

{
  "product_identifier": "ed011136-4199-4efe-8ba1-71b6eb302744",
  "status": "DEPLOY_IN_PROGRESS"
}
Parameters
1
ParameterTypeExampleDescription
product_identifier required string (uuid) path foo Product ID
Response 200application/json
2 fields

OK Response

FieldTypeDescription
product_identifierstring (uuid)Product ID
statusstringStatus
Response 400application/json
1 fields

Request data failed validation

FieldTypeDescription
messageone ofMessage
Response 403application/json
1 fields

Missing API key

FieldTypeDescription
messagestringMessage
Response 404application/json
1 fields

Requested resource is not found

FieldTypeDescription
messagestringMessage
Response 429application/json
1 fields

Too many requests.

FieldTypeDescription
messagestringError Message.
GET /apis/{product_identifier}/openapi

Retrieve OpenAPI

get_openapi

Retrieve OpenAPI of deployment API. Changes that are not deployed will not be presented in the OpenAPI.

Response
application/json

OK Response

{}
Parameters
1
ParameterTypeExampleDescription
product_identifier required string (uuid) path foo Product ID
Response 400application/json
1 fields

Request data failed validation

FieldTypeDescription
messageone ofMessage
Response 403application/json
1 fields

Missing API key

FieldTypeDescription
messagestringMessage
Response 404application/json
1 fields

Requested resource is not found

FieldTypeDescription
messagestringMessage
Other responses

200

GET /apis/{product_identifier}/logs

Retrieve Logs

get_logs

Retrieve list of API invocations logs.

Response
application/json

OK Response

{
  "logs": [
    {
      "log_id": "05a50ea791fe0795d12a6745d010946f",
      "last_event_datetime": "2022-12-16T12:53:15.686298"
    }
  ]
}
Parameters
3
ParameterTypeExampleDescription
product_identifier required string (uuid) path foo Product ID
next_token string query 31132629274945519779805322857203735586714454643391594505 Next token for pagination
limit integer query 5 Items limit
Response 200application/json
2 fields

OK Response

FieldTypeDescription
next_tokenstringPagination token
logsobject[]Logs
log_idstringLog ID
last_event_datetimestring (date-time)Last event date time
Response 400application/json
1 fields

Request data failed validation

FieldTypeDescription
messageone ofMessage
Response 403application/json
1 fields

Missing API key

FieldTypeDescription
messagestringMessage
Response 404application/json
1 fields

Requested resource is not found

FieldTypeDescription
messagestringMessage
GET /apis/{product_identifier}/logs/{log_id}

Retrieve Log Events

get_log

Retrieve Logs

Retrieve log events.

Response
application/json

OK Response

{
  "events": [
    {
      "timestamp": "2022-12-16T10:33:29.067",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Extended Request Id: dOwF8HWWoAMF4BQ="
    },
    {
      "timestamp": "2022-12-16T10:33:29.068",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Verifying Usage Plan for request: 8f575720-12c8-46e3-93dd-315bca0e4d42. API Key: ******************************0300c8 API Stage: 4g92h4obi0/api"
    },
    {
      "timestamp": "2022-12-16T10:33:29.070",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Usage Plan check succeeded for API Key ******************************0300c8 and API Stage 4g92h4obi0/api"
    },
    {
      "timestamp": "2022-12-16T10:33:29.070",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Starting execution for request: 8f575720-12c8-46e3-93dd-315bca0e4d42"
    },
    {
      "timestamp": "2022-12-16T10:33:29.070",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) HTTP Method: POST, Resource Path: /c757967a-c988-4119-b857-1f4691508d02/loans"
    },
    {
      "timestamp": "2022-12-16T10:33:29.070",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) API Key: ******************************0300c8"
    },
    {
      "timestamp": "2022-12-16T10:33:29.070",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) API Key ID: 2i75ejp0oa"
    },
    {
      "timestamp": "2022-12-16T10:33:29.070",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Method request path: {}"
    },
    {
      "timestamp": "2022-12-16T10:33:29.070",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Method request query string: {}"
    },
    {
      "timestamp": "2022-12-16T10:33:29.070",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Method request headers: {x-api-key=******************************0300c8, User-Agent=python-requests/2.28.1, X-Forwarded-Proto=https, X-Amz-Cf-Id=KbOkVNYF-kYDISmt1P2Np-Wlp6qIpxzKN5xbB0hk6CTWGZbFRrvuXw==, X-Forwarded-For=74.91.0.55, 15.158.35.43, content-type=application/json, Host=persistence.staircaseapi.com, X-Forwarded-Port=443, accept-encoding=gzip, deflate, X-Amzn-Trace-Id=Root=1-639c2d59-2293811d029398d96147cf54, accept=*/*, via=1.1 008cd6752eb718142dfefe2f7e847982.cloudfront.net (CloudFront)}"
    },
    {
      "timestamp": "2022-12-16T10:33:29.070",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Method request body before transformations: {\"loan_label\": \"foo\"}"
    },
    {
      "timestamp": "2022-12-16T10:33:29.070",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Request validation succeeded for content type application/json"
    },
    {
      "timestamp": "2022-12-16T10:33:29.074",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Endpoint request URI: https://persistence.staircaseapi.com/persistence/transactions"
    },
    {
      "timestamp": "2022-12-16T10:33:29.074",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Endpoint request headers: {x-amzn-apigateway-api-id=4g92h4obi0, Accept=application/json, x-api-key=******************************0300c8, User-Agent=AmazonAPIGateway_4g92h4obi0, X-Amzn-Trace-Id=Root=1-639c2d59-2293811d029398d96147cf54, Content-Type=application/json}"
    },
    {
      "timestamp": "2022-12-16T10:33:29.074",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Endpoint request body after transformations: {\"label\": \"foo\"}"
    },
    {
      "timestamp": "2022-12-16T10:33:29.074",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Sending request to https://persistence.staircaseapi.com/persistence/transactions"
    },
    {
      "timestamp": "2022-12-16T10:33:32.561",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Received response. Status: 201, Integration latency: 3487 ms"
    },
    {
      "timestamp": "2022-12-16T10:33:32.561",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Endpoint response headers: {Content-Type=application/json, Content-Length=245, Connection=keep-alive, Date=Fri, 16 Dec 2022 08:33:32 GMT, x-amzn-RequestId=4eb2676a-9f6d-4a71-abd3-8d51ab2075fd, access-control-allow-origin=*, strict-transport-security=max-age=31536000; includeSubDomains; preload, access-control-allow-headers=Authorization,Content-Type,X-Amz-Date,X-Amz-Security-Token,X-Api-Key, x-amz-apigw-id=dOwF9ELkIAMFUtw=, X-Amzn-Trace-Id=Root=1-639c2d59-2293811d029398d96147cf54;Sampled=1, X-Cache=Miss from cloudfront, Via=1.1 640e1fde1214554c9f15c8cb85df826a.cloudfront.net (CloudFront), X-Amz-Cf-Pop=IAD55-P2, X-Amz-Cf-Id=ybYqTc-fhx_uPoQPcRLyd0VofrIirq_NFEEAWNjOmrOPpusYN4HNsw==}"
    },
    {
      "timestamp": "2022-12-16T10:33:32.561",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Endpoint response body before transformations: {\"label\": \"foo\",\"created_at\": \"2022-12-16T03:33:32.498711-05:00\",\"transaction_id\": \"01GMD12CAJ5FCV4SW837WCJZ2Y\",\"_links\": {\"collections\": \"https://persistence.staircaseapi.com/persistence/transactions/01GMD12CAJ5FCV4SW837WCJZ2Y/collections\"}}"
    },
    {
      "timestamp": "2022-12-16T10:33:32.561",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Method response body after transformations: {\"loan_label\": \"foo\",\"loan_id\": \"01GMD12CAJ5FCV4SW837WCJZ2Y\"}"
    },
    {
      "timestamp": "2022-12-16T10:33:32.562",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Method response headers: {X-Amzn-Trace-Id=Root=1-639c2d59-2293811d029398d96147cf54;Sampled=1, Access-Control-Allow-Headers=Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent, Access-Control-Allow-Origin=*, Access-Control-Allow-Methods=GET,DELETE,OPTIONS,PATCH,POST,PUT, Strict-Transport-Security=max-age=31536000; includeSubDomains; preload, Content-Type=application/json}"
    },
    {
      "timestamp": "2022-12-16T10:33:32.562",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Successfully completed execution"
    },
    {
      "timestamp": "2022-12-16T10:33:32.562",
      "message": "(8f575720-12c8-46e3-93dd-315bca0e4d42) Method completed with status: 201"
    }
  ]
}
Parameters
4
ParameterTypeExampleDescription
product_identifier required string (uuid) path foo Product ID
log_id required string path 05a50ea791fe0795d12a6745d010946f Log ID
next_token string query 31132629274945519779805322857203735586714454643391594505 Next token for pagination
limit integer query 5 Items limit
Response 200application/json
2 fields

OK Response

FieldTypeDescription
next_tokenstringPagination token
eventsEvents
Response 400application/json
1 fields

Request data failed validation

FieldTypeDescription
messageone ofMessage
Response 403application/json
1 fields

Missing API key

FieldTypeDescription
messagestringMessage
Response 404application/json
1 fields

Requested resource is not found

FieldTypeDescription
messagestringMessage
DELETE /apis/{product_identifier}

Delete API

delete_api

Delete API.

Service deletes the API and all the endpoints of this API.

Response
application/json

Request data failed validation

{
  "message": "{'data': ['Missing data for required field.']}"
}
Parameters
1
ParameterTypeExampleDescription
product_identifier required string (uuid) path b1e98e0e-adnf-4cdd-b065-16feb5493049 Product ID
Response 400application/json
1 fields

Request data failed validation

FieldTypeDescription
messageone ofMessage
Response 403application/json
1 fields

Missing API key

FieldTypeDescription
messagestringMessage
Response 404application/json
1 fields

Requested resource is not found

FieldTypeDescription
messagestringMessage
Response 429application/json
1 fields

Too many requests.

FieldTypeDescription
messagestringError Message.
Other responses

204

Api Examples

POST /apis-examples/subsets

Generate Subset

generate_subset

Extract the part of the JSON data by the provided api schema definition in Lexicon format.

Request
application/json
{
  "api_data_example": {
    "foo": [
      {
        "bar1": "baz1"
      },
      {
        "bar2": "baz2"
      }
    ],
    "bar": {
      "biz": "baz",
      "booz": "baz"
    }
  },
  "root_schema_fields": [
    "foo_schema_id",
    "bar_schema_id"
  ],
  "all_schema_fields": [
    {
      "@id": "foo_schema_id",
      "@type": "api_schema",
      "name": "foo",
      "requirement_indicator": true,
      "has_graph_entity": "01H28AB7BRQ066FJCHXEN1SW7T",
      "has_api_schema_field": [
        "bar1_schema_id"
      ]
    },
    {
      "@id": "bar1_schema_id",
      "@type": "api_schema",
      "name": "bar1",
      "requirement_indicator": false,
      "has_graph_entity": "01H28AB7BRGBRJDC3CD7Y3S0C7"
    },
    {
      "@id": "bar_schema_id",
      "@type": "api_schema",
      "name": "bar",
      "requirement_indicator": true,
      "has_graph_entity": "01H28AB7BRQ066FJCHXEN1SW7O",
      "has_api_schema_field": [
        "booz_schema_id"
      ]
    },
    {
      "@id": "booz_schema_id",
      "@type": "api_schema",
      "name": "booz",
      "requirement_indicator": false,
      "has_graph_entity": "01H28AB7BRGBRJDC3CD7Y3S0C7"
    }
  ]
}
Response
application/json

Created item successfully

{
  "example_data_subset": {
    "foo": [
      {
        "bar1": "baz1"
      }
    ],
    "bar": {
      "booz": "baz"
    }
  }
}
Request bodyapplication/json
3 fields
FieldTypeDescription
api_data_examplerequiredone ofThe complete JSON data to be processed.
root_schema_fieldsrequiredstring[]The @id-s of the root data children datapoints.
all_schema_fieldsrequiredobject[]The api schema definition in `Lexicon` format.
namerequiredstringData property name.
has_api_schema_fieldsstring[]JSON-LD @id-s of the schema definitions for the child data points.
Response 201application/json
1 fields

Created item successfully

FieldTypeDescription
example_data_subsetone ofGenerated subset of the API example data.
Response 400application/json
2 fields

Request data failed validation

FieldTypeDescription
detailedMessagestringMessage
codestringCode
Response 403application/json
1 fields

Missing API key

FieldTypeDescription
messagestringMessage

Loans

POST /loans

Create loan

Create Loan

Request
application/json
{
  "loan_label": "foo"
}
Response
application/json

Loan created.

{
  "loan_label": "foo",
  "loan_id": "01GKF9A4QZ79RSCMJ041HEZSMK"
}
Parameters
1
ParameterTypeDescription
x-api-key required string header
Request bodyapplication/json
1 fields
FieldTypeDescription
loan_labelrequiredstring
Response 201application/json
2 fields

Loan created.

FieldTypeDescription
loan_labelstring
loan_idstring

Operations

GET /{product}/connector-configurations

Retrieve Connector Configurations

retrieve-connector-configurations

Retrieve the all connector configurations for the given product. The configuration field can be passed as a path parameter the /setups endpoint.

Response
application/json

Connector Configurations Found

[
  {
    "configuration": "test",
    "partners": [
      {
        "partner": "plaid"
      },
      {
        "partner": "finicity"
      }
    ]
  },
  {
    "configuration": "production",
    "partners": [
      {
        "partner": "plaid"
      },
      {
        "partner": "finicity"
      }
    ]
  }
]
Parameters
1
ParameterTypeDescription
product required string path Staircase product name
Response 200application/json
2 fields

Connector Configurations Found

FieldTypeDescription
configurationstringName of the configuration. Can be passed into the /setups endpoint.
partnersobject[]An array of vendors associated with the configuration
partnerstringName of the vendor
Response 403application/json
2 fields

Invalid key for service

FieldTypeDescription
messagestring
urlstring
Response 404application/json
1 fields

Connector configuration not found

FieldTypeDescription
messagestringMessage
Other responses

400

POST /{product}/connector-configurations/{configuration}/setups

Set up Connector Configuration

setup-connector-configuration

Set up a connector configuration by passing product and configuration name. You can check the type of configurations by using the GET /connector-configurations endpoint.

Response
application/json

Configuration set up successfully

{
  "message": "Configuration is set up successfully."
}
Parameters
2
ParameterTypeDescription
product required string path Staircase product name
configuration required string path Product configuration name
Response 200application/json
1 fields

Configuration set up successfully

FieldTypeDescription
messagestringMessage
Response 403application/json
2 fields

Invalid key for service

FieldTypeDescription
messagestring
urlstring
Response 404application/json
1 fields

Resource not found

FieldTypeDescription
messagestringMessage
Other responses

400

POST /build

Build payload

Build a payload for collections, where the pathes can be taken from appropriate endpoint. Values, that are passed is validated against the JSON schema.

Request
application/json
{
  "$.deal_sets[0].parties[0].individual.first_name": "Mykyta",
  "$.deal_sets[0].parties[0].roles[0].party_type": "Borrower",
  "$.deal_sets[0].parties[0].roles[0].employers[0].legal_entity_name": "Truework Inc",
  "$.deal_sets[0].parties[0].taxpayer_identifiers[0].value": "999-00-0000"
}
Response
application/json

200 response

{
  "deal_sets": {
    "deal_set": [
      {
        "deals": {
          "deal": [
            {
              "parties": {
                "party": [
                  {
                    "individual": {
                      "name": "Mykyta"
                    },
                    "roles": {
                      "role": [
                        {
                          "role_detail": {
                            "party_type": "Borrower"
                          },
                          "borrower": {
                            "employers": {
                              "employer": [
                                {
                                  "legal_entity": {
                                    "legal_entity_detail": {
                                      "full_name": "Truework Inc"
                                    }
                                  }
                                }
                              ]
                            }
                          }
                        }
                      ]
                    },
                    "taxpayer_identifiers": {
                      "taxpayer_identifier": [
                        {
                          "type": "EmployerIdentificationNumber",
                          "value": "999-00-0000"
                        }
                      ]
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    ]
  }
}
Other responses

200

POST /hello-world

Hello World

Dummy hello world endpoint

Other responses

200

GET /loans/{loan_id}
Response
application/json

Loan

{
  "loan_label": "foo",
  "loan_id": "01GKF9A4QZ79RSCMJ041HEZSMK",
  "created_at": "2022-12-04T21:23:54"
}
Parameters
2
ParameterTypeExampleDescription
x-api-key required string header
loan_id required string path 01GKKGSG9NHCTP1XM8W4W833QD
Response 200application/json
3 fields

Loan

FieldTypeDescription
loan_labelstringLoan label.
loan_idstringLoan ID.
created_atstring (datetime)Loan created at.
Response 404application/json
1 fields

Not found

FieldTypeDescription
messagestringError message.
GET /schema

Retrieve part of staircase json schema by json path

returns the schema for specified JSON path, that it is used for payload validation

Response
application/json

200 response

{
  "type": "string",
  "description": "An identifier for the current instance of VIEW. The party assigning the identifier should be provided using the IdentifierOwnerURI."
}
Parameters
1
ParameterTypeExampleDescription
json_path required string query $.deal_sets[0].parties[0].individual.first_name
Other responses

200

POST /sdks

Generate SDK for the specific service

Using input link to swagger and request details generate SDK for the service

Request bodyapplication/json
4 fields
FieldTypeDescription
service_namestringName of service for which sdk need to be generated
swagger_linkstringLink to swagger (OpenAPI) json file which need to be used for SDK generation
programming_languagestringProgramming language for which we need to generate SDK
service_versionstringVersion of service
Response 201application/json
3 fields

SDK generated successfully

FieldTypeDescription
messagestringStatus message of SDK generation process
successbooleanDoes operation generate SDK
generated_sdk_urlstringURL to generated SDK on s3 bucket
Response 400application/json
2 fields

Bad request body

FieldTypeDescription
error_messagestringShort error reason message
error_descriptionstringLong description of error cause
Response 409application/json
3 fields

SDK with provided parameters already exist

FieldTypeDescription
messagestringStatus message of SDK generation process
successbooleanDoes operation generate SDK
generated_sdk_urlstringURL to generated SDK on s3 bucket
DELETE /sdks/{programming_language}/{service_name}

Delete existing SDK with service_version bucket

Delete SDK inside service_version bucket and this bucket itself

Parameters
3
ParameterTypeDescription
programming_language required string path SDK client language
service_name required string path Name of service
service_version required string query The version of service for which we need delete SDK
Response 200application/json
2 fields

SDK and service_version bucket was deleted successfully

FieldTypeDescription
successbooleanShow the success status of deletion process
descriptionstringShort description message of success status
Response 404application/json
2 fields

Not found any SDK's related to requested parameters

FieldTypeDescription
successbooleanShow the success status of deletion process
descriptionstringShort description message of success status
Other responses

400

GET /sdks/{programming_language}/{service_name}

Get S3 bucket url's to SDK's for reuqested parameters

Get all existing S3 bucket url's to SDK's for the requested programming language , service name and version

Parameters
3
ParameterTypeDescription
programming_language required string path Name of programming language for which we need to download SDK
service_name required string path Name of service for the requested SDK
service_version string query Version of service
Response 200multipart/form-data
2 fields

Found SDK's for the requested parameters

FieldTypeDescription
sdk_versionstringVersion of service SDK
generated_sdk_urlstringURL of generated SDK to S3 bucket
Other responses

404

POST /validate

Validate OpenAPI file

Request bodyapplication/json
1 fields
FieldTypeDescription
urlstringurl to swagger file
Response 400application/json
1 fields

Validator found some errors

FieldTypeDescription
errorsobject[]
error_typestring
messagestring
Other responses

200

POST /validate/{language}

Validate element

validate_element

Parameters
2
ParameterTypeDescription
x-api-key required string header API key
language required string path Language name
Request bodyapplication/json
2 fields
FieldTypeDescription
valuesobject
element_typestring
Response 200application/json
2 fields

Element is valid

FieldTypeDescription
valuesobject
element_typestring
Response 400application/json
1 fields

Validation failed

FieldTypeDescription
errorsobject[]
error_typestring
messagestring

Errors

400403404409422429

Type to search.