# convert_property

Change a property's kind without losing values.

`POST /v1/properties/{propertyDefId}/convert` · MCP tool `convert_property` · scope `write` · beta · since 2026-09-30

The kind changes that keep every stored value: singleSelect to checkbox (each value becomes a one-item list), checkbox to singleSelect (refused while any spot holds more than one option), shortLabel to longSection and back (long to short only when every value fits one line). Use it when one answer per spot turns out to be too few (entry free on foot but a timed car park booking). Any other change is a new property plus archive_property on the old one. For a one-line qualifier next to a value, use update_spot customNotes instead.

## Path parameters

- `propertyDefId` (string, required): Id of the property definition (from list_properties).

## Body parameters

- `toKind` (string, required): The new kind: checkbox, singleSelect, shortLabel or longSection (see the allowed pairs above). One of `shortLabel`, `checkbox`, `singleSelect`, `number`, `date`, `longSection`.

## Returns

200.

- `ok` (boolean, required): Always true: the write went through. Always `true`.
- `propertyDefId` (string, required): The property's id.
- `kind` (string, required): The property's new kind.
- `schemaVersion` (number, required): The guide's property schema version after the change.
- `spotsChanged` (number, required): Spots whose stored value changed shape.

## Examples

### Let a spot hold more than one best time (single select to checkbox)

```bash
curl -X POST "https://sceniq.earth/api/v1/properties/kh75t2w9q4r6y8v0j1p3p5a7s9d1f3g5/convert" \
  -H "Authorization: Bearer $SCENIQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "toKind": "checkbox"
}'
```

MCP `tools/call`:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "convert_property",
    "arguments": {
      "propertyDefId": "kh75t2w9q4r6y8v0j1p3p5a7s9d1f3g5",
      "toKind": "checkbox"
    }
  }
}
```

Response 200:

```json
{
  "ok": true,
  "propertyDefId": "kh75t2w9q4r6y8v0j1p3p5a7s9d1f3g5",
  "kind": "checkbox",
  "schemaVersion": 9,
  "spotsChanged": 12
}
```

## Errors

- `invalid_argument` (400): A required field is missing, a field is unknown, or a value does not match its type (the Convex validator's path and value are in the message).
- `invalid_request` (400): A writer refused a value: a map link on a host that is not allowed, a title that is too long, a date that does not exist, too many items in a list. The message is the writer's own sentence.
- `unauthenticated` (401): The request carries no key. Send it as Authorization: Bearer sk_sceniq_... (or X-Api-Key).
- `invalid_api_key` (401): The key is unknown, revoked or expired.
- `api_scope_required` (403): A read-only key called a write operation, or a key without the publish option called publish_changes.
- `forbidden` (403): The key belongs to a creator account that is no longer active.
- `not_found` (404): The id does not exist or belongs to another creator. The two answers are identical on purpose, so ids never reveal what exists.
- `payload_too_large` (413): A JSON body over 2 MB, an image over 6 MB, a batch upload over 19 MB, or an MCP message over 2 MB.
- `rate_limited` (429): Over a limit: requests per key per minute, per creator per hour, uploads per key per minute, or check_links per guide per hour.
- `internal_error` (500): An unexpected failure. The message is hidden on purpose.

Reference: https://developers.sceniq.earth/reference/convert_property
