openapi: 3.1.3 info: x-logo: url: https://s3.amazonaws.com/cdn.skyslope.com/forms/forms-logo-w-top-padding.png href: https://skyslope.com/ altText: SkySlope title: SkySlope Partnership API Reference Agents, Listings Libraries API version: 1.0.0 description: "# Introduction\n The SkySlope Forms API is organized around [REST](https://en.wikipedia.org/wiki/Representational_state_transfer).\n Our API has predictable resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses,\n and uses standard HTTP response codes, authentication, and verbs.

\n NOTE: Endpoints marked with an asterisk (*) will be available to our partners in the near future.\n # Authentication\n This API uses [OAuth 2.0 authorization code flow](https://www.oauth.com/oauth2-servers/server-side-apps/authorization-code/)\n to obtain an access token that can be used to authenticate subsequent API requests.\n ## Access Tokens\n ### Request\n To obtain an access token, first redirect the user to the authorization endpoint:\n ```\n https://accounts.skyslope.com/oauth2/authorize?\n response_type=code\n &client_id={YOUR_CLIENT_ID}\n &redirect_uri={YOUR_REDIRECT_URI}\n &scope=forms.files\n &state={RANDOM_STATE_VALUE}\n &code_challenge={CODE_CHALLENGE}\n &code_challenge_method=S256\n ```\n After the user authorizes your application, they'll be redirected back to your redirect URI with an authorization code.\n Exchange this code for an access token by making a POST request to the token endpoint:\n ```\n POST /oauth2/token HTTP/1.1\n Host: accounts.skyslope.com\n Content-Type: application/x-www-form-urlencoded\n \n grant_type=authorization_code\n &client_id={YOUR_CLIENT_ID}\n &client_secret={YOUR_CLIENT_SECRET}\n &code={AUTHORIZATION_CODE}\n &redirect_uri={YOUR_REDIRECT_URI}\n &code_verifier={CODE_VERIFIER}\n ```\n ### Usage\n Authentication to the API is performed by including your access token in the **Authorization** header of your\n API requests with the Bearer authentication scheme:\n ```\n GET /partner/api/files HTTP/1.1\n Host: forms.skyslope.com\n Authorization: Bearer {YOUR_ACCESS_TOKEN}\n ```\n All API requests must be made over [HTTPS](https://en.wikipedia.org/wiki/HTTPS). Calls made over plain HTTP will fail.\n API requests without authentication will also fail.\n ## Refresh Tokens\n Refresh tokens allow you to obtain new access tokens without requiring the user to re-authenticate. When you first\n complete the OAuth flow, you'll receive both an access token and a refresh token.\n ### Request\n To receive a refresh token, include the `offline_access` scope in your initial authorization request:\n ```\n https://accounts.skyslope.com/oauth2/authorize?\n response_type=code\n &client_id={YOUR_CLIENT_ID}\n &scope=forms.files offline_access\n &redirect_uri={YOUR_REDIRECT_URI}\n ```\n ### Usage\n When your access token expires, make a POST request to the token endpoint:\n ```\n POST /oauth2/token HTTP/1.1\n Host: accounts.skyslope.com\n Content-Type: application/x-www-form-urlencoded\n \n grant_type=refresh_token\n &client_id={YOUR_CLIENT_ID}\n &client_secret={YOUR_CLIENT_SECRET}\n &refresh_token={YOUR_REFRESH_TOKEN}\n ```\n This will return a new access token and refresh token pair.\n ### Security Best Practices\n - Store refresh tokens securely on your backend server, never on client side\n - Encrypt refresh tokens at rest using strong encryption\n - Rotate refresh token on each use\n - Set up monitoring for unusual refresh token usage patterns\n - If a refresh token is compromised, revoke it immediately using the token revocation endpoint\n - Implement automatic cleanup of unused refresh tokens" termsOfService: https://skyslope.com/terms-conditions/ contact: name: Support url: https://support.skyslope.com/hc/en-us email: support@skyslope.com servers: - url: https://forms.skyslope.com/partner/api description: Production server - url: https://staging-forms.skyslope.com/partner/api description: Staging server - url: https://integ-forms.skyslope.com/partner/api description: Integration server tags: - name: Libraries paths: /tags: get: summary: Get Form Tags tags: - Libraries description: 'Retrieve the tags that are associated with the forms.
REQUIRED SCOPES:
forms.forms.read
' parameters: - schema: type: string in: query name: ids required: false description: The form version ids to retrieve tags for. responses: '200': description: Default Response content: application/json: schema: type: object description: A response containing the tags. properties: totalRecords: type: number description: The total number of records. records: type: array description: An array of the tags. items: type: object properties: id: type: number description: The id of the tag. tags: type: object description: The tags object. additionalProperties: true example: totalRecords: 2 records: - id: 28576 tags: form-type: residential-purchase-contract - id: 29533 tags: gives-ds3-access: 'true' default: description: An object containing the error that occurred. content: application/json: schema: type: object description: An object containing the error that occurred. properties: code: type: string description: A code that represents the error that occurred. message: type: string description: A description of the error that occurred. errors: type: array description: An array of the errors that occurred. items: type: string traceId: type: string description: A request correlation ID. /libraries: get: summary: Get Libraries tags: - Libraries description: 'Retrieve the libraries that the user is authorized to access.
REQUIRED SCOPES:
forms.libraries.read
' responses: '200': description: Default Response content: application/json: schema: type: object required: - totalRecords - libraries properties: totalRecords: type: number description: The total number of authorized libraries. libraries: type: array items: type: object required: - id - name - regionCodes properties: id: type: integer description: Library id name: type: string description: Name of library regionCodes: type: array items: type: string description: Serving Regions description: An array of libraries the user is authorized to access. description: A response containing the authorized libraries for the user. example: totalRecords: 1 libraries: - id: 1551 name: Arizona Association of Realtors regionCodes: - US-AZ - US-CA default: description: An object containing the error that occurred. content: application/json: schema: type: object description: An object containing the error that occurred. properties: code: type: string description: A code that represents the error that occurred. message: type: string description: A description of the error that occurred. errors: type: array description: An array of the errors that occurred. items: type: string traceId: type: string description: A request correlation ID. /libraries/{libraryId}/form-versions: get: summary: Get Library Form Versions tags: - Libraries description: 'Retrieve the form versions for a specific library.
REQUIRED SCOPES:
forms.libraries.read
' parameters: - schema: type: integer minimum: 1 in: path name: libraryId required: true description: The id of the library to retrieve form versions for. responses: '200': description: Default Response content: application/json: schema: type: object required: - totalRecords - formVersions properties: totalRecords: type: number description: The total number of form versions. formVersions: type: array items: type: object required: - id - formId - name - attributes - publishedVersionId - thumbnailUrl properties: id: type: integer description: Form version id formId: type: integer description: A form has multiple versions, this is the id of the form that this version belongs to. name: type: string description: Form name attributes: type: object description: Dynamic attributes object containing form metadata. All attributes are optional and if present will be strings. additionalProperties: type: string publishedVersionId: type: integer description: In the case that a newer version is published, this will be the id of the newer version. thumbnailUrl: type: string description: URL to form thumbnail image description: An array of form versions from the specified library. description: A response containing the form versions for a specific library. example: totalRecords: 5 formVersions: - id: 36094 formId: 35345 name: Addendum Copy Test attributes: quickAction: delete publishedVersionId: 36094 thumbnailUrl: url-here - id: 36095 formId: 35931 name: BIC CAR TEST - FOO attributes: formType: BRBC publishedVersionId: 36095 thumbnailUrl: url-here - id: 41054 formId: 40355 name: BRBC - CRMLS testing attributes: formType: BRBC isCarBRBC: 'true' quickAction: BuyerAgreement hasStartDate: 'true' isCRMLSTracked: 'true' publishedVersionId: 41054 thumbnailUrl: url-here - id: 41063 formId: 40362 name: BRBC - CRMLS testing - no dates attributes: formType: BRBC isCarBRBC: 'true' quickAction: BuyerAgreement hasStartDate: 'true' isCRMLSTracked: 'true' downloadWithoutAddress: 'true' publishedVersionId: 41063 thumbnailUrl: url-here - id: 41046 formId: 39761 name: BRBC Buyer Representation And Broker Compensation Agreement - CAR attributes: formType: BRBC isCarBRBC: 'true' quickAction: BuyerAgreement QuickActions: BuyerAgreement hasStartDate: 'true' isCRMLSTracked: 'true' publishedVersionId: 41046 thumbnailUrl: url-here default: description: Default Response content: application/json: schema: type: object required: - code - message - errors - traceId properties: code: type: string description: A code that represents the error that occurred. message: type: string description: A description of the error that occurred. errors: type: array items: type: string description: An array of the errors that occurred. traceId: type: string description: A request correlation ID.