API Explorer 935 endpoints

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.
Implemented by OBPv7.0.0 createDynamicChangeRequest