Q:

How to access nested dictionary?

I can print this in the debugger:
(lldb) print params["message"]!
([String : String]) $R5 = 2 key/value pairs {
  [0] = (key = "body", value = "iPadUser has started a new stream")
  [1] = (key = "title", value = "Stream started")
}

But I am trying to figure out how to access the body and title separately.
I construct params in this way:
            let recipients = ["custom_ids":[recips]]
            let notificationDetails = "hello there"
            let content = [
                "title":title,
                "body":details
            ]
            let params: [String:Any] = [
                "group_id":"stream_requested",
                "recipients": recipients,
                "message": content
            ]

A:

print((params["message"] as! [String: Any])["title"] as! String)

You need to cast the Dictionary value as specific type, since the compiler doesn't know what to expect. (Please mind that you mustn't use force unwrap in other way than example code.)
Considering you need to fetch array values when recipients dictionary looks like this: 
let recipients = ["custom_ids":["recipe1", "recipe2", "etc"]]

get to the ids like this:
guard let recipients = params["recipients"] as? [String: Any],
      let customIDs = recipients["custom_ids"] as? [String] 
else { return }

for id in customIDs {
    print(id) // Gets your String value
}

