Create Dynamic Change Request
POST /obp/v7.0.0/management/dynamic-change-requests
OBPv7.0.0-createDynamicChangeRequest No role required Dynamic-Change-RequestDynamic
Submit a change to a dynamic artefact for approval by a second user.
Maker/checker for runtime-supplied code and configuration (dynamic resource docs, connector methods, dynamic message docs, ABAC rules).
When dynamic_code_requires_approval is true and the target type is listed in dynamic_code_approval_target_types, the v4.0.0 / v6.0.0 create, update and delete endpoints validate and compile the body as before but return 202 Accepted with a Dynamic Change Request instead of applying it. A DIFFERENT user holding CanApproveDynamicChangeRequest approves the request by its payload_hash; only then is the change applied, and the runtime executes only rows whose body hash equals the approved hash.
Approval is system level. Dynamic code runs in the shared JVM, so a bank-level artefact is approved by the same system-level checker; there are no bank-level change request endpoints.
This explicit submission is for tooling that wants to attach a business_justification up front. In the common case the maker simply calls the v4.0.0 / v6.0.0 create, update or delete endpoint and receives the change request in a 202 Accepted response.
proposed_payload is the exact body the corresponding v4.0.0 / v6.0.0 endpoint accepts. bank_id selects the bank-level variant of that endpoint; omit it for system level. target_id is required for UPDATE, DELETE and ACTIVATE. The caller must hold the role the direct write would demand (for example CanCreateDynamicResourceDoc).
User Authentication is Required. The User must be logged in. The Application must also be authenticated.
JSON request body fields (5)
- operation
- operation
- proposed_payload
- proposed_payload
- target_type
- target_type
- bank_id
- gh.29.uk
- business_justification
- business_justification
JSON response body fields (18)
- actioned_at
- actioned_at
- business_justification
- business_justification
- checker_comment
- checker_comment
- checker_user_id
- checker_user_id
- created_at
- created_at
- current_payload
- current_payload
- current_payload_hash
- current_payload_hash
- dynamic_change_request_id
- dynamic_change_request_id
- expires_at
- expires_at
- operation
- operation
- payload_hash
- payload_hash
- proposed_payload
- proposed_payload
- request_path
- request_path
- request_verb
- POST
- requestor_user_id
- requestor_user_id
- status
- target_id
- target_id
- target_type
- target_type
Example request body
{
"target_type": "DYNAMIC_RESOURCE_DOC",
"operation": "CREATE",
"proposed_payload": {
"request_url": "/my_user/MY_USER_ID",
"success_response_body": {
"my_user_id": "some_id_value",
"name": "Jhon",
"age": 12,
"hobby": [
"coding"
],
"_optional_fields_": [
"hobby"
]
},
"example_request_body": {
"name": "Jhon",
"age": 12,
"hobby": [
"coding"
],
"_optional_fields_": [
"hobby"
]
},
"programming_lang": "Scala",
"bank_id": "gh.29.uk",
"roles": "CanCreateMyUser",
"summary": "Create My User",
"error_response_bodies": "OBP-50000: Unknown Error.,OBP-20001: User not logged in. Authentication is required!,OBP-20006: User is missing one or more roles: ,OBP-10001: Incorrect json format.",
"request_verb": "POST",
"description": "Create one User",
"tags": "Create-My-User",
"method_body": "%20%20%20%20val%20Some(resourceDoc)%20%3D%20callContext.resourceDocument%0A%20%20%20%20val%20hasRequestBody%20%3D%20callContext.httpBody.exists(_.nonEmpty)%0A%0A%20%20%20%20%2F%2F%20get%20Path%20Parameters%2C%20example%3A%0A%20%20%20%20%2F%2F%20if%20the%20requestUrl%20of%20resourceDoc%20is%20%2Fhello%2Fbanks%2FBANK_ID%2Fworld%0A%20%20%20%20%2F%2F%20the%20request%20path%20is%20%2Fhello%2Fbanks%2Fbank_x%2Fworld%0A%20%20%20%20%2F%2FpathParams.get(%22BANK_ID%22)%20will%20get%20Option(%22bank_x%22)%20value%0A%0A%20%20%20%20val%20myUserId%20%3D%20pathParams(%22MY_USER_ID%22)%0A%0A%0A%20%20%20%20val%20requestEntity%20%3D%20callContext.httpBody.filter(_.nonEmpty)%20match%20%7B%0A%20%20%20%20%20%20case%20Some(rawBody)%20%3D%3E%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20com.openbankproject.commons.util.JsonAliases.parse(rawBody).extract%5BRequestRootJsonClass%5D%0A%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20e%3A%20MappingException%20%3D%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20errorResponse(s%22%24InvalidJsonFormat%20%24%7Be.msg%7D%22)%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20case%20None%20%3D%3E%0A%20%20%20%20%20%20%20%20return%20errorResponse(s%22%24InvalidRequestPayload%20Current%20request%20has%20no%20payload%22)%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20%2F%2F%20please%20add%20business%20logic%20here%0A%20%20%20%20val%20responseBody%3AResponseRootJsonClass%20%3D%20ResponseRootJsonClass(s%22%24%7BmyUserId%7D_from_path%22%2C%20requestEntity.name%2C%20requestEntity.age%2C%20requestEntity.hobby)%0A%20%20%20%20Future.successful%20%7B%0A%20%20%20%20%20%20(responseBody%2C%20HttpCode.%60200%60(callContext.callContext))%0A%20%20%20%20%7D",
"dynamic_resource_doc_id": "vce035ca-9a0f-4bfa-b30b-9003aa467f51",
"partial_function_name": "createUser"
},
"business_justification": "Expose the new loan quote endpoint for the mobile app."
}Example success response
{
"dynamic_change_request_id": "0d1c9e3c-6c2b-4c1e-9a53-2d5b2f0d7f11",
"target_type": "DYNAMIC_RESOURCE_DOC",
"target_id": "",
"operation": "CREATE",
"status": "INITIATED",
"request_verb": "POST",
"request_path": "/obp/v4.0.0/management/dynamic-resource-docs",
"payload_hash": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"current_payload_hash": "",
"proposed_payload": {
"request_url": "/my_user/MY_USER_ID",
"success_response_body": {
"my_user_id": "some_id_value",
"name": "Jhon",
"age": 12,
"hobby": [
"coding"
],
"_optional_fields_": [
"hobby"
]
},
"example_request_body": {
"name": "Jhon",
"age": 12,
"hobby": [
"coding"
],
"_optional_fields_": [
"hobby"
]
},
"programming_lang": "Scala",
"bank_id": "gh.29.uk",
"roles": "CanCreateMyUser",
"summary": "Create My User",
"error_response_bodies": "OBP-50000: Unknown Error.,OBP-20001: User not logged in. Authentication is required!,OBP-20006: User is missing one or more roles: ,OBP-10001: Incorrect json format.",
"request_verb": "POST",
"description": "Create one User",
"tags": "Create-My-User",
"method_body": "%20%20%20%20val%20Some(resourceDoc)%20%3D%20callContext.resourceDocument%0A%20%20%20%20val%20hasRequestBody%20%3D%20callContext.httpBody.exists(_.nonEmpty)%0A%0A%20%20%20%20%2F%2F%20get%20Path%20Parameters%2C%20example%3A%0A%20%20%20%20%2F%2F%20if%20the%20requestUrl%20of%20resourceDoc%20is%20%2Fhello%2Fbanks%2FBANK_ID%2Fworld%0A%20%20%20%20%2F%2F%20the%20request%20path%20is%20%2Fhello%2Fbanks%2Fbank_x%2Fworld%0A%20%20%20%20%2F%2FpathParams.get(%22BANK_ID%22)%20will%20get%20Option(%22bank_x%22)%20value%0A%0A%20%20%20%20val%20myUserId%20%3D%20pathParams(%22MY_USER_ID%22)%0A%0A%0A%20%20%20%20val%20requestEntity%20%3D%20callContext.httpBody.filter(_.nonEmpty)%20match%20%7B%0A%20%20%20%20%20%20case%20Some(rawBody)%20%3D%3E%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20com.openbankproject.commons.util.JsonAliases.parse(rawBody).extract%5BRequestRootJsonClass%5D%0A%20%20%20%20%20%20%20%20%7D%20catch%20%7B%0A%20%20%20%20%20%20%20%20%20%20case%20e%3A%20MappingException%20%3D%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20errorResponse(s%22%24InvalidJsonFormat%20%24%7Be.msg%7D%22)%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20case%20None%20%3D%3E%0A%20%20%20%20%20%20%20%20return%20errorResponse(s%22%24InvalidRequestPayload%20Current%20request%20has%20no%20payload%22)%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20%2F%2F%20please%20add%20business%20logic%20here%0A%20%20%20%20val%20responseBody%3AResponseRootJsonClass%20%3D%20ResponseRootJsonClass(s%22%24%7BmyUserId%7D_from_path%22%2C%20requestEntity.name%2C%20requestEntity.age%2C%20requestEntity.hobby)%0A%20%20%20%20Future.successful%20%7B%0A%20%20%20%20%20%20(responseBody%2C%20HttpCode.%60200%60(callContext.callContext))%0A%20%20%20%20%7D",
"dynamic_resource_doc_id": "vce035ca-9a0f-4bfa-b30b-9003aa467f51",
"partial_function_name": "createUser"
},
"requestor_user_id": "9ca9a7e4-6d02-40e3-a129-0b2bf89de9b1",
"business_justification": "Expose the new loan quote endpoint for the mobile app.",
"checker_user_id": "",
"checker_comment": "",
"created_at": "1100-01-01T01:01:01.000Z",
"actioned_at": "",
"expires_at": "1100-01-01T01:01:01.000Z"
}Possible errors (5)
- OBP-20001: User not logged in. Authentication is required!
- OBP-10001: Incorrect json format.
- OBP-30350: This target type is not managed by maker/checker on this instance (see dynamic_code_approval_target_types).
- OBP-30352: The target of the dynamic change request does not exist.
- OBP-50000: Unknown Error.