> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cynopsis.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Simple Customer Creation Workflow

## Simple Customer Creation Workflow

In the event any end-user would like to have just one API to create customers and CRP(s), as well as to perform screening for all of them, Cynopsis has provided the following API for end-users to call.

***

### Authentication & Headers

All API calls require:

* A **Bearer Token** obtained from the [`Authentication`](/artemis3-api-reference/authentication) API
* The `X-Domain-ID` header included in every request (this value will be provided by **Cynopsis**)

Example headers:

```http theme={null}
Authorization: Bearer YOUR_ACCESS_TOKEN
X-Domain-ID: YOUR_DOMAIN_ID
Content-Type: application/json
```

***

## 🧩 Sample Requests — Simple Customer Creation Workflow

> **Auth & Headers:** All requests must include a valid **Bearer token** (from the Authentication flow) and the `X-Domain-ID` header (value provided by **Cynopsis**).
>
> **Endpoint:** `POST /api/customers/workflows/simple`
>
> **Headers**
>
> ```http theme={null}
> Authorization: Bearer YOUR_ACCESS_TOKEN
> X-Domain-ID: PROVIDED_BY_CYNOPSIS
> Content-Type: application/json
> ```

### Sample Request Body 1 — Corporate Primary Customer with one Individual CRP

```json theme={null}
{
  "customer": {
    "active": true,
    "profileReferenceId": "180162353535",
    "other": {
      "entityType": "ASSOCIATION",
      "corporateWebsite": null,
      "fatfjurisdiction": "",
      "industry": "AGRICULTURE",
      "onBoardingMode": "FACE-TO-FACE",
      "ownershipStructureLayer": "1",
      "paymentMode": ["CHEQUE (LOCAL)"],
      "productServiceComplexity": "SIMPLE",
      "sourceOfFunds": [
        {
          "id": "",
          "category": "",
          "amountDeclared": null,
          "evidenceCorroborated": ""
        }
      ],
      "sourceOfWealth": [
        {
          "id": "",
          "category": "",
          "amountDeclared": null,
          "evidenceCorroborated": ""
        }
      ],
      "natureOfBusinessRelationship": "",
      "bankAccount": [],
      "additionalInformation": ""
    },
    "particular": {
      "incorporated": true,
      "name": "Corporate Primary Customer",
      "alias": [],
      "formerName": [],
      "countryOfIncorporation": "SINGAPORE",
      "countryOfOperation": ["SINGAPORE"],
      "address": [],
      "incorporateNumber": "",
      "phone": [],
      "email": [],
      "dateOfIncorporation": null,
      "dateOfIncorporationExpiry": null,
      "imonumber": null
    },
    "type": "CORPORATE",
    "domainId": [{{domain_id}}],
    "assigneeId": {{assignee_id}}
  },
  "crps": [
    {
      "type": "INDIVIDUAL",
      "roles": [
        {
          "cid": "draft-1",
          "role": "DIRECTOR",
          "appointedDate": "2022-01-01",
          "resignedDate": null
        }
      ],
      "active": true,
      "particular": {
        "salutation": "",
        "name": "Individual CRP",
        "alias": [],
        "formerName": [],
        "gender": "MALE",
        "nationality": ["MALAYSIA"],
        "countryOfResidence": "MALAYSIA",
        "identityDocumentType": "",
        "identityNumber": "",
        "identityIssuedDate": null,
        "identityExpiryDate": null,
        "countryOfBirth": "",
        "dateOfBirth": null,
        "address": [],
        "phone": [],
        "email": []
      },
      "profileReferenceId": "18001181212",
      "other": {
        "status": "CURRENT",
        "sourceOfFunds": [
        {
          "id": "",
          "category": "",
          "amountDeclared": null,
          "evidenceCorroborated": ""
        }
        ],
        "sourceOfWealth": [
          {
            "id": "",
            "category": "",
            "amountDeclared": null,
            "evidenceCorroborated": ""
          }
        ],
        "bankAccountNumber": [],
        "undischargedBankrupt": "",
        "ownershipPercentage": ""
      }
    }
  ],
  "triggerScreening": true,
  "triggerScreeningForCrp": true
}
```

### Sample Request Body 2 — Individual Primary Customer with one Corporate CRP

```json theme={null}
{
  "customer": {
    "active": true,
    "profileReferenceId": "65999",
    "other": {
      "industry": "EDUCATION",
      "occupation": "TEACHING PROFESSIONAL",
      "onBoardingMode": "NON FACE-TO-FACE",
      "paymentMode": ["CREDIT CARD"],
      "productServiceComplexity": "SIMPLE",
      "sourceOfFunds": [
        {
          "id": "",
          "category": "",
          "amountDeclared": null,
          "evidenceCorroborated": ""
        }
      ],
      "sourceOfWealth": [
        {
          "id": "",
          "category": "",
          "amountDeclared": null,
          "evidenceCorroborated": ""
        }
      ],
      "bankAccount": [],
      "additionalInformation": "",
      "natureOfBusinessRelationship": ""
    },
    "particular": {
      "salutation": "",
      "name": "Individual Primary Customer",
      "alias": [],
      "formerName": [],
      "gender": "MALE",
      "countryOfResidence": "SINGAPORE",
      "nationality": ["SINGAPORE"],
      "countryOfBirth": "",
      "dateOfBirth": null,
      "address": [],
      "phone": [],
      "email": []
    },
    "type": "INDIVIDUAL",
    "domainId": [{{domain_id}}],
    "assigneeId": {{assignee_id}}
  },
  "crps": [
    {
      "type": "CORPORATE",
      "roles": [
        {
          "role": "ULTIMATE HOLDING COMPANY",
          "appointedDate": "2022-01-01",
          "resignedDate": null
        }
      ],
      "active": true,
      "other": {
        "entityType": "BANKS",
        "otherEntityType": "",
        "corporateWebsite": null,
        "status": "CURRENT",
        "sourceOfFunds": [
        {
          "id": "",
          "category": "",
          "amountDeclared": null,
          "evidenceCorroborated": ""
        }
        ],
        "sourceOfWealth": [
          {
            "id": "",
            "category": "",
            "amountDeclared": null,
            "evidenceCorroborated": ""
          }
        ],
        "bankAccountNumber": [],
        "undischargedBankrupt": "",
        "ownershipStructureLayer": "1",
        "variableCapitalCompany": "",
        "businessCessationDate": null
      },
      "particular": {
        "name": "Corporate CRP",
        "alias": [],
        "formerName": [],
        "countryOfIncorporation": "",
        "countryOfOperation": ["MALAYSIA"],
        "dateOfIncorporation": null,
        "email": [],
        "address": [],
        "imonumber": null,
        "incorporateNumber": "",
        "incorporated": "",
        "phone": []
      },
      "profileReferenceId": "65995"
    }
  ],
  "triggerScreening": true,
  "triggerScreeningForCrp": true
}
```

> **Placeholders:** Replace `{{domain_id}}` and `{{assignee_id}}` with your actual values. Keep booleans as `true/false` (not strings) and `null` where applicable.


## OpenAPI

````yaml POST /api/customer/createWithCrps
openapi: 3.1.0
info:
  description: Api Documentation
  version: '3.0'
  title: Api Documentation
  termsOfService: urn:tos
  contact: {}
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0
servers:
  - url: https://api.artemis.cynopsis.co
security: []
tags:
  - name: app-config-controller
    description: App Config Controller
  - name: asia-verify-controller
    description: Asia Verify Controller
  - name: authentication-controller
    description: Authentication Controller
  - name: authentication-manager-controller
    description: Authentication Manager Controller
  - name: basic-error-controller
    description: Basic Error Controller
  - name: comment-controller
    description: Comment Controller
  - name: customer-controller
    description: Customer Controller
  - name: dashboard-controller
    description: Dashboard Controller
  - name: domain-controller
    description: Domain Controller
  - name: expiring-document-controller
    description: Expiring Document Controller
  - name: hand-shake-controller
    description: Hand Shake Controller
  - name: media-controller
    description: Media Controller
  - name: on-going-due-diligent-controller
    description: On Going Due Diligent Controller
  - name: own-restricted-list-controller
    description: Own Restricted List Controller
  - name: periodic-review-controller
    description: Periodic Review Controller
  - name: quick-scan-controller
    description: Quick Scan Controller
  - name: user-controller
    description: User Controller
paths:
  /api/customer/createWithCrps:
    post:
      tags:
        - customer-controller
      summary: createNewCustomerWithCrp
      operationId: createNewCustomerWithCrpUsingPOST
      parameters:
        - name: X-Domain-ID
          in: header
          description: X-Domain-ID
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomerWithCrpDto'
        description: customerDTO
        required: true
      responses:
        '200':
          description: OK
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/CustomerWithCrpResponseDto'
        '201':
          description: Created
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
        '404':
          description: Not Found
      security:
        - OAuth2_Client_Credentials: []
        - OAuth2_Password: []
components:
  schemas:
    CustomerWithCrpDto:
      type: object
      properties:
        crps:
          type: array
          items:
            $ref: '#/components/schemas/CRPRequestDto'
        customer:
          $ref: '#/components/schemas/CustomerDto'
        triggerScreening:
          type: boolean
        triggerScreeningForCrp:
          type: boolean
      title: CustomerWithCrpDto
    CustomerWithCrpResponseDto:
      type: object
      properties:
        crps:
          type: array
          items:
            $ref: '#/components/schemas/CustomerResponseDto'
        customer:
          $ref: '#/components/schemas/CustomerResponseDto'
      title: CustomerWithCrpResponseDto
    CRPRequestDto:
      type: object
      required:
        - type
      properties:
        active:
          type: boolean
        forms:
          $ref: '#/components/schemas/JsonNode'
        id:
          type: integer
          format: int64
        profileId:
          type: integer
          format: int64
        profileReferenceId:
          type: string
        referenceId:
          type: string
        roles:
          type: array
          items:
            $ref: '#/components/schemas/CRPRoleRequestDto'
        type:
          type: string
          enum:
            - CORPORATE
            - INDIVIDUAL
      title: CRPRequestDto
    CustomerDto:
      type: object
      required:
        - profileReferenceId
        - type
      properties:
        active:
          type: boolean
        assigneeId:
          type: integer
          format: int64
        batchUploadId:
          type: integer
          format: int64
        forms:
          $ref: '#/components/schemas/JsonNode'
        id:
          type: integer
          format: int64
        profileId:
          type: integer
          format: int64
        profileReferenceId:
          type: string
        referenceId:
          type: string
        type:
          type: string
          enum:
            - CORPORATE
            - INDIVIDUAL
        vendorEntityGuid:
          type: string
        vendorName:
          type: string
      title: CustomerDto
    CustomerResponseDto:
      type: object
      properties:
        active:
          type: boolean
        assignees:
          type: array
          items:
            $ref: '#/components/schemas/UserInfo'
        createdAt:
          $ref: '#/components/schemas/Timestamp'
        createdBy:
          $ref: '#/components/schemas/UserInfo'
        forms:
          $ref: '#/components/schemas/JsonNode'
        id:
          type: integer
          format: int64
        lastRiskAssessment:
          type: string
          format: date-time
        listRoleAsText:
          type: array
          items:
            type: string
        notes:
          $ref: '#/components/schemas/JsonNode'
        other:
          $ref: '#/components/schemas/JsonNode'
        parentId:
          type: integer
          format: int64
        particular:
          $ref: '#/components/schemas/JsonNode'
        profileId:
          type: integer
          format: int64
        profileReferenceId:
          type: string
        referenceId:
          type: string
        riskRating:
          type: string
          enum:
            - HIGH
            - LOW
            - MEDIUM
            - MEDIUM_HIGH
            - MEDIUM_LOW
            - UNKNOWN
        roles:
          type: array
          items:
            $ref: '#/components/schemas/CRPRoleResponseDto'
        status:
          type: string
          enum:
            - ACCEPTED
            - CLEARED
            - DRAFT
            - PENDING
            - REJECTED
            - REQUEST_CHANGES
        type:
          type: string
          enum:
            - CORPORATE
            - INDIVIDUAL
        updatedAt:
          $ref: '#/components/schemas/Timestamp'
        updatedBy:
          $ref: '#/components/schemas/UserInfo'
        vendorEntityGuid:
          type: string
        vendorName:
          type: string
      title: CustomerResponseDto
    JsonNode:
      type: object
      title: JsonNode
    CRPRoleRequestDto:
      type: object
      required:
        - role
      properties:
        appointedDate:
          type: string
          format: date
        id:
          type: integer
          format: int64
        resignedDate:
          type: string
          format: date
        role:
          type: string
      title: CRPRoleRequestDto
    UserInfo:
      type: object
      properties:
        email:
          type: string
        firstName:
          type: string
        fullName:
          type: string
        id:
          type: integer
          format: int64
        lastName:
          type: string
      title: UserInfo
    Timestamp:
      type: object
      properties:
        date:
          type: integer
          format: int32
        day:
          type: integer
          format: int32
        hours:
          type: integer
          format: int32
        minutes:
          type: integer
          format: int32
        month:
          type: integer
          format: int32
        nanos:
          type: integer
          format: int32
        seconds:
          type: integer
          format: int32
        time:
          type: integer
          format: int64
        timezoneOffset:
          type: integer
          format: int32
        year:
          type: integer
          format: int32
      title: Timestamp
    CRPRoleResponseDto:
      type: object
      properties:
        appointedDate:
          type: string
          format: date
        createdAt:
          $ref: '#/components/schemas/Timestamp'
        createdBy:
          $ref: '#/components/schemas/UserInfo'
        id:
          type: integer
          format: int64
        resignedDate:
          type: string
          format: date
        role:
          type: string
        updatedAt:
          $ref: '#/components/schemas/Timestamp'
        updatedBy:
          $ref: '#/components/schemas/UserInfo'
      title: CRPRoleResponseDto
  securitySchemes:
    OAuth2_Client_Credentials:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://crm.cynopsis.co/oauth/token
          scopes: {}
    OAuth2_Password:
      type: oauth2
      flows:
        password:
          tokenUrl: https://crm.cynopsis.co/oauth/token
          scopes: {}

````