> This page is for Developer.

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

# Insert / Update Records

PUT https://ebs.feedonomics.com/catalog/rest.php/db/{db_id}
Content-Type: application/json

Insert and/or update the provided record(s) in the database.

### Optimizing Performance

**Batch Size**

When making PUT requests to operate on your data, determining an optimal batch size (number of records per request) can help increase overall throughput.

Depending on individual record size, an ideal batch size is typically between 50 - 150 records per request to balance throughput and API response time.

The following table displays performance based on an average individual record size of 1KB:

| Requests Per Minute | Batch Size (Rows Per Request) | Row Updates Per Minute |
| ------------------- | ----------------------------- | ---------------------- |
| Up to 1000          | 1                             | 1000                   |
| Up to 300           | 25                            | 7500                   |
| Up to 300           | 50                            | 15000                  |
| Up to 180           | 100                           | 18000                  |
| Up to 40            | 500                           | 20000                  |

Reference: https://docs.feedonomics.com/developer/api-reference/rest/event-driven-sync-api-edrts/data-operations/edrts-put

## Authentication

- `x-api-key` header (required) — API Key authentication via header

## Request

### Path parameters

- `db_id` (integer, required) — Unique ID of the database

### Body (application/json)

This endpoint expects a list of DbDbIdPutRequestBodyContentApplicationJsonSchemaItems.

- `list of DbDbIdPutRequestBodyContentApplicationJsonSchemaItems`

## Response

### 200

OK

- `status` (string, optional, default: success) — API response status.
- `data` (GetStatusResponseData, optional)

### 202

Accepted - Request Queued

- `status` (string, optional, default: success) — API response status.
- `data` (DataPutQueuedResponseData, optional)

## Errors

### 400 Bad Request Error

Bad Request

- `status` (string, optional, default: fail) — API response status.
- `message` (string, optional) — Error code.
- `data` (list of BadRequestErrorDataItems, optional) — Additional error detail, if applicable.

### 403 Forbidden Error

Access Denied / Authentication Failure

- `status` (string, optional, default: fail) — API response status.
- `message` (string, optional) — Error code.
- `data` (list of AccessDeniedErrorDataItems, optional) — Additional error detail, if applicable.

### 502 Bad Gateway Error

HTTPS request is missing required headers

- `status` (string, optional) — API response status.
- `message` (string, optional) — Error code.
- `data` (MissingHeaderErrorData, optional)

### 500 Server Error

Internal Server Error

- `any`

## Types

### DbDbIdPutRequestBodyContentApplicationJsonSchemaItems

### GetStatusResponseData

- `requests_in_queue` (integer, optional) — Requests that have been queued but still waiting to be processed.
- `last_processed_job` (GetStatusResponseDataLastProcessedJob, optional, nullable) — Details about most recently executed job, otherwise `null`.

### DataPutQueuedResponseData

- `sku_count` (integer, optional) — Count of records inserted and/or updated as a result from PUT request.
- `batches` (list of DataPutQueuedResponseDataBatchesItems, optional)

### BadRequestErrorDataItems

### AccessDeniedErrorDataItems

### MissingHeaderErrorData

- `details` (string, optional) — Description of error message.
- `headers` (MissingHeaderErrorDataHeaders, optional) — Array of provided headers in the HTTP request.

### GetStatusResponseDataLastProcessedJob

Details about most recently executed job, otherwise `null`.

- `id` (string, optional) — Correlation ID for most recently executed job.
- `received_timestamp` (string, optional) — Datetime in RFC3339 format of when the request was received.
- `processed_timestamp` (string, optional) — Datetime in RFC3339 format of when the request was processed.
- `processing_time` (integer, optional) — Duration in seconds between the time the request was received and processed.
- `details_url` (string, optional) — Endpoint to retrieve additional detail about the specific correlation ID.

### DataPutQueuedResponseDataBatchesItems

- `db_id` (integer, optional) — Unique ID of the database.
- `correlation_id` (string, optional) — Unique ID assigned to the request's associated job.
- `batch_index` (integer, optional, default: 0) — Batch number index for the job correlation id.
- `status` (string, optional, default: queued) — Current job status; will be "queued" for HTTP 202.

### MissingHeaderErrorDataHeaders

Array of provided headers in the HTTP request.

- `cookie` (string, optional)
- `content-type` (string, optional)
- `postman-token` (string, optional)
- `host` (string, optional)
- `content-length` (string, optional)

## Examples

**Request**

```json
"id,name,description\n1,hello,“This product is exciting and new!”\n2,world,\"another description\"\n"
```

**SDK Code**

```python Data Operations_edrts-put_example (text/csv)
import requests

url = "https://ebs.feedonomics.com/catalog/rest.php/db/:db_id"

payload = "id,name,description
1,hello,“This product is exciting and new!”
2,world,\"another description\"
"
headers = {
    "x-api-key": "<apiKey>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript Data Operations_edrts-put_example (text/csv)
const url = 'https://ebs.feedonomics.com/catalog/rest.php/db/:db_id';
const options = {
  method: 'PUT',
  headers: {'x-api-key': '<apiKey>', 'Content-Type': 'application/json'},
  body: '"id,name,description\n1,hello,“This product is exciting and new!”\n2,world,\"another description\"\n"'
};

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

```go Data Operations_edrts-put_example (text/csv)
package main

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

func main() {

	url := "https://ebs.feedonomics.com/catalog/rest.php/db/:db_id"

	payload := strings.NewReader("\"id,name,description\\n1,hello,“This product is exciting and new!”\\n2,world,\\\"another description\\\"\\n\"")

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

	req.Header.Add("x-api-key", "<apiKey>")
	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 Data Operations_edrts-put_example (text/csv)
require 'uri'
require 'net/http'

url = URI("https://ebs.feedonomics.com/catalog/rest.php/db/:db_id")

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

request = Net::HTTP::Put.new(url)
request["x-api-key"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "\"id,name,description\\n1,hello,“This product is exciting and new!”\\n2,world,\\\"another description\\\"\\n\""

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

```java Data Operations_edrts-put_example (text/csv)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.put("https://ebs.feedonomics.com/catalog/rest.php/db/:db_id")
  .header("x-api-key", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("\"id,name,description\\n1,hello,“This product is exciting and new!”\\n2,world,\\\"another description\\\"\\n\"")
  .asString();
```

```php Data Operations_edrts-put_example (text/csv)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://ebs.feedonomics.com/catalog/rest.php/db/:db_id', [
  'body' => '"id,name,description\\n1,hello,“This product is exciting and new!”\\n2,world,\\"another description\\"\\n"',
  'headers' => [
    'Content-Type' => 'application/json',
    'x-api-key' => '<apiKey>',
  ],
]);

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

```csharp Data Operations_edrts-put_example (text/csv)
using RestSharp;

var client = new RestClient("https://ebs.feedonomics.com/catalog/rest.php/db/:db_id");
var request = new RestRequest(Method.PUT);
request.AddHeader("x-api-key", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "\"id,name,description\\n1,hello,“This product is exciting and new!”\\n2,world,\\\"another description\\\"\\n\"", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Data Operations_edrts-put_example (text/csv)
import Foundation

let headers = [
  "x-api-key": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = "id,name,description
1,hello,“This product is exciting and new!”
2,world,\"another description\"
" as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://ebs.feedonomics.com/catalog/rest.php/db/:db_id")! 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()
```