---
title: "upsertEntity"
method: PATCH
path: "/v1/entity/{slug}:upsert"
tags: ["Entities"]
---

# upsertEntity

`PATCH /v1/entity/{slug}:upsert`

Create or update an entity using `unique_key`

- If no entities are matched, a new entity is created.
- If exactly one entity is matched, a `PATCH`-style update is applied to the existing entity.

## Activity

If no `activity_id` query parameter is provided, implicitly creates Activity of type `EntityCreated` or `EntityUpdated`

## Path parameters

- `slug` string, required — URL-friendly identifier for the entity schema

## Query parameters

- `activity_id` union
  - string, ulid — See https://github.com/ulid/spec
  - '' | 'null', nullable
- `fill_activity` boolean
- `dry_run` boolean
- `async` boolean
- `validate` boolean
- `strict` boolean

## Request body

- object
  - `unique_key` string[], required
  - `entity` Entity, required
    - `_id` string, uuid
    - `_org` string — Organization Id the entity belongs to
    - `_owners` EntityOwner[]
      - `org_id` string, required
      - `user_id` string
    - `_schema` string — URL-friendly identifier for the entity schema
    - `_title` string, nullable — Title of entity
    - `_tags` string[], nullable
    - `_created_at` string, date-time, nullable
    - `_updated_at` string, date-time, nullable
    - `_deleted_at` string, date-time, nullable
    - `_acl` object — Access control list (ACL) for an entity. Defines sharing access to external orgs or users.
      - `view` string[]
      - `edit` string[]
      - `delete` string[]
    - `_purpose` string[], nullable
    - `_purpose_name` string[], nullable — Automatically computed purpose names from _purpose attribute
    - `_manifest` string[], nullable — Manifest ID used to create/update the entity
    - `_changesets` object, nullable — Pending attribute changesets for attributes configured with external or approval edit mode. The value shape is `Changeset` (`proposed_value`, `created_at`, `edit_mode`, ...) and is what `:apply` / `:dismiss` operate on. Read-only via normal entity PATCH/PUT operations — those handlers strip `_changesets` from request bodies. Use the changeset management endpoints to mutate this field.

## Response `200`

Entity was updated

- EntityItem
  - `_id` string, uuid, required
  - `_org` string, required — Organization Id the entity belongs to
  - `_owners` EntityOwner[]
    - `org_id` string, required
    - `user_id` string
  - `_schema` string, required — URL-friendly identifier for the entity schema
  - `_title` string, nullable, required — Title of entity
  - `_tags` string[], nullable
  - `_created_at` string, date-time, nullable, required
  - `_updated_at` string, date-time, nullable, required
  - `_deleted_at` string, date-time, nullable
  - `_acl` object — Access control list (ACL) for an entity. Defines sharing access to external orgs or users.
    - `view` string[]
    - `edit` string[]
    - `delete` string[]
  - `_purpose` string[], nullable
  - `_purpose_name` string[], nullable — Automatically computed purpose names from _purpose attribute
  - `_manifest` string[], nullable — Manifest ID used to create/update the entity
  - `_changesets` object, nullable — Pending attribute changesets for attributes configured with external or approval edit mode. The value shape is `Changeset` (`proposed_value`, `created_at`, `edit_mode`, ...) and is what `:apply` / `:dismiss` operate on. Read-only via normal entity PATCH/PUT operations — those handlers strip `_changesets` from request bodies. Use the changeset management endpoints to mutate this field.

## Other responses

- `201` — Entity was created
- `405` — Deleted entities cannot be updated. You'll need to recover the entity first before updating.
- `409` — Conflict: multiple entities were matched with `unique_key`
- `422` — Entity validation error when `?validate=true`
- `429` — Too many requests

---

[API](https://skmtc.net/epilot/apis/entity-api.md) · [All operations](https://skmtc.net/epilot/apis/entity-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/epilot/entity-api/versions/8dd3d44e1c4f/schema)
