> This page is for version v2.0 (default).
> For other versions, use one of these documentation indexes:
> - v2.0 (default): https://docs.cable.tech/v-2-0/llms.txt
> - v1.0: https://docs.cable.tech/v-1-0/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.cable.tech/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.cable.tech/_mcp/server.

# Update onboarding flow in batch

PUT https://api.cable.tech/v2/onboarding_flow
Content-Type: application/json

Reference: https://docs.cable.tech/api-documentation/api-reference/onboarding-flow/update-onboarding-flows

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Body (application/json)

This endpoint expects a list of OnboardingFlow.

- `list of OnboardingFlow`

## Response

### 200

Onboarding flows updated successfully

- `success` (boolean, required) — Indicates if the write operation was successful.
- `write_count` (integer, required) — The number of records written to the database.
- `message` (string, required) — Provides additional information about the operation result.
- `organization_id` (string, required) — The organization ID for which the operation was performed.

## Errors

### 400 Bad Request Error

Onbnoarding flow data

- `code` (integer, required)
- `message` (string, required)
- `errors` (list of GeneralErrorErrorsItems, optional) — Detailed information about errors in specific fields.

### 401 Unauthorized Error

Unauthorized request

- `code` (integer, required)
- `message` (string, required)
- `errors` (list of GeneralErrorErrorsItems, optional) — Detailed information about errors in specific fields.

### 404 Not Found Error

Onboarding flow not found

- `code` (integer, required)
- `message` (string, required)
- `errors` (list of GeneralErrorErrorsItems, optional) — Detailed information about errors in specific fields.

### 429 Too Many Requests Error

Rate limit exceeded

- `code` (integer, required)
- `message` (string, required)
- `errors` (list of GeneralErrorErrorsItems, optional) — Detailed information about errors in specific fields.

### 500 Internal Server Error

Server error

- `code` (integer, required)
- `message` (string, required)
- `errors` (list of GeneralErrorErrorsItems, optional) — Detailed information about errors in specific fields.

## Types

### OnboardingFlow

Request body for adding Onboarding Flow information for a parent entity, applicable to both retail and business contexts

- `onboarding_flow_id` (string, required) — Unique identifier for an onboarding flow belonging to an onboarding flow. This is the primary key for an onboarding flow and should be unique across all onboarding flows. Updates to an onboarding flow should be made using this identifier.
- `timestamp` (datetime, required) — When this onboarding flow step occurred in your system, in ISO 8601 format.
- `flow_name` (string, required) — Latest onboarding flow that this entity has gone through, e.g. manual KYC, automated onboarding, Simplified Due Diligence, Enhanced Due Diligence
- `outcome` (string, required) — Outcome for the latest onboarding flow that this entity has gone through, e.g. automated approval, manual approval, automated rejection, manual rejection, EDD required
- `related_company_id` (string, optional) — Unique identifier of the related company entity (used for business contexts). Only one of related_company_id and related_person_id can be specified.
- `related_person_id` (string, optional) — Unique identifier of the related person entity (used for retail contexts or when a person is the subject). Only one of related_company_id and related_person_id can be specified.
- `outcome_reason` (OnboardingFlowOutcomeReason, optional)

### GeneralErrorErrorsItems

- `field` (string, optional)
- `message` (string, optional)

### OnboardingFlowOutcomeReason

- string
- map from string to any

## Examples

**Request**

```json
[
  {
    "onboarding_flow_id": "flow-9a8b7c6d5e4f3g2h1i0j",
    "timestamp": "2024-01-15T09:30:00Z",
    "flow_name": "Manual KYC",
    "outcome": "automated approval"
  }
]
```

**Response**

```json
{
  "success": true,
  "write_count": 1,
  "message": "Onboarding flow updated successfully.",
  "organization_id": "org-1234567890abcdef"
}
```

**SDK Code**

```python
import requests

url = "https://api.cable.tech/v2/onboarding_flow"

payload = [
    {
        "onboarding_flow_id": "flow-9a8b7c6d5e4f3g2h1i0j",
        "timestamp": "2024-01-15T09:30:00Z",
        "flow_name": "Manual KYC",
        "outcome": "automated approval"
    }
]
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.cable.tech/v2/onboarding_flow';
const options = {
  method: 'PUT',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '[{"onboarding_flow_id":"flow-9a8b7c6d5e4f3g2h1i0j","timestamp":"2024-01-15T09:30:00Z","flow_name":"Manual KYC","outcome":"automated approval"}]'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.cable.tech/v2/onboarding_flow"

	payload := strings.NewReader("[\n  {\n    \"onboarding_flow_id\": \"flow-9a8b7c6d5e4f3g2h1i0j\",\n    \"timestamp\": \"2024-01-15T09:30:00Z\",\n    \"flow_name\": \"Manual KYC\",\n    \"outcome\": \"automated approval\"\n  }\n]")

	req, _ := http.NewRequest("PUT", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.cable.tech/v2/onboarding_flow")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "[\n  {\n    \"onboarding_flow_id\": \"flow-9a8b7c6d5e4f3g2h1i0j\",\n    \"timestamp\": \"2024-01-15T09:30:00Z\",\n    \"flow_name\": \"Manual KYC\",\n    \"outcome\": \"automated approval\"\n  }\n]"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.put("https://api.cable.tech/v2/onboarding_flow")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("[\n  {\n    \"onboarding_flow_id\": \"flow-9a8b7c6d5e4f3g2h1i0j\",\n    \"timestamp\": \"2024-01-15T09:30:00Z\",\n    \"flow_name\": \"Manual KYC\",\n    \"outcome\": \"automated approval\"\n  }\n]")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://api.cable.tech/v2/onboarding_flow', [
  'body' => '[
  {
    "onboarding_flow_id": "flow-9a8b7c6d5e4f3g2h1i0j",
    "timestamp": "2024-01-15T09:30:00Z",
    "flow_name": "Manual KYC",
    "outcome": "automated approval"
  }
]',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.cable.tech/v2/onboarding_flow");
var request = new RestRequest(Method.PUT);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "[\n  {\n    \"onboarding_flow_id\": \"flow-9a8b7c6d5e4f3g2h1i0j\",\n    \"timestamp\": \"2024-01-15T09:30:00Z\",\n    \"flow_name\": \"Manual KYC\",\n    \"outcome\": \"automated approval\"\n  }\n]", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  [
    "onboarding_flow_id": "flow-9a8b7c6d5e4f3g2h1i0j",
    "timestamp": "2024-01-15T09:30:00Z",
    "flow_name": "Manual KYC",
    "outcome": "automated approval"
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.cable.tech/v2/onboarding_flow")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PUT"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```