diff --git a/dump-extensions/openpower-dumps/dump_manager_resource.cpp b/dump-extensions/openpower-dumps/dump_manager_resource.cpp
index de27c94..020556c 100644
--- a/dump-extensions/openpower-dumps/dump_manager_resource.cpp
+++ b/dump-extensions/openpower-dumps/dump_manager_resource.cpp
@@ -73,7 +73,7 @@
 }
 
 sdbusplus::message::object_path
-    Manager::createDump(std::map<std::string, std::string> params)
+    Manager::createDump(phosphor::dump::DumpCreateParams params)
 {
 
     using NotAllowed =
@@ -87,6 +87,10 @@
             Reason("Resource dump can be initiated only when the host is up"));
         return std::string();
     }
+
+    using InvalidArgument =
+        sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
+    using Argument = xyz::openbmc_project::Common::InvalidArgument;
     using CreateParameters =
         sdbusplus::com::ibm::Dump::server::Create::CreateParameters;
 
@@ -95,12 +99,61 @@
     auto objPath = std::filesystem::path(baseEntryPath) / idString;
     std::time_t timeStamp = std::time(nullptr);
 
-    std::string vspString = params[sdbusplus::com::ibm::Dump::server::Create::
-                                       convertCreateParametersToString(
-                                           CreateParameters::VSPString)];
-    std::string pwd =
-        params[sdbusplus::com::ibm::Dump::server::Create::
-                   convertCreateParametersToString(CreateParameters::Password)];
+    std::string vspString;
+    auto iter = params.find(
+        sdbusplus::com::ibm::Dump::server::Create::
+            convertCreateParametersToString(CreateParameters::VSPString));
+    if (iter == params.end())
+    {
+        // Host will generate a default dump if no resource selector string
+        // is provided. The default dump will be a non-disruptive system dump.
+        log<level::INFO>(
+            "VSP string is not provided, a non-disruptive system dump will be "
+            "generated by the host");
+    }
+    else
+    {
+        try
+        {
+            vspString = std::get<std::string>(iter->second);
+        }
+        catch (const std::bad_variant_access& e)
+        {
+            // Exception will be raised if the input is not string
+            log<level::ERR>(
+                fmt::format("An invalid  vsp string is passed errormsg({})",
+                            e.what())
+                    .c_str());
+            elog<InvalidArgument>(Argument::ARGUMENT_NAME("VSP_STRING"),
+                                  Argument::ARGUMENT_VALUE("INVALID INPUT"));
+        }
+    }
+
+    std::string pwd;
+    iter = params.find(
+        sdbusplus::com::ibm::Dump::server::Create::
+            convertCreateParametersToString(CreateParameters::Password));
+    if (iter == params.end())
+    {
+        log<level::ERR>("Required argument password is missing");
+        elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSOWORD"),
+                              Argument::ARGUMENT_VALUE("MISSING"));
+    }
+
+    try
+    {
+        pwd = std::get<std::string>(iter->second);
+    }
+    catch (const std::bad_variant_access& e)
+    {
+        // Exception will be raised if the input is not string
+        log<level::ERR>(
+            fmt::format("An invalid password string is passed errormsg({})",
+                        e.what())
+                .c_str());
+        elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSWORD"),
+                              Argument::ARGUMENT_VALUE("INVALID INPUT"));
+    }
 
     try
     {
