How can I update a single submission through /data/bulk/?

Hello Kobo team,

I am trying to update a single submission through the API and I am having trouble identifying the correct selector.

I have reviewed several community posts regarding bulk updates, including examples where the payload uses:

{
   "payload": {
      "submission_ids": [123456789], 
      "data": {
         "question_name": "new_value"
      }
   }
}

However, in my environment I have not been able to make this work as expected. Using the endpoint:

PATCH /api/v2/assets/{asset_uid}/data/bulk/

I can successfully update submission values. For example:

{ 
  "payload": {
       "_id": 848744105,
       "data": {
          "date": "2026-08-11"
    },
    "confirm": true
  }
}

The update succeeds and the field value changes. However, instead of updating only the specified submission, Kobo updates every submission in the project.

The response is:

{
  "count": 15
  "successes": 15,
  "failures": 0
}

which matches the total number of submissions in the test project.

I also tested:

“_id”: [848744105]

and

"_id": {
    "$in": [848744105]
}

with the same result.

My questions are:

  1. What is the correct payload to update a single submission through /data/bulk/?
  2. Should I be using submission_ids, _id, _uuid, rootUuid, or another identifier?
  3. Is there an API endpoint specifically intended for editing one submission at a time?

Thanks

Pablo

Hey Pablo,

I think I see the issue. Looking at all three things you tried (_id, _id as an array, and _id with $in) — none of those are actually submission_ids, which is the field the bulk endpoint actually filters on. That’s probably why it’s grabbing every submission every time if the endpoint doesn’t recognize the selector you’re sending, it just falls back to matching everything in the project. Which lines up with your count of 15 no matter what variation you tried.

Someone from the Kobo team (Kal_Lam) posted a working example in another thread a while back, and it looks like this:

let me just bring it up again and you try it.
{
“payload”: {
“submission_ids”: [848744105],
“data”: {
“date”: “2026-08-11”
}
}
}

So just swap _id for submission_ids and put your id inside a list, even if it’s just one. Don’t use _uuid or rootUuid either, those aren’t accepted here — and the $in syntax is for the query param on GET requests, not for selecting rows on /data/bulk/.

As for a dedicated single-submission endpoint doesn’t look like one exists in v2 right now, there’s an open GitHub issue about it (kpi#3190). So /data/bulk/ with a one-item array in submission_ids is basically the way to do it.

Give that a shot and let us know if it’s still hitting all 15 if so it’s probably something specific to your project setup rather than the payload itself.

Hi @shadesl

The issue was that I was sending the payload in the wrong format. Using submission_ids and sending the request exactly as shown in the examples (data={"payload": json.dumps(payload)}) worked correctly and updated only the target submission. Thank you for the help.