openapi: 3.1.0 info: title: ACES ETF OrderApprovalAPI version: '1.0' description: >- The ACES ETF Order Approval API receives order action requests from Citi ETF Sponsor clients. x-ibm-name: aces-order-approval contact: name: ACES L2 Support Team email: funds.l2productionsupport@imceu.eu.ssmb.com security: - Authorization: [] tags: - name: submitAction description: Operations related to ETF Order Approval processing servers: - url: https://sit.b2b.tts.icgservices.citi.com/tts description: SIT Environment URL - url: https://qa.b2b.tts.icgservices.citi.com/tts description: QA Environment URL - url: https://uat.b2b.tts.icgservices.citi.com/tts description: UAT Environment URL - url: https://tts.sandbox.apib2b.citi.com/tts description: CTE Environment URL paths: /etf/api/v1/order/submitAction: post: tags: - submitAction description: >- Posts an action request - Approve, Reject, or Cancel, allowing a PM/CM/D to approve or reject orders on the ACES Dealing Portal. operationId: submitAction summary: Request action on an order. parameters: - name: Content-Type in: header description: Supports \"application/json\". required: true schema: type: string - name: Authorization in: header description: The OAuth Token prefixed with "Bearer" and space in between. required: true schema: type: string - name: client_id in: query required: true description: >- This is your unique identifier shared during your CitiConnect API onboarding. This is the same `client_id` used for oauth token generation schema: type: string requestBody: description: Order Submit Action Object content: application/json: schema: $ref: '#/components/schemas/submitAction' responses: '200': description: OK. Returns a confirmation of the action submission. content: application/json: schema: $ref: '#/components/schemas/ackResponse' '400': description: Bad Request Error content: application/json: schema: $ref: '#/components/schemas/nackResponse' examples: InvalidOrderId: summary: Invalid Order ID value: orderResponse: clientRefId: ABC1234 orderId: '100021822' responseTimeStamp: 2025-07-26 10:30:10EST respStatus: Failed respCode: '400' error: Invalid Order ID. InvalidAction: summary: Invalid Order ID value: orderResponse: clientRefId: ABC1234 orderId: '100021822' responseTimeStamp: 2025-07-26 10:30:10EST respStatus: Failed respCode: '400' error: Invalid action performed for the order. InvalidRole: summary: Invalid Role value: orderResponse: clientRefId: ABC1234 orderId: '100021822' responseTimeStamp: 2025-07-26 10:30:10EST respStatus: Failed respCode: '400' error: Invalid Role. '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/nackResponse' example: orderResponse: clientRefId: ABC1234 orderId: '100021822' responseTimeStamp: 2025-07-26 10:30:10EST respStatus: Failed respCode: '500' error: >- Unable to serve your request at this moment. Please try again later. components: schemas: submitAction: title: Order Action Request Object type: object properties: orderRequest: type: object required: - clientRefId - orderId - citiVelocityUserId - requestTimestamp - role - statusUpdate - basketType properties: clientRefId: title: Client Reference ID type: string description: >- Unique Client assigned identifier for each api request and response. example: ABC1234 orderId: title: Order ID type: string description: >- ACES Dealing Portal Order Id for which action is being submitted. example: '100021822' citiVelocityUserId: title: Citi Velocity User ID type: string description: ACES User Id for authentication. example: ps90033 requestTimestamp: title: Request Timestamp type: string description: >- Timestamp of the request in EST (Format:-"yyyy-MM-dd HH:mm:ssEST"). role: title: User Role type: string description: Role of the user submitting the action. enum: - PM - CMD example: PM statusUpdate: title: Status Update description: >- The action to be applied to the order (for example "APPROVED", REJECTED", "CANCEL_APPROVED", "CANCEL_REJECTED"). type: string format: date basketType: title: Basket Type type: string enum: - STANDARD - CUSTOM description: Specifies the BasketType of the order. Can be applied by PM. example: STANDARD comments: title: Comments type: string description: Optional comments regarding the action. example: Portfolio Manager ok with the order. ackResponse: title: Order Action ACK Response Object type: object properties: orderResponse: type: object properties: clientRefId: title: Client Reference ID type: string description: >- Unique Client assigned identifier for each api request and response.. example: ABC1234 orderId: title: Order ID type: string description: ACES Dealing Portal Order ID for which action is submitted. example: '100021822' responseTimeStamp: title: Response Timestamp type: string description: >- Timestamp of the response in EST (Format:-"yyyy-MM-dd HH:mm:ssEST").. example: 2025-07-26 10:30:10EST respStatus: title: Response Status type: string description: >- Status of the request (e.g., "Success" for successfully processed). example: Success respCode: title: Response Code type: string description: Successful response Code. example: '200' nackResponse: title: Order Action NACK Response Object type: object properties: orderResponse: type: object properties: clientRefId: title: Client Reference ID type: string description: >- Unique Client assigned identifier for each api request and response.. example: ABC1234 orderId: title: Order ID type: string description: ACES Dealing Portal Order ID for which action is submitted. example: '100021822' responseTimeStamp: title: Response Timestamp type: string description: >- Timestamp of the response in EST (Format:-"yyyy-MM-dd HH:mm:ssEST").. example: 2025-07-26 10:30:10EST respStatus: title: Response Status type: string description: Status of the request (e.g.,"Failed" for any failures). example: Failed respCode: title: Response Code type: string description: Error response Code. example: '400' error: type: string description: Description of the error encountered. example: Invalid Order ID. securitySchemes: Authorization: description: | Client applications must supply an authentication token with every request, and therefore must first authenticate before it can proceed. A client can use the OAuth 2 client credential grant flow to obtain a time limited access token. To get an access token send a HTTP Post request to the token endpoint using basic authentication with the client key and secret.

**Request**

```POST {baseURL}/tts/api/v1/oauth2/token HTTPS/1.1 Authorization: Basic base64(key:secret) Content-Type:application/x-www-form-urlencoded { scope=/api&grant_type=client_credentials }```

**Response**

``` { "token_type": "bearer", "access_token": , "expires_in": , "consented_on":, "scope": "api" }```

The bearer token is valid for 1800 seconds (30 minutes) after which it will expire. At this point, you would need to re-authenticate.

type: oauth2 flows: clientCredentials: tokenUrl: /tts/api/v1/oauth2/token scopes: /api: Access to ETF Order API