At my office we have separated the concept of Transaction and Bulk. The two seem very similar, but the way we draw the distinction is a transaction either passes or fails, but a bulk operation can be partially successful (or failed). The scenario you are describing we would categorize as a bulk action, and we actually defined a very generic way to submit these based on underlying resources.
In our case, since our bulk action is a description of underlying behaviors, we chose to return a 200, because the bulk operation worked, but the client is then expected to interpret the results to find out the details of each individual action.
In another case a client is requesting something to happen say for instance retrieve details about a dog. Let's say the dog resource is an aggregation of data from two backend systems. From a resiliency perspective some clients may want to get back the resource even if only one of the backend systems is up. We define this "partial-success" as part of the API specification that client should conform to/expect, and use our standard error structure to state there was a partial-success.
{
"name" : "Buffy",
"bread" : "Pomeranian"
...standard response properties...
"errors" : [
{
"typeId" : "PARTIAL_SUCCESS",
"description" : "One or more of the actions in this bulk request failed"
},
{
"typeId" : "MISSING_PROPERTIES",
"fields" : ["weight", "sex"]
}
]
}
And then in some circumstances we add addition error objects within the response, to state more clearly what went wrong.
So I guess to answer your question, we use 200, for the type of operation you are talking about, and consider the error handling part of the application protocol not part of the transfer protocol. That being said we would prefer a 2XX level error response to specify this state, so we could more easily track it at the transfer protocol level. We looked at 206, but didn't feel quite right, I hadn't see 207, but since it is intended for webdav, not sure I would go that route.