Bulk Delete Rows
curl --request DELETE \
--url https://api.sublay.io/v7/:projectId/db/:tableName \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"rowIds": [
"<string>"
],
"filters": [
{}
],
"force": true
}
'import requests
url = "https://api.sublay.io/v7/:projectId/db/:tableName"
payload = {
"rowIds": ["<string>"],
"filters": [{}],
"force": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.delete(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'DELETE',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({rowIds: ['<string>'], filters: [{}], force: true})
};
fetch('https://api.sublay.io/v7/:projectId/db/:tableName', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sublay.io/v7/:projectId/db/:tableName",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_POSTFIELDS => json_encode([
'rowIds' => [
'<string>'
],
'filters' => [
[
]
],
'force' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sublay.io/v7/:projectId/db/:tableName"
payload := strings.NewReader("{\n \"rowIds\": [\n \"<string>\"\n ],\n \"filters\": [\n {}\n ],\n \"force\": true\n}")
req, _ := http.NewRequest("DELETE", 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(string(body))
}HttpResponse<String> response = Unirest.delete("https://api.sublay.io/v7/:projectId/db/:tableName")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"rowIds\": [\n \"<string>\"\n ],\n \"filters\": [\n {}\n ],\n \"force\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sublay.io/v7/:projectId/db/:tableName")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"rowIds\": [\n \"<string>\"\n ],\n \"filters\": [\n {}\n ],\n \"force\": true\n}"
response = http.request(request)
puts response.read_body{
"deletedCount": 123,
"soft": true
}Custom Tables — Rows
Bulk Delete Rows
Delete many custom-table rows by ID list, filter predicate, or both
Bulk Delete Rows
curl --request DELETE \
--url https://api.sublay.io/v7/:projectId/db/:tableName \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"rowIds": [
"<string>"
],
"filters": [
{}
],
"force": true
}
'import requests
url = "https://api.sublay.io/v7/:projectId/db/:tableName"
payload = {
"rowIds": ["<string>"],
"filters": [{}],
"force": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.delete(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'DELETE',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({rowIds: ['<string>'], filters: [{}], force: true})
};
fetch('https://api.sublay.io/v7/:projectId/db/:tableName', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sublay.io/v7/:projectId/db/:tableName",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_POSTFIELDS => json_encode([
'rowIds' => [
'<string>'
],
'filters' => [
[
]
],
'force' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.sublay.io/v7/:projectId/db/:tableName"
payload := strings.NewReader("{\n \"rowIds\": [\n \"<string>\"\n ],\n \"filters\": [\n {}\n ],\n \"force\": true\n}")
req, _ := http.NewRequest("DELETE", 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(string(body))
}HttpResponse<String> response = Unirest.delete("https://api.sublay.io/v7/:projectId/db/:tableName")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"rowIds\": [\n \"<string>\"\n ],\n \"filters\": [\n {}\n ],\n \"force\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sublay.io/v7/:projectId/db/:tableName")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"rowIds\": [\n \"<string>\"\n ],\n \"filters\": [\n {}\n ],\n \"force\": true\n}"
response = http.request(request)
puts response.read_body{
"deletedCount": 123,
"soft": true
}Deletes multiple rows in one request and reports how many were removed.
Targets are selected by an ID list, a filter predicate, or both — at least one is required, so an empty body cannot wipe a table by accident.
Row endpoints capture the caller’s identity but enforce no authorization — any caller who can reach your project can delete these rows. See Security: open row CRUD.
Path Parameters
string
required
Logical name of the custom table — pass
orders, not custom_orders.Body Parameters
string[]
Between 1 and 100 row IDs to delete.
object[]
Up to 50 filter clauses, AND-combined, in the same
{ column, operator, value } form as Fetch Rows — but as a real JSON array here, not a JSON-encoded string. A column that does not exist fails with database/invalid-filter-column.boolean
true hard-deletes even on a paranoid table. Defaults to false.{
"filters": [{ "column": "status", "operator": "eq", "value": "archived" }],
"force": false
}
Supplying both
rowIds and filters narrows the target set — a row must match the filters and be in the ID list.Response
number
How many rows were deleted.
0 is a successful response, not an error.boolean
Whether the rows were soft-deleted or removed permanently.
Error Responses
Invalid Body — 400
Invalid Body — 400
No delete target was given — neither
rowIds nor filters was supplied, or both were empty arrays — or one exceeded its cap (100 IDs, 50 filters).{ "error": "Bad Request", "code": "database/invalid-body" }
Invalid Filter Column — 400
Invalid Filter Column — 400
{
"error": "Bad Request",
"code": "database/invalid-filter-column",
"column": "<column name>"
}
Table Not Found — 404
Table Not Found — 404
{ "error": "Not Found", "code": "database/table-not-found" }
Server Error — 500
Server Error — 500
{ "error": "Internal Server Error", "code": "database/server-error" }

