openapi: 3.0.0 info: title: Factset Portfolio Reporting Batcher version: 0.3.0 description: >- The Portfolio Reporting Batcher (PRB) API allows clients to systematically leverage functionalities of the PRB application. With the initial release, clients can - trigger existing jobs - check status of running jobs - get various details of existing jobs license: name: Apache License, Version 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 contact: name: FactSet Research Systems url: https://developer.factset.com/contact email: api@factset.com servers: - url: https://api.factset.com/analytics/prb/v0 externalDocs: description: API Documentation url: https://developer.factset.com/api-catalog/portfolio-reporting-batcher-api paths: /jobs/{type}/{name}: parameters: - schema: $ref: '#/components/schemas/jobTypes' name: type in: path required: true description: The jobs type - schema: type: string name: name in: path required: true description: The jobs name get: summary: Factset Get details for the given PRB job tags: - Jobs responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/jobDetailsResponse' examples: PA: value: data: documents: my_task_1: - Client:/equity/long_short/my PA document my_task_2: - Client:/equity/long_short/my other PA document - Client:/equity/long_only/my PA document tasks: - my_task_1 - my_task_2 accounts: my_task_1: - portfolioId: client:/some_path/some_portfolio.actm isSplit: true includeParent: true level: '1' latestComponentsOnly: true my_task_2: - portfolioId: client:/some_other_path/some__other_portfolio.acct isSplit: true includeParent: true level: all latestComponentsOnly: true runs: - statusDescription: job has completed with success status: created prbStatus: success submitTime: '2019-08-24T14:15:22Z' startTime: '2019-08-24T14:15:22Z' endTime: '2019-08-24T14:15:22Z' runDuration: 0 isApiTriggered: true id: '565642' PD: value: data: documents: default: - Client:/equity/long_short/my document1 runs: - statusDescription: job has completed with success status: created prbStatus: success submitTime: '2019-08-24T14:15:22Z' startTime: '2019-08-24T14:15:22Z' endTime: '2019-08-24T14:15:22Z' runDuration: 1235 isApiTriggered: true id: '3456' PI: value: data: documents: my_task_1: - Client:/equity/long_short/my PA document tasks: - my_task_1 accounts: my_task_1: - portfolioId: client:/some_path/some_portfolio.actm runs: - statusDescription: job has completed with success status: created prbStatus: success submitTime: '2019-08-24T14:15:22Z' startTime: '2019-08-24T14:15:22Z' endTime: '2019-08-24T14:15:22Z' runDuration: 4567 isApiTriggered: true id: '1234' headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' X-FactSet-Api-RateLimit-Limit: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Limit' X-FactSet-Api-RateLimit-Remaining: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Remaining' X-FactSet-Api-RateLimit-Reset: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Reset' '400': description: Invalid post body parameters. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' X-FactSet-Api-RateLimit-Limit: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Limit' X-FactSet-Api-RateLimit-Remaining: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Remaining' X-FactSet-Api-RateLimit-Reset: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Reset' content: application/json: schema: $ref: '#/components/schemas/clientErrorResponse' '401': description: Missing or invalid authentication. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' '403': description: User is forbidden with current credentials headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' X-FactSet-Api-RateLimit-Limit: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Limit' X-FactSet-Api-RateLimit-Remaining: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Remaining' X-FactSet-Api-RateLimit-Reset: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Reset' '404': description: Not Found - invalid inputs content: application/json: schema: $ref: '#/components/schemas/clientErrorResponse' headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' X-FactSet-Api-RateLimit-Limit: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Limit' X-FactSet-Api-RateLimit-Remaining: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Remaining' X-FactSet-Api-RateLimit-Reset: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Reset' '429': description: >- Rate limit reached. Wait till the time specified in Retry-After header value to make further requests. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' Retry-After: description: >- Time to wait in seconds before making a new request as the rate limit has reached. schema: type: string '500': description: >- Server error. Log the X-DataDirect-Request-Key header to assist in troubleshooting. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' '503': description: Request timed out. Retry the request in sometime. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' operationId: getDetailsForJob parameters: - schema: type: array items: enum: - documents - tasks - accounts - runs type: string maxItems: 4 explode: false in: query name: attribute description: >- The attribute parameter accepts a list of the given enums, separated by commas. Each of them returns the respective data associated with the job. Runs returns the run history of the job. description: >- Use this endpoint to fetch the documents, tasks, accounts, and/or runs for the PRB job given in the path. Please note jobs with type PD will not return tasks nor accounts so this will be ignored if given as part of the array of attributes in the request. /runs: post: summary: Factset trigger PRB jobs operationId: startJobRun responses: '202': description: >- Expected response, the job has been accepted, please use /runs/{id}/status to poll status and check progress content: application/json: schema: $ref: '#/components/schemas/startJobRunResponse' examples: ADF: value: data: jobName: adf_multi_date jobType: ADF id: '123456' status: queued headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' X-FactSet-Api-RateLimit-Limit: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Limit' X-FactSet-Api-RateLimit-Remaining: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Remaining' X-FactSet-Api-RateLimit-Reset: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Reset' '400': description: Invalid post body parameters. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' X-FactSet-Api-RateLimit-Limit: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Limit' X-FactSet-Api-RateLimit-Remaining: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Remaining' X-FactSet-Api-RateLimit-Reset: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Reset' content: application/json: schema: $ref: '#/components/schemas/clientErrorResponse' '401': description: Missing or invalid authentication. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' '403': description: User is forbidden with current credentials headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' X-FactSet-Api-RateLimit-Limit: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Limit' X-FactSet-Api-RateLimit-Remaining: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Remaining' X-FactSet-Api-RateLimit-Reset: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Reset' '404': description: Not Found - invalid inputs content: application/json: schema: $ref: '#/components/schemas/clientErrorResponse' headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' X-FactSet-Api-RateLimit-Limit: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Limit' X-FactSet-Api-RateLimit-Remaining: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Remaining' X-FactSet-Api-RateLimit-Reset: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Reset' '429': description: >- Rate limit reached. Wait till the time specified in Retry-After header value to make further requests. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' Retry-After: description: >- Time to wait in seconds before making a new request as the rate limit has reached. schema: type: string '500': description: >- Server error. Log the X-DataDirect-Request-Key header to assist in troubleshooting. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' '503': description: Request timed out. Retry the request in sometime. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' description: Use this endpoint with with POST method to trigger PRB jobs. requestBody: content: application/json: schema: $ref: '#/components/schemas/startJobRoot' examples: ADF: value: data: jobType: ADF jobName: adf_multi_date overrides: dates: start: '2023-11-10' end: '2023-12-10' frequency: daily calendar: sevenDay runAsSerialNumber: '894550' PA: value: data: jobType: PA jobName: pa_multi_date overrides: tasks: - task_1 - task_2 runAsSerialNumber: '894550' PD: value: data: jobType: PD jobName: my_pd_job PI: value: data: jobType: PI jobName: my_pi_job overrides: runAsSerialNumber: '894550' PUB: value: data: jobType: PUB jobName: pub_run_daily overrides: runAsOfDate: '2023-02-05' runAsSerialNumber: '894550' Vault (No Overrides): value: data: jobType: vault jobName: vault_multi_date Vault (With Overrides): value: data: jobType: vault jobName: vault_multi_date overrides: combinations: - accounts: - CLIENT:/FPS/VAULTED_RETURNS/7DAYS_VLT.ACCT - CLIENT:/FPS/VAULTED_RETURNS/1MONTH.ACCT dates: - '2022-12-24' - '2022-12-23' description: >- The main object in the request body contains details for the job to be triggered. The "name" and "type" fields will uniquely identify the job and both must be provided. Other fields can be provided depending on the job's type. tags: - Runs /runs/{id}/status: get: summary: Factset check the status for a particular run ID tags: - Runs responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/idStatus' examples: ADF (With Overrides): value: data: status: queued prbStatus: pending statusDescription: string inputs: jobName: my_adf_job jobType: ADF overrides: dates: start: '2023-12-25' end: '2023-12-27' frequency: daily calendar: sevenDay runAsSerialNumber: '894550' id: '34578' PA (With Overrides): value: data: status: executing prbStatus: running statusDescription: string inputs: jobName: my_pa_job jobType: PA overrides: tasks: - task_1 - task_2 runAsSerialNumber: '894550' id: '123456' PD (With Overrides): value: data: status: executing prbStatus: running statusDescription: string inputs: jobName: my_pd_job jobType: PD overrides: runAsSerialNumber: '894550' id: '78904' PI: value: data: status: queued prbStatus: pending statusDescription: string inputs: jobName: my_pi_job jobType: PI id: '78904' PUB (With Overrides): value: data: status: queued prbStatus: pending statusDescription: string inputs: jobName: my_pub_job jobType: PUB overrides: runAsOfDate: '2023-02-05' id: '3456789' Vault (No Overrides): value: data: inputs: jobName: my_vault_job jobType: vault status: created prbStatus: success statusDescription: job has completed with success id: '123456' Vault (With Overrides): value: data: inputs: jobName: my_vault_job jobType: vault overrides: combinations: - accounts: - CLIENT:/FPS/VAULTED_RETURNS/7DAYS_VLT.ACCT - CLIENT:/FPS/VAULTED_RETURNS/1MONTH.ACCT dates: - '2022-12-24' - '2022-12-23' runAsSerialNumber: '894550' status: created prbStatus: success statusDescription: job has completed with success id: '123456' headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' X-FactSet-Api-RateLimit-Limit: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Limit' X-FactSet-Api-RateLimit-Remaining: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Remaining' X-FactSet-Api-RateLimit-Reset: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Reset' '401': description: Missing or invalid authentication. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' '403': description: User is forbidden with current credentials headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' X-FactSet-Api-RateLimit-Limit: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Limit' X-FactSet-Api-RateLimit-Remaining: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Remaining' X-FactSet-Api-RateLimit-Reset: $ref: '#/components/headers/X-FactSet-Api-RateLimit-Reset' '429': description: >- Rate limit reached. Wait till the time specified in Retry-After header value to make further requests. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' Retry-After: description: >- Time to wait in seconds before making a new request as the rate limit has reached. schema: type: string '500': description: >- Server error. Log the X-DataDirect-Request-Key header to assist in troubleshooting. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' '503': description: Request timed out. Retry the request in sometime. headers: X-DataDirect-Request-Key: $ref: '#/components/headers/X-DataDirect-Request-Key' X-FactSet-Api-Request-Key: $ref: '#/components/headers/X-FactSet-Api-Request-Key' operationId: checkRunStatus parameters: [] description: >- Use this endpoint to check the status of a run using the id from the POST /runs endpoint parameters: - schema: type: string example: '1013456' name: id in: path required: true description: run id components: schemas: accountsForJob: additionalProperties: description: >- An array of the details of the account/s under the task/s in the object key/s items: $ref: '#/components/schemas/accountsForJobAddProp' type: array description: Please note for PI jobs you will only see portfolioId example: my_task_1: - includeParent: true isSplit: true latestComponentsOnly: true level: string portfolioId: string title: accountsForJob type: object accountsForJobAddProp: description: The details of the account under the task in the object key properties: includeParent: description: >- Indicates whether or not the parent portfolio is included as a separate portfolio when isSplit is true nullable: true type: boolean isSplit: description: >- Indicates whether the portfolio's components if any would be treated as individual portfolios when the job is run nullable: true type: boolean latestComponentsOnly: description: >- When selected, the ACTM/CSTM will be split and will only return components that are still held in the ACTM. I.e., when the end date is "Latest," it will not return components where the end date occurs before Latest. nullable: true type: boolean level: description: >- The number of levels when isSplit is true that the job will expand down to for a composite portfolio (CSTM or ACTM). "1" means only the first level will be expanded. "all" will be the value if all levels are expanded down. nullable: true type: string portfolioId: description: The full file path including portfolio name and type type: string type: object calendar: default: fiveDay description: Used for ADF jobs only enum: - fiveDay - sevenDay example: fiveDay title: calendar type: string clientErrorResponse: description: The response schema for reporting errors properties: errors: description: List of errors items: $ref: '#/components/schemas/error' type: array type: object documentsForJob: additionalProperties: description: The tasks under each document items: type: string type: array description: >- Shows the documents for each job where relevant with a collection of tasks under each document example: my_task_1: - Client:/equity/long_short/my PA document my_task_2: - Client:/equity/long_only/my PA document - Client:/equity/long_short/my other PA document title: documentsForJob type: object error: description: Full details of any error properties: code: description: The error code type: string detail: description: Explanation specific to the occurrence of the error type: string id: description: Identifier for the error type: string source: $ref: '#/components/schemas/errorSource' title: description: The title of the error type: string type: object errorSource: description: The pointer and parameter of the error properties: parameter: description: Indicates which path or URI query parameter caused the error type: string pointer: description: Pointer to the associated entity in the request body type: string type: object frequency: default: daily description: >- Used for ADF job types only. Will determine the frequency between the start and end dates. enum: - daily - monthly - weekly type: string idStatus: description: >- Details about the instance of the job run specified via id wrapped in a data object properties: data: description: Details about the instance of the job run specified via id properties: id: description: The run ID type: string inputs: $ref: '#/components/schemas/startJob' prbStatus: $ref: '#/components/schemas/prbStatus' status: $ref: '#/components/schemas/status' statusDescription: $ref: '#/components/schemas/statusDescription' type: object type: object jobDetailsResponse: description: >- Provides the requested details for the specified job and if no attributes are provided, full details will be given properties: data: description: The main object in the jobDetailsResponse schema properties: accounts: $ref: '#/components/schemas/accountsForJob' documents: $ref: '#/components/schemas/documentsForJob' runs: description: An array of information for each run items: $ref: '#/components/schemas/runsForJob' type: array tasks: $ref: '#/components/schemas/tasksForJob' type: object title: jobDetailsResponse type: object jobOverrides: description: >- If this object is provided, the settings given here will override the default settings of the job for the job run (settings will only be used temporarily and no changes will be made to the default PRB job). Only certain objects can be used for certain job types. properties: calendar: $ref: '#/components/schemas/calendar' combinations: description: An array of date account combinations items: $ref: '#/components/schemas/jobOverridesCombinationsRoot' type: array dates: description: >- Used only for jobs where type is ADF. If using dates override, please provide both start date and end date. properties: end: description: The end date in format YYYY-MM-DD format: date type: string start: description: The start date in format YYYY-MM-DD format: date type: string type: object frequency: $ref: '#/components/schemas/frequency' runAsOfDate: description: PUB format: date type: string runAsSerialNumber: description: >- The FactSet serial number which has the credentials wanted to run the job type: string tasks: description: Used only for jobs where type is PA items: type: string type: array type: object jobOverridesCombinationsRoot: description: >- Used for Vault job type only. This creates a matrix of given accounts and dates. When the job is run, it will only run for the accounts and dates within this object. (Settings will only be used temporarily and no changes will be made to the default PRB job.) properties: accounts: description: An array of accounts items: type: string type: array dates: description: An array of dates items: format: date type: string type: array type: object jobTypes: description: >- PA - Portfolio Analysis, PUB - Publisher, ADF - Analytics DataFeed, PI - Portfolio Insight, PD - Portfolio Dashboard, Portfolio Vault - vault enum: - ADF - PA - PD - PI - PUB - vault example: vault title: jobTypes type: string prbStatus: description: The status of the job as per the application enum: - failed - pending - running - soft - stopped - success - warning example: running title: prbStatus type: string runsForJob: description: Provides full details of when the job has been run example: endTime: '2019-08-24T14:15:22Z' id: '2365478' isApiTriggered: true prbStatus: success runDuration: 6000 startTime: '2019-08-24T14:15:22Z' status: created statusDescription: job has completed with success submitTime: '2019-08-24T14:15:22Z' properties: endTime: description: The date and time the job was finished processing format: date-time type: string id: description: The ID of the run type: string isApiTriggered: description: Indicates whether the job was triggered via the PRB API type: boolean prbStatus: $ref: '#/components/schemas/prbStatus' runDuration: description: Number of seconds between startTime and endTime type: number startTime: description: >- The date and time the job started running after being submitted and potentially waiting in any queue format: date-time type: string status: $ref: '#/components/schemas/status' statusDescription: $ref: '#/components/schemas/statusDescription' submitTime: description: The date and time the job was submitted format: date-time type: string title: runsForJob type: object startJob: description: Details required to start a job example: jobName: my_pa_job overrides: runAsSerialNumber: '123456' tasks: - my_task_1 jobType: PA properties: jobName: description: The name of the PRB job type: string overrides: $ref: '#/components/schemas/jobOverrides' jobType: $ref: '#/components/schemas/jobTypes' required: - jobName - jobType title: startJob type: object startJobRoot: description: Details required to start the job wrapped in a data object properties: data: $ref: '#/components/schemas/startJob' type: object startJobRunResponse: description: Gives details about the run which was requested wrapped in a data object properties: data: description: The main object within the startJobRunResponse schema properties: id: description: >- The run ID for the job that has been triggered which is used in the /runs/{id}/status endpoint type: string jobName: description: Name of the job type: string maxLength: 29 status: $ref: '#/components/schemas/status' jobType: $ref: '#/components/schemas/jobTypes' required: - id - jobName - status - jobType type: object required: - data type: object status: description: The status of the job as per FactSets API standards enum: - cancelled - created - executing - failed - queued example: queued title: status type: string statusDescription: description: Further details on the job's status example: job has completed with success title: statusDescription type: string maxLength: 500 tasksForJob: description: A list of tasks for the given job example: - my_task_1 items: example: my_task_1 type: string title: tasksForJob type: array maxItems: 200 headers: X-DataDirect-Request-Key: description: FactSet's request key header. schema: type: string description: FactSet's request key header. X-FactSet-Api-Request-Key: description: >- Key to uniquely identify an Analytics API request. Only available after successful authentication. schema: type: string description: >- Key to uniquely identify an Analytics API request. Only available after successful authentication. X-FactSet-Api-RateLimit-Limit: description: Number of allowed requests for the time window. schema: type: string X-FactSet-Api-RateLimit-Remaining: description: Number of requests left for the time window. schema: type: string X-FactSet-Api-RateLimit-Reset: description: Number of seconds remaining till rate limit resets. schema: type: string requestBodies: {} responses: {} securitySchemes: FactSetApiKey: type: http scheme: basic FactSetOAuth2: type: oauth2 flows: clientCredentials: tokenUrl: https://auth.factset.com/as/token.oauth2 scopes: {} tags: - name: Jobs description: These endpoints relate to PRB jobs - name: Runs description: These endpoints refer to specific runs for a PRB job security: - FactSetApiKey: [] - FactSetOAuth2: []