# Delete (https://v1.s3.dimah.dev/docs/react/custom-backend/delete)

Deletion is a direct backend mutation, not a presigned client-to-S3 transfer.

## Delete one [#delete-one]

`delete` receives a `route` and one object `key`.

<AutoTypeTable
  path="packages/core/src/types/requests.ts"
  name="DeletePayload"
/>

<AutoTypeTable
  path="packages/core/src/types/responses.ts"
  name="DeleteResponse"
/>

```ts
import type { DeletePayload, DeleteResponse } from "@dimah-s3/core";
```

## Example [#example]

Add this to the [`defineApi`](https://v1.s3.dimah.dev/docs/react/custom-backend) skeleton.
[`@dimah-s3/server`](https://v1.s3.dimah.dev/docs/server) uses `DELETE /api/s3/delete?route=…&key=…`.

```ts
async delete(payload) {
  const params = new URLSearchParams({
    route: payload.route,
    key: payload.key,
  });

  const res = await fetch(`/api/files/delete?${params}`, { method: "DELETE" });
  if (!res.ok) throw new Error(await res.text());
  return res.json();
}
```

## Delete many [#delete-many]

`deleteMany` receives one route and between 1 and 100 keys. Return one result
for every input key so the React hook can preserve partial successes and expose
per-object errors.

<AutoTypeTable
  path="packages/core/src/types/requests.ts"
  name="DeleteBatchPayload"
/>

<AutoTypeTable
  path="packages/core/src/types/responses.ts"
  name="DeleteBatchResponse"
/>

```ts
import type { DeleteBatchPayload, DeleteBatchResponse } from "@dimah-s3/core";
```

```ts
async deleteMany(payload) {
  const res = await fetch("/api/files/delete-batch", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(payload),
  });

  if (!res.ok) throw new Error(await res.text());
  return res.json();
}
```
