@lap v0.3
# Machine-readable API spec. Each @endpoint block is one API call.
@api Yodlee Core APIs
@base /
@version 1.1.0
@endpoints 70
@hint download_for_search
@toc transactions(13), cobrand(7), dataExtracts(2), providers(3), configs(5), derived(3), user(7), documents(3), providerAccounts(6), auth(5), accounts(7), holdings(4), verifyAccount(1), verification(3), statements(1)

@group transactions
@endpoint GET /transactions
@desc Get Transactions
@optional {accountId: str # Comma separated accountIds, baseType: str # DEBIT/CREDIT, categoryId: str # Comma separated categoryIds, categoryType: str # Transaction Category Type(UNCATEGORIZE, INCOME, TRANSFER, EXPENSE or DEFERRED_COMPENSATION), container: str # bank/creditCard/investment/insurance/loan, detailCategoryId: str # Comma separated detailCategoryIds, fromDate: str # Transaction from date(YYYY-MM-DD), highLevelCategoryId: str # Comma separated highLevelCategoryIds, keyword: str # Transaction search text, skip: int(int32) # skip (Min 0), toDate: str # Transaction end date (YYYY-MM-DD), top: int(int32) # top (Max 500), type: str # Transaction Type(SELL,SWEEP, etc.) for bank/creditCard/investment}
@returns(200) OK
@errors {400: Y800 : Invalid value for baseTypeY800 : Invalid value for fromDateY800 : Invalid value for categoryY800 : Invalid value for toDateY800 : Invalid value for containerY809 : Invalid date rangeY804 : Permitted values of top between 1 - 500Y805 : Multiple containers not supportedY800 : Invalid value for transaction typeY824 : The maximum number of accountIds permitted is 100Y824 : The maximum number of categoryIds permitted is 100Y824 : The maximum number of highLevelCategoryIds permitted is 100Y848 : detailCategoryId cannot be provided as input, as the detailedCategory feature is not enabledY823 : detailCategoryId is not for applicable containers other than bank and cardY824 : The maximum number of detailCategoryIds permitted is 100Y800 : Invalid value for detailCategoryId, 401: Unauthorized, 404: Not Found}

@endgroup

@group cobrand
@endpoint POST /cobrand/login
@desc Cobrand Login
@required {cobrand: map{cobrandLogin!: str, cobrandPassword!: str, locale: str}}
@returns(200) OK
@errors {400: Y800 : Invalid value for cobrandParam, 401: Y003 : Account is locked, contact Yodlee customer careY001 : User name and password required, 404: Not Found}

@endgroup

@group dataExtracts
@endpoint GET /dataExtracts/userData
@desc Get userData
@required {fromDate: str # From DateTime (YYYY-MM-DDThh:mm:ssZ), loginName: str # Login Name, toDate: str # To DateTime (YYYY-MM-DDThh:mm:ssZ)}
@returns(200) OK
@errors {400: Y800 : Invalid value for eventNameY821 : Data update event not supportedY800 : Invalid value for fromDate.fromDate cannot be greater than current timeY800 : Invalid value for toDate.toDate cannot be greater than current time.Y800 : Invalid value for fromDate or toDate.fromDate and toDate cannot be older than 7 daysY800 : Invalid value for fromDate.fromDate can not be greater than toDateY800 : Invalid value for loginName, 401: Unauthorized, 404: Not Found}

@endgroup

@group providers
@endpoint GET /providers
@desc Get Providers
@optional {capability: str # CHALLENGE_DEPOSIT_VERIFICATION - capability search is deprecated, dataset$filter: str # Expression to filter the providers by dataset(s) or dataset attribute(s). The default value will be the dataset or dataset attributes configured as default for the customer., fullAccountNumberFields: str # Specify to filter the providers with values paymentAccountNumber,unmaskedAccountNumber., institutionId: int(int64) # Institution Id for Single site selection, name: str # Name in minimum 1 character or routing number., priority: str # Search priority, providerId: str # Max 5 Comma seperated Provider Ids, skip: int(int32) # skip (Min 0) - This is not applicable along with 'name' parameter., top: int(int32) # top (Max 500) - This is not applicable along with 'name' parameter.}
@returns(200) OK
@errors {400: Y800 : Invalid value for priorityY800 : Invalid value for providerNameY801 : Invalid length for a site search. The search string must have atleast 1 characterY800 : Invalid value for skipY804 : Permitted values of top between 1 - 500Y821 : Dataset not supportedY820 : The additionalDataSet is not supported for Get provider API, 401: Unauthorized, 404: Not Found}

@endpoint GET /providers/{providerId}
@desc Get Provider Details
@required {providerId: int(int64) # providerId}
@returns(200) OK
@errors {400: Y800 : Invalid value for providerId, 401: Unauthorized, 404: Not Found}

@endgroup

@group cobrand
@endpoint PUT /cobrand/config/notifications/events/{eventName}
@desc Update Subscription
@required {eventName: str(REFRESH/DATA_UPDATES/AUTO_REFRESH_UPDATES) # eventName, event: map{callbackUrl: str}}
@returns(204) OK
@errors {400: Y803 : eventName requiredY803 : callbackUrl requiredY800 : Invalid value for callbackUrl, 401: Unauthorized, 404: Not Found}

@endpoint POST /cobrand/config/notifications/events/{eventName}
@desc Subscribe Event
@required {eventName: str(REFRESH/DATA_UPDATES/AUTO_REFRESH_UPDATES) # eventName, event: map{callbackUrl: str}}
@returns(201) OK
@errors {400: Y803 : eventName requiredY803 : callbackUrl requiredY800 : Invalid value for callbackUrl, 401: Unauthorized, 404: Not Found}

@endpoint DELETE /cobrand/config/notifications/events/{eventName}
@desc Delete Subscription
@required {eventName: str(REFRESH/DATA_UPDATES/AUTO_REFRESH_UPDATES) # eventName}
@returns(204) OK
@errors {400: Y803 : eventName required, 401: Unauthorized, 404: Not Found}

@endgroup

@group configs
@endpoint GET /configs/notifications/events
@desc Get Subscribed Notification Events
@optional {eventName: str(REFRESH/DATA_UPDATES/AUTO_REFRESH_UPDATES) # eventName}
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group providers
@endpoint GET /providers/count
@desc Get Providers Count
@optional {capability: str # CHALLENGE_DEPOSIT_VERIFICATION - capability search is deprecated, dataset$filter: str # Expression to filter the providers by dataset(s) or dataset attribute(s). The default value will be the dataset or dataset attributes configured as default for the customer., fullAccountNumberFields: str # Specify to filter the providers with values paymentAccountNumber,unmaskedAccountNumber., name: str # Name in minimum 1 character or routing number., priority: str # Search priority}
@returns(200) OK
@errors {400: Y800 : Invalid value for priorityY800 : Invalid value for providerNameY801 : Invalid length for a site search. The search string must have at least 1 characterY800 : Invalid value for skipY804 : Permitted values of top between 1 - 500Y821 : Dataset not supportedY820 : The additionalDataSet is not supported for Get provider API, 401: Unauthorized, 404: Not Found}

@endgroup

@group derived
@endpoint GET /derived/networth
@desc Get Networth Summary
@optional {accountIds: str # comma separated accountIds, container: str # bank/creditCard/investment/insurance/loan/realEstate/otherAssets/otherLiabilities, fromDate: str # from date for balance retrieval (YYYY-MM-DD), include: str # details, interval: str # D-daily, W-weekly or M-monthly, skip: int(int32) # skip (Min 0), toDate: str # toDate for balance retrieval (YYYY-MM-DD), top: int(int32) # top (Max 500)}
@returns(200) OK
@errors {400: Y800 : Invalid value for accountIdsY800 : Invalid value for fromDateY800 : Invalid value for toDateY809 : Invalid date rangeY800 : Invalid value for intervalY802 : Future date not allowedY814 : Exchange rate not available for currencyY800 : Invalid value for container, 401: Unauthorized, 404: Not Found}

@endgroup

@group user
@endpoint POST /user/samlLogin
@desc Saml Login
@required {issuer: str # issuer, samlResponse: str # samlResponse}
@optional {source: str # source}
@returns(200) OK
@errors {400: Y013 : Invalid value for samlResponseY013 : Invalid value for issuer, 401: Unauthorized, 404: Not Found}

@endgroup

@group transactions
@endpoint PUT /transactions/categories/rules/{ruleId}
@desc Update Transaction Categorization Rule
@required {ruleId: int(int64) # ruleId, rule: map{ruleClause!: [map], source: str, priority: int(int32), categoryId!: int(int32)}}
@returns(204) Updated Successfully
@errors {400: Y800 : Invalid value for ruleIdY806 : Invalid input, 401: Unauthorized, 404: Not Found}

@endpoint POST /transactions/categories/rules/{ruleId}
@desc Run Transaction Categorization Rule
@required {action: str=run, ruleId: int(int64) # Unique id of the categorization rule}
@returns(204) Run Successfully
@errors {400: Y800 : Invalid value for ruleIdY400 : Categorization already in progress, 401: Unauthorized, 404: Not Found}

@endpoint DELETE /transactions/categories/rules/{ruleId}
@desc Delete Transaction Categorization Rule
@required {ruleId: int(int64) # ruleId}
@returns(204) Deleted Successfully
@errors {400: Y800 : Invalid value for ruleId, 401: Unauthorized, 404: Not Found}

@endgroup

@group documents
@endpoint GET /documents/{documentId}
@desc Download a Document
@required {documentId: str # documentId}
@returns(200) OK
@errors {400: Y800 : Invalid value for documentId, 401: Unauthorized, 404: Not Found}

@endpoint DELETE /documents/{documentId}
@desc Delete Document
@required {documentId: str # documentId}
@returns(204) OK
@errors {400: Y800 : Invalid value for documentIdY868 : No action is allowed, as the data is being migrated to the Open Banking provider, 401: Unauthorized, 404: Not Found}

@endgroup

@group user
@endpoint GET /user/accessTokens
@desc Get Access Tokens
@required {appIds: str # appIds}
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group cobrand
@endpoint POST /cobrand/logout
@desc Cobrand Logout
@returns(204) Logout successful
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group providerAccounts
@endpoint PUT /providerAccounts/{providerAccountId}/preferences
@desc Update Preferences
@required {providerAccountId: int(int64) # providerAccountId}
@optional {preferences: map{isDataExtractsEnabled: bool, linkedProviderAccountId: int(int64), isAutoRefreshEnabled: bool}}
@returns(204) OK
@errors {400: Y800 : Invalid value for preferencesY800 : Invalid value for preferences.isDataExtractsEnabledY800 : Invalid value for preferences.isAutoRefreshEnabledY807 : Resource not foundY830 : Data extracts feature has to be enabled to set preferences.isDataExtractsEnabled as trueY830 : Auto refresh feature has to be enabled to set preferences.isAutoRefreshEnabled as trueY868 : No action is allowed, as the data is being migrated to the Open Banking provider, 401: Unauthorized, 404: Not Found}

@endgroup

@group auth
@endpoint POST /auth/token
@desc Generate Access Token
@returns(201) OK
@errors {400: Y800 : Invalid value for loginNameY806 : Invalid inputY801 : Invalid length for loginNameY303 : clientId or secret is missingY301 : Invalid clientId or secretY305 : Access token can be issued only for pre-registered usersY004 : Inactive userY901 : Service not supported, 401: Y016 : loginName header missingY015 : Unauthorized UserY016 : Api-Version header missingY020 : Invalid token in authorization headerY027 : Unsupported authentication type, 404: Not Found}

@endpoint DELETE /auth/token
@desc Delete Token
@returns(204) No Content
@errors {401: Y020 : Invalid token in authorization headerY023 : Token has expiredY016 : Api-Version header missingY015 : Unauthorized UserY027 : Unsupported authentication typeY007 : Authorization header missingY020 : Invalid token in authorization header, 404: Not Found}

@endgroup

@group user
@endpoint GET /user
@desc Get User Details
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endpoint PUT /user
@desc Update User Details
@required {user: map{preferences: map, address: map, name: map, email: str, segmentName: str}}
@returns(204) No Content
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group providerAccounts
@endpoint GET /providerAccounts/{providerAccountId}
@desc Get Provider Account Details
@required {providerAccountId: int(int64) # providerAccountId}
@optional {include: str # include credentials,questions, requestId: str # The unique identifier for the request that returns contextual data}
@returns(200) OK
@errors {400: Y800 : Invalid value for providerAccountIdY816 : questions can only be requested for questionAndAnswer Supported Sites, 401: Unauthorized, 404: Not Found}

@endpoint DELETE /providerAccounts/{providerAccountId}
@desc Delete Provider Account
@required {providerAccountId: int(int64) # providerAccountId}
@returns(200) OK
@errors {400: Y800 : Invalid value for providerAccountIdY868 : No action is allowed, as the data is being migrated to the Open Banking provider, 401: Unauthorized, 404: Not Found}

@endgroup

@group accounts
@endpoint GET /accounts
@desc Get Accounts
@optional {accountId: str # Comma separated accountIds., container: str # bank/creditCard/investment/insurance/loan/reward/realEstate/otherAssets/otherLiabilities, include: str # profile, holder, fullAccountNumber, fullAccountNumberList, paymentProfile, autoRefreshNote:fullAccountNumber is deprecated and is replaced with fullAccountNumberList in include parameter and response., providerAccountId: str # Comma separated providerAccountIds., requestId: str # The unique identifier that returns contextual data, status: str # ACTIVE,INACTIVE,TO_BE_CLOSED,CLOSED}
@returns(200) OK
@errors {400: Y800 : Invalid value for statusY800 : Invalid value for containerY800 : Invalid value for providerAccountIdY824 : The maximum number of accountIds permitted is 100, 401: Unauthorized, 404: Not Found}

@endpoint POST /accounts
@desc Add Manual Account
@required {account: map{includeInNetWorth: str, address: map, accountName!: str, accountType!: str, dueDate: str, memo: str, homeValue: map, accountNumber: str, frequency: str, amountDue: map, balance: map, nickname: str, valuationType: str}}
@returns(200) OK
@errors {400: Y800 : Invalid value for accountParamY811 : Real Estate Property value already existsY862 : The provided address is invalid, or the valuation is not availableY869 : Multiple matches found. Provide the complete address or call the POST /accounts/evaluateAddress API to retrieve the list of matched addresses, 401: Unauthorized, 404: Not Found}

@endgroup

@group user
@endpoint DELETE /user/unregister
@desc Delete User
@returns(204) No Content
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group holdings
@endpoint GET /holdings/assetClassificationList
@desc Get Asset Classification List
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group verifyAccount
@endpoint POST /verifyAccount/{providerAccountId}
@desc Verify Accounts Using Transactions
@required {providerAccountId: str # providerAccountId, transactionCriteria: [map{date!: str, amount!: num(double), verifiedTransaction: [map], matched: str, keyword: str, dateVariance: str, baseType: str}]}
@optional {container: str(bank/creditCard/investment/insurance/loan/reward/realEstate/otherAssets/otherLiabilities), accountId: int(int64)}
@returns(200) OK
@errors {400: Y800 : Invalid value for containerY800 : Invalid value for accountIdY800 : Invalid value for amountY800 : Invalid value for dateVarianceY801 : Invalid length for keywordY804 : Permitted values of dateVariance between 1 - 7Y806 : Invalid inputY807 : Resource not foundY809 : Invalid date rangeY812 : Required field/value - transactionCriteria missing in the inputY812 : Required field/value - amount missing in the transactionCriteriaY812 : Required field/value - amount date in the transactionCriteriaY812 : Required field/value - baseType missing in the transactionCriteriaY823 : Transaction not applicable for container Y824 : The maximum number of transactionCriteria permitted is 5Y857 : Transactions are not refreshed in the past 24 hoursY858 : Only active accounts can be verifiedY901 : Service not supported, 401: Unauthorized, 404: Not Found}

@endgroup

@group configs
@endpoint GET /configs/publicKey
@desc Get Public Key
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group auth
@endpoint DELETE /auth/apiKey/{key}
@desc Delete API Key
@required {key: str # key}
@returns(201) OK
@returns(204) No Content
@errors {400: Y807 : Resource not foundY806 : Invalid input, 401: Unauthorized, 404: Not Found}

@endgroup

@group providerAccounts
@endpoint GET /providerAccounts
@desc Get Provider Accounts
@optional {include: str # include, providerIds: str # Comma separated providerIds.}
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endpoint PUT /providerAccounts
@desc Update Account
@required {providerAccountIds: str # comma separated providerAccountIds, field: [map{image: str, prefix: str, minLength: int(int64), valueEditable: str, isOptional: bool, suffix: str, type: str, isValueProvided: bool, name: str, id: str, value: str, maxLength: int(int64), option: [map]}]}
@optional {consentId: int(int64) # Consent Id generated for the request through POST Consent.Endpoints:POST Provider AccountPUT Provider Account, preferences: map{isDataExtractsEnabled: bool, linkedProviderAccountId: int(int64), isAutoRefreshEnabled: bool}, aggregationSource: str(SYSTEM/USER), datasetName: [str], dataset: [map{name: str, attribute: [map]}]}
@returns(200) OK
@errors {400: Y805 : Multiple providerAccountId not supported for updating credentialsY800 : Invalid value for credentialsParamY400 : id and value in credentialsParam are mandatoryY806 : Invalid inputY823 : Credentials are not applicable for real estate aggregated / manual accountsY868 : No action is allowed, as the data is being migrated to the Open Banking provider, 401: Unauthorized, 404: Not Found}

@endgroup

@group transactions
@endpoint GET /transactions/count
@desc Get Transactions Count
@optional {accountId: str # Comma separated accountIds, baseType: str # DEBIT/CREDIT, categoryId: str # Comma separated categoryIds, categoryType: str # Transaction Category Type(UNCATEGORIZE, INCOME, TRANSFER, EXPENSE or DEFERRED_COMPENSATION), container: str # bank/creditCard/investment/insurance/loan, detailCategoryId: str # Comma separated detailCategoryIds, fromDate: str # Transaction from date(YYYY-MM-DD), highLevelCategoryId: str # Comma separated highLevelCategoryIds, keyword: str # Transaction search text, toDate: str # Transaction end date (YYYY-MM-DD), type: str # Transaction Type(SELL,SWEEP, etc.)}
@returns(200) OK
@errors {400: Y800 : Invalid value for detailCategoryIdY848 : detailCategoryId cannot be provided as input, as the detailedCategory feature is not enabledY823 : detailCategoryId is not applicable for containers other than bank and cardY824 : The maximum number of detailCategoryIds permitted is 100, 401: Unauthorized, 404: Not Found}

@endgroup

@group derived
@endpoint GET /derived/transactionSummary
@desc Get Transaction Summary
@required {groupBy: str # CATEGORY_TYPE, HIGH_LEVEL_CATEGORY or CATEGORY}
@optional {accountId: str # comma separated account Ids, categoryId: str # comma separated categoryIds, categoryType: str # INCOME, EXPENSE, TRANSFER, UNCATEGORIZE or DEFERRED_COMPENSATION, fromDate: str # YYYY-MM-DD format, include: str # details, includeUserCategory: bool # TRUE/FALSE, interval: str # D-daily, W-weekly, M-mothly or Y-yearly, toDate: str # YYYY-MM-DD format}
@returns(200) OK
@errors {400: Y010 : Invalid sessionY800 : Invalid value for accountIdY800 : Invalid value for groupByY803 : groupBy requiredY803 : categoryType requiredY800 : Invalid value for categoryIdY800 : Invalid value for fromDateY800 : Invalid value for toDateY800 : Invalid value for fromDate or toDateY814 : Exchange rate not available for currencyY815 : Cannot apply filter on categoryId if groupBy value is CATEGORY_TYPEY816 : User-defined category details can only be requested for one system categoryId with groupBy='CATEGORY'Y824 : The maximum number of accountIds permitted is 100Y824 : The maximum number of categoryIds permitted is 100Y824 : The maximum number of categoryTypes permitted is 100, 401: Unauthorized, 404: Not Found}

@endgroup

@group transactions
@endpoint GET /transactions/categories/txnRules
@desc Get Transaction Categorization Rules
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endpoint DELETE /transactions/categories/{categoryId}
@desc Delete Category
@required {categoryId: int(int64) # categoryId}
@returns(204) Deleted Successfully
@errors {400: Y800 : Invalid value for categoryId, 401: Unauthorized, 404: Not Found}

@endgroup

@group documents
@endpoint GET /documents
@desc Get Documents
@optional {Keyword: str # The string used to search a document by its name., accountId: str # The unique identifier of an account. Retrieve documents for a given accountId., docType: str # Accepts only one of the following valid document types: STMT, TAX, and EBILL., fromDate: str # The date from which documents have to be retrieved., toDate: str # The date to which documents have to be retrieved.}
@returns(200) OK
@errors {400: Y800 : Invalid value for accountIdY800 : Invalid value for fromDateY800 : Invalid value for toDateY800 : Invalid value for docType, 401: Unauthorized, 404: Not Found}

@endgroup

@group accounts
@endpoint POST /accounts/evaluateAddress
@desc Evaluate Address
@required {address: map{zip: str, country: str, address3: str, address2: str, city: str, sourceType: str, address1: str, street!: str, state: str, type: str}}
@returns(200) OK
@errors {400: Y806 : Invalid inputY800 : Invalid value for zipY812 : Required field/value - address missing in the requestY812 : Required field/value - street missing in the requestY812 : Required field/value - state & city / zip missing in the request, 401: Unauthorized, 404: Not Found}

@endpoint GET /accounts/{accountId}
@desc Get Account Details
@required {accountId: int(int64) # accountId}
@optional {include: str # profile, holder, fullAccountNumber, fullAccountNumberList, paymentProfile, autoRefreshNote:fullAccountNumber is deprecated and is replaced with fullAccountNumberList in include parameter and response.}
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endpoint PUT /accounts/{accountId}
@desc Update Account
@required {accountId: int(int64) # accountId, account: map{container: str, includeInNetWorth: str, address: map, accountName: str, dueDate: str, memo: str, homeValue: map, accountNumber: str, frequency: str, accountStatus: str, amountDue: map, balance: map, isEbillEnrolled: str, nickname: str}}
@returns(204) OK
@errors {400: Y800 : Invalid value for accountIdY800 : Invalid value for updateParamY862 : The provided address is invalid, or the valuation is not availableY868 : No action is allowed, as the data is being migrated to the Open Banking providerY869 : Multiple matches found. Provide the complete address or call the POST /accounts/evaluateAddress API to retrieve the list of matched addresses, 401: Unauthorized, 404: Not Found}

@endpoint DELETE /accounts/{accountId}
@desc Delete Account
@required {accountId: int(int64) # accountId}
@returns(204) OK
@errors {400: Y800 : Invalid value for accountIdY807 : Resource not foundY868 : No action is allowed, as the data is being migrated to the Open Banking provider, 401: Unauthorized, 404: Not Found}

@endpoint GET /accounts/historicalBalances
@desc Get Historical Balances
@optional {accountId: str # accountId, fromDate: str # from date for balance retrieval (YYYY-MM-DD), includeCF: bool # Consider carry forward logic for missing balances, interval: str # D-daily, W-weekly or M-monthly, skip: int(int32) # skip (Min 0), toDate: str # toDate for balance retrieval (YYYY-MM-DD), top: int(int32) # top (Max 500)}
@returns(200) OK
@errors {400: Y800 : Invalid value for accountIdY800 : Invalid value for fromDateY800 : Invalid value for toDateY809 : Invalid date rangeY800 : Invalid value for intervalY802 : Future date not allowed, 401: Unauthorized, 404: Not Found}

@endgroup

@group user
@endpoint POST /user/register
@desc Register User
@required {user: map{preferences: map, address: map, loginName!: str, name: map, email: str, segmentName: str}}
@returns(200) Login Successful
@errors {400: Y800 : Invalid value for loginNameY800 : Invalid value for emailY801 : Invalid length for loginName, 401: Unauthorized, 404: Not Found}

@endgroup

@group providerAccounts
@endpoint GET /providerAccounts/profile
@desc Get User Profile Details
@optional {providerAccountId: str # Comma separated providerAccountIds.}
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group verification
@endpoint GET /verification
@desc Get Verification Status
@optional {accountId: str # Comma separated accountId, providerAccountId: str # Comma separated providerAccountId, verificationType: str # verificationType}
@returns(200) OK
@errors {400: Y901 : Service not supportedY813 : Either of accountId or providerAccountId should be providedY800 : Invalid value for accountIdY800 : Invalid value for verification.verificationTypeY800 : Invalid value for providerAccountIdY835 : Account(s) not eligible for Matching verificationY836 : No verification initiated, 401: Unauthorized, 404: Not Found}

@endpoint PUT /verification
@desc Verify Challenge Deposit
@optional {verification: map{accountId: int(int64), reason: str, verificationStatus: str, providerAccountId: int(int64), verificationType: str, account: map, transaction!: [map], verificationDate: str, verificationId: int(int64)}}
@returns(200) OK
@errors {400: Y901 : Service not supportedY812 : Required field/value - verification.verificationType missing in the verificationParamY812 : Required field/value - amount.amount missing in the verificationParamY812 : Required field/value - baseType missing in the verificationParamY812 : Required field/value - currency missing in the verificationParamY812 : Required field/value - providerAccountId missing in the verificationParamY812 : Required field/value - accountId missing in the verificationParamY800 : Invalid value for verificationParamY800 : Invalid value for verification.verificationTypeY800 : Invalid value for baseTypeY800 : Invalid value for providerAccountIdY800 : Invalid value for accountIdY813 : Transaction should be providedY801 : Invalid length for accountNumberY801 : Invalid length for amountY835 : Account(s) not eligible for Challenge Deposit verificationY806 : Invalid InputY840 : Verification has been initiated alreadyY837 : Account has been verified alreadyY838 : The currency code provided does not match with the currency of the transaction executed on the target accountY846 : The number of financial transactions made on the target account does not match with the number of transactions entered by the user.Y842 : Number of retries exceeded the maximum Challenge Deposit verification limitY844 : Financial Instructions were not executed successfully on the target accountY845 : Verification time expired. Please try initiating challenge deposit againY868 : No action is allowed, as the data is being migrated to the Open Banking provider, 401: Unauthorized, 404: Not Found}

@endpoint POST /verification
@desc Initiaite Matching Service and Challenge Deposit
@required {verification: map{accountId: int(int64), reason: str, verificationStatus: str, providerAccountId: int(int64), verificationType: str, account: map, verificationDate: str, verificationId: int(int64)}}
@returns(200) OK
@errors {400: Y901 : Service not supportedY812 : Required field/value - verification.verificationType missing in the verificationParamY812 : Required field/value - accountNumber missing in the verificationParamY812 : Required field/value - accountType missing in the verificationParamY812 : Required field/value - bankTransferCode missing in the verificationParamY812 : Required field/value - bankTransferCode.id missing in the verificationParamY812 : Required field/value - bankTransferCode.type missing in the verificationParamY800 : Invalid value for verification.verificationTypeY800 : Invalid value for verificationParamY800 : Invalid value for bankTransferCode.typeY800 : Invalid value for bankTransferCode.idY800 : Invalid value for accountTypeY800 : Invalid value for accountIdY813 : Account details should be providedY801 : Invalid length for accountNumberY835 : Account(s) not eligible for Challenge Deposit verificationY806 : Invalid InputY840 : Verification has been initiated alreadyY837 : Account has been verified already, 401: Unauthorized, 404: Not Found}

@endgroup

@group holdings
@endpoint GET /holdings/securities
@desc Get Security Details
@optional {holdingId: str # Comma separated holdingId}
@returns(200) OK
@errors {400: Y800 : Invalid value for holdingIdY824 : The maximum number of holdingIds permitted is 100, 401: Unauthorized, 404: Not Found}

@endgroup

@group configs
@endpoint PUT /configs/notifications/events/{eventName}
@desc Update Notification Subscription
@required {eventName: str(REFRESH/DATA_UPDATES/AUTO_REFRESH_UPDATES) # eventName, event: map{callbackUrl: str}}
@returns(204) OK
@errors {400: Y803 : eventName requiredY803 : callbackUrl requiredY800 : Invalid value for callbackUrl, 401: Unauthorized, 404: Not Found}

@endpoint POST /configs/notifications/events/{eventName}
@desc Subscribe For Notification Event
@required {eventName: str(REFRESH/DATA_UPDATES/AUTO_REFRESH_UPDATES) # eventName, event: map{callbackUrl: str}}
@returns(201) OK
@errors {400: Y803 : eventName requiredY803 : callbackUrl requiredY800 : Invalid value for callbackUrl, 401: Unauthorized, 404: Not Found}

@endpoint DELETE /configs/notifications/events/{eventName}
@desc Delete Notification Subscription
@required {eventName: str(REFRESH/DATA_UPDATES/AUTO_REFRESH_UPDATES) # eventName}
@returns(204) OK
@errors {400: Y803 : eventName required, 401: Unauthorized, 404: Not Found}

@endgroup

@group holdings
@endpoint GET /holdings
@desc Get Holdings
@optional {accountId: str # Comma separated accountId, assetClassification.classificationType: str # e.g. Country, Sector, etc., classificationValue: str # e.g. US, include: str # assetClassification, providerAccountId: str # providerAccountId}
@returns(200) OK
@errors {400: Y800 : Invalid value for accountIdY800 : Invalid value for providerAccountIdY800 : Invalid value for includeY800 : Invalid value for classificationTypeY800 : Invalid value for classificationValueY800 : Invalid value for includeY400 : classificationType mismatchY400 : classificationValue mismatchY824 : The maximum number of accountIds permitted is 100, 401: Unauthorized, 404: Not Found}

@endgroup

@group cobrand
@endpoint GET /cobrand/config/notifications/events
@desc Get Subscribed Events
@optional {eventName: str(REFRESH/DATA_UPDATES/AUTO_REFRESH_UPDATES) # eventName}
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group auth
@endpoint GET /auth/apiKey
@desc Get API Keys
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endpoint POST /auth/apiKey
@desc Generate API Key
@optional {publicKey: str # Public key uploaded by the customer while generating ApiKey.Endpoints:GET /auth/apiKeyPOST /auth/apiKey}
@returns(201) OK
@errors {400: Y800 : Invalid value for RS512 publicKeyY806 : Invalid inputY824 : The maximum number of apiKey permitted is 5Y811 : publicKey value already exists, 401: Unauthorized, 404: Not Found}

@endgroup

@group cobrand
@endpoint GET /cobrand/publicKey
@desc Get Public Key
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group transactions
@endpoint GET /transactions/categories
@desc Get Transaction Category List
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endpoint PUT /transactions/categories
@desc Update Category
@required {id: int(int64), source: str(SYSTEM/USER)}
@optional {highLevelCategoryName: str, categoryName: str}
@returns(204) Updated Successfully
@errors {400: Y800 : Invalid value for categoryParamY800 : Invalid value for sourceY801 : Invalid length for categoryName. Min 1 and max 50 is requiredY803 : id requiredY811 : categoryName value already exists, 401: Unauthorized, 404: Not Found}

@endpoint POST /transactions/categories
@desc Create Category
@required {parentCategoryId: int(int32)}
@optional {source: str, categoryName: str}
@returns(201) Created Successfully
@errors {400: Y800 : Invalid value for categoryParamY800 : Invalid value for sourceY801 : Invalid length for categoryName. Min 1 and max 50 is requiredY803 : parentCategoryId requiredY811 : categoryName value already exists, 401: Unauthorized, 404: Not Found}

@endpoint GET /transactions/categories/rules
@desc Get Transaction Categorization Rules
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endpoint POST /transactions/categories/rules
@desc Create or Run Transaction Categorization Rule
@optional {action: str # To run rules, pass action=run. Only value run is supported, ruleParam: str # rules(JSON format) to categorize the transactions}
@returns(201) Created Successfully
@returns(204) No Content
@errors {400: Y806 : Invalid inputY400 : Rule already exists. Rule should be unique in terms of combination of description and amount, 401: Unauthorized, 404: Not Found}

@endgroup

@group statements
@endpoint GET /statements
@desc Get Statements
@optional {accountId: str # accountId, container: str # creditCard/loan/insurance, fromDate: str # from date for statement retrieval (YYYY-MM-DD), isLatest: str # isLatest (true/false), status: str # ACTIVE,TO_BE_CLOSED,CLOSED}
@returns(200) OK
@errors {400: Y800 : Invalid value for accountIdY800 : Invalid value for statusY805 : Multiple containers not supportedY800 : Invalid value for containerY800 : Invalid value for isLatestY800 : Invalid value for fromDate, 401: Unauthorized, 404: Not Found}

@endgroup

@group holdings
@endpoint GET /holdings/holdingTypeList
@desc Get Holding Type List
@returns(200) OK
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group user
@endpoint POST /user/logout
@desc User Logout
@returns(204) Logout successful
@errors {401: Unauthorized, 404: Not Found}

@endgroup

@group transactions
@endpoint PUT /transactions/{transactionId}
@desc Update Transaction
@required {transactionId: int(int64) # transactionId, transaction: map{categorySource!: str, container!: str, description: map, memo: str, categoryId!: int(int64)}}
@returns(204) Updated Successfully
@errors {400: Y812 : Required field -container missing in the transactionParam parameter inputY800 : Invalid value for transactionIdY800 : Invalid value for categoryIdY868 : No action is allowed, as the data is being migrated to the Open Banking provider, 401: Unauthorized, 404: Not Found}

@endgroup

@group dataExtracts
@endpoint GET /dataExtracts/events
@desc Get Events
@required {eventName: str # Event Name, fromDate: str # From DateTime (YYYY-MM-DDThh:mm:ssZ), toDate: str # To DateTime (YYYY-MM-DDThh:mm:ssZ)}
@returns(200) OK
@errors {400: Y800 : Invalid value for fromDate.fromDate cannot be greater than current timeY800 : Invalid value for toDate.toDate cannot be greater than current timeY800 : Invalid value for fromDate or toDate.fromDate and toDate cannot be older than 7 daysY800 : Invalid value for fromDate.fromDate cannot be greater than toDate., 401: Unauthorized, 404: Not Found}

@endgroup

@group derived
@endpoint GET /derived/holdingSummary
@desc Get Holding Summary
@optional {accountIds: str # Comma separated accountIds, classificationType: str # e.g. Country, Sector, etc., include: str # details}
@returns(200) OK
@errors {400: Y800 : Invalid value for classificationTypeY814 : Exchange rate not available for currencyY824 : The maximum number of accountIds permitted is 100, 401: Unauthorized, 404: Not Found}

@endgroup

@end
