---
title: "Update Contacts Table"
method: PATCH
path: "/v3/contacts/tables/{table_id}"
tags: ["Contacts Tables"]
---

# Update Contacts Table

`PATCH /v3/contacts/tables/{table_id}`

Rename a table, change its visibility, or reassign its owner. All fields except `owner` are optional — send only what changes.

> **Billing:** Free.

## Path parameters

- `table_id` string, required

## Request body

- TableUpdateRequest — `name`, `visibility`, and `archived` are all optional — send any subset; omitted fields stay unchanged. Sending none of them is a no-op. A partial update re-reads the persisted table first, so fields you don't send are never clobbered.
  - `name` string
  - `visibility` 'private' | 'shared'
  - `archived` boolean — Set `true` to archive the table (hides it from default List Tables results), `false` to restore it.
  - `owner` TableOwner, required — Identifies the user acting on the table, and resolves to a user on your account. Required on every table-route call when authenticating with an API key (there is no signed-in user) — omitting it returns `400`. Optional for OAuth/token callers, since the caller is already identified by the token; still accepted if you want to act on behalf of another owner.
    - `email` string, email — Must resolve to an existing user on the account tied to your API key.

## Response `200`

Table updated

- TableResponse
  - `data` TableStatusData — TableDto — static metadata for a table.
    - `tableId` string
    - `name` string
    - `entityType` 'contacts' | 'companies'
    - `visibility` 'private' | 'shared'
    - `status` 'active' | 'archived' | 'deleted' — Lifecycle state. `active` and `archived` are filterable via the List Tables `status` field; `deleted` is not a filterable status.
    - `owner` OwnerInfo — Resolved owner of the table. `id` is always present; `email` and `name` are resolved best-effort within the API key's account and may be omitted if resolution fails (in which case the object contains only `id`). Replaces the removed top-level `ownerId` field - this is a breaking change from the prior response shape.
      - `id` integer
      - `email` string, email
      - `name` string
    - `createdBy` CreatedBy — Where and by whom the table was created.
      - `surface` 'api' | 'mcp' | 'workspace'
      - `createdByUserId` integer
    - `workspaceUrl` string
    - `entityCount` integer
    - `isProcessing` boolean — Whether any column run is currently in progress on this table.
    - `columns` ColumnSummary[]
      - `columnId` string
      - `name` string
      - `type` 'lusha' | 'crm' | 'signal' | 'ai' | 'score'
      - `key` string, nullable
      - `isDefault` boolean — Default Lusha columns cannot be removed.
      - `addedAt` string, date-time
      - `updatedAt` string, date-time
      - `rowsNotRun` integer
      - `rowsProcessing` integer
      - `rowsSuccess` integer
      - `rowsNoData` integer
      - `rowsFailed` integer
  - `billing` V3Billing — Credit usage summary for a V3 API request
    - `creditsCharged` integer — Total credits charged for this request
    - `resultsReturned` integer — Number of successful results returned

## Other responses

- `400` — Bad request - invalid input data
- `401` — Unauthorized - invalid or missing API key
- `403` — Forbidden - account inactive, V3 access not enabled, or plan does not include this feature
- `404` — Not found - table does not exist or is not accessible to this account

---

[API](https://skmtc.net/lusha/apis/lusha-api-documentation.md) · [All operations](https://skmtc.net/lusha/apis/lusha-api-documentation/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/lusha/lusha-api-documentation/versions/4c51e40e3e67/schema)
