---
title: "Upsert keyed on a column"
method: POST
path: "/modules/{moduleId}/records/upsert"
tags: ["Records"]
---

# Upsert keyed on a column

`POST /modules/{moduleId}/records/upsert`

## Request

- Base URL: `https://api.teamo360.com/api/v1`
- URL: `https://api.teamo360.com/api/v1/modules/{moduleId}/records/upsert`
- Auth: HTTP bearer

Update if a record matches fields[keyColumnId], create otherwise. Ambiguous keys (2+ matches) return per-item 409 UPSERT_AMBIGUOUS. Use Idempotency-Key for cross-instance retry safety.

Requires the `data:write` token scope.

## Path parameters

- `moduleId` string, required

## Request body

- object

## Response `200`

Success

## Other responses

- `400`: Malformed parameters or body
- `401`: Missing, invalid, expired, or legacy token
- `403`: Blocked by role, token scope, module grant, or org policy
- `404`: Entity missing or outside the principal’s access
- `429`: Rate limit exceeded - see Retry-After

---

[API](https://skmtc.dev/teamo360/apis/teamo-public-api.md) · [All operations](https://skmtc.dev/teamo360/apis/teamo-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/teamo360/apis/teamo-public-api/revisions/32528ecbc4f4?raw)
