# Replace Business contacts

`PUT /businesses/{business_id}/people/`

Required permission: `businesses:write`. All records and related selectors must remain inside the key's selected access targets.

Base URL: https://api.staging.levr.ai/v1

Authentication: Bearer — Portal API key

[REST guide](https://docs.staging.levr.ai/rest-api.md) · [OpenAPI specification](https://docs.staging.levr.ai/generated/openapi.json)

Required permissions: `businesses:write`.

Available scopes: Entire Portal or Selected source channels. The record must also belong to the key’s selected scope.

## Parameters

### business_id (path)

Type: string. Required: yes.

Schema:



```json
{
  "pattern": "^biz_[a-z0-9]+$",
  "type": "string"
}
```

### If-Match (header)

Type: string. Required: yes.

Schema:



```json
{
  "pattern": "^\"?[0-9]+\"?$",
  "type": "string"
}
```

### Idempotency-Key (header)

Type: string. Required: yes.

Schema:



```json
{
  "maxLength": 255,
  "minLength": 1,
  "type": "string"
}
```

## Request body

Content type: application/json. Required: yes.

Send a body that matches the published schema.

### Schema



```json
{
  "additionalProperties": false,
  "properties": {
    "new_people": {
      "description": "Create and attach contacts within this record using its Write permission. Email is normalized; an existing contact already reachable in the selected scope is reused without changing stored fields. Contacts outside that scope are rejected. The combined set replaces the current relationships. Returns only Person references; reading or editing contact details requires People permission.",
      "items": {
        "additionalProperties": false,
        "properties": {
          "company_name": {
            "maxLength": 500,
            "type": "string"
          },
          "email": {
            "format": "email",
            "maxLength": 254,
            "type": "string"
          },
          "full_name": {
            "maxLength": 500,
            "type": "string"
          },
          "job_title": {
            "maxLength": 500,
            "type": "string"
          },
          "phone_number": {
            "maxLength": 500,
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "type": "object"
      },
      "maxItems": 500,
      "type": "array"
    },
    "person_ids": {
      "items": {
        "pattern": "^pers_[a-z0-9]+$",
        "type": "string"
      },
      "maxItems": 500,
      "type": "array",
      "uniqueItems": true
    },
    "primary_person_id": {
      "anyOf": [
        {
          "pattern": "^pers_[a-z0-9]+$",
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "person_ids"
  ],
  "type": "object"
}
```

### Example



```json
{
  "person_ids": [
    "pers_2m8q7c9k4x6p3n5d"
  ]
}
```

## Example request

```sh
curl --request PUT \
  --url "https://api.staging.levr.ai/v1/businesses/$BUSINESS_ID/people/" \
  --header "Authorization: Bearer $LEVR_API_KEY" \
  --header "If-Match: $IF_MATCH" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "person_ids": [
    "pers_2m8q7c9k4x6p3n5d"
  ]
}'
```

## Responses

### 200

Updated contacts.

#### Response headers



```json
{
  "RateLimit-Limit": {
    "description": "Maximum requests in the effective fixed quota window.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "RateLimit-Remaining": {
    "description": "Requests remaining in the effective quota window.",
    "schema": {
      "minimum": 0,
      "type": "integer"
    }
  },
  "RateLimit-Reset": {
    "description": "Seconds until the effective quota window resets.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "Request-Id": {
    "description": "Server-generated request identifier for support and event correlation.",
    "schema": {
      "pattern": "^req_[a-z0-9]+$",
      "type": "string"
    }
  }
}
```

Content type: application/json

#### Schema



```json
{
  "additionalProperties": false,
  "properties": {
    "items": {
      "items": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "pattern": "^pers_[a-z0-9]+$",
            "type": "string"
          },
          "is_primary": {
            "type": "boolean"
          },
          "object": {
            "const": "person",
            "type": "string"
          }
        },
        "required": [
          "id",
          "object",
          "is_primary"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "object": {
      "const": "participant_list",
      "type": "string"
    },
    "revision": {
      "minimum": 0,
      "type": "integer"
    }
  },
  "required": [
    "object",
    "items",
    "revision"
  ],
  "type": "object"
}
```

#### Example

Illustrative data. Use the identifiers, cursors, and URLs returned by your requests.



```json
{
  "items": [
    {
      "id": "pers_2m8q7c9k4x6p3n5d",
      "is_primary": true,
      "object": "person"
    }
  ],
  "object": "participant_list",
  "revision": 3
}
```

### 400

Correct the request fields and try again.

#### Response headers



```json
{
  "RateLimit-Limit": {
    "description": "Maximum requests in the effective fixed quota window.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "RateLimit-Remaining": {
    "description": "Requests remaining in the effective quota window.",
    "schema": {
      "minimum": 0,
      "type": "integer"
    }
  },
  "RateLimit-Reset": {
    "description": "Seconds until the effective quota window resets.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "Request-Id": {
    "description": "Server-generated request identifier for support and event correlation.",
    "schema": {
      "pattern": "^req_[a-z0-9]+$",
      "type": "string"
    }
  }
}
```

Content type: application/json

#### Schema



```json
{
  "additionalProperties": false,
  "properties": {
    "error": {
      "additionalProperties": false,
      "properties": {
        "code": {
          "type": "string"
        },
        "details": {
          "items": {
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "pointer": {
                "type": "string"
              }
            },
            "required": [
              "pointer",
              "code",
              "message"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "documentation_url": {
          "format": "uri",
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "request_id": {
          "pattern": "^req_[a-z0-9]+$",
          "type": "string"
        },
        "type": {
          "enum": [
            "api_error",
            "authentication_error",
            "conflict_error",
            "idempotency_error",
            "invalid_request_error",
            "permission_error",
            "rate_limit_error"
          ],
          "type": "string"
        }
      },
      "required": [
        "type",
        "code",
        "message",
        "details",
        "request_id",
        "documentation_url"
      ],
      "type": "object"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
```

#### Example

Illustrative data. Use the identifiers, cursors, and URLs returned by your requests.



```json
{
  "error": {
    "code": "invalid_request",
    "details": [],
    "documentation_url": "https://docs.staging.levr.ai/rest-api-reference/businesses/replace-business-people/",
    "message": "Correct the request fields and try again.",
    "request_id": "req_2m8q7c9k4x6p3n5d",
    "type": "invalid_request_error"
  }
}
```

### 401

Provide a valid API key and try again.

#### Response headers



```json
{
  "Request-Id": {
    "description": "Server-generated request identifier for support and event correlation.",
    "schema": {
      "pattern": "^req_[a-z0-9]+$",
      "type": "string"
    }
  }
}
```

Content type: application/json

#### Schema



```json
{
  "additionalProperties": false,
  "properties": {
    "error": {
      "additionalProperties": false,
      "properties": {
        "code": {
          "type": "string"
        },
        "details": {
          "items": {
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "pointer": {
                "type": "string"
              }
            },
            "required": [
              "pointer",
              "code",
              "message"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "documentation_url": {
          "format": "uri",
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "request_id": {
          "pattern": "^req_[a-z0-9]+$",
          "type": "string"
        },
        "type": {
          "enum": [
            "api_error",
            "authentication_error",
            "conflict_error",
            "idempotency_error",
            "invalid_request_error",
            "permission_error",
            "rate_limit_error"
          ],
          "type": "string"
        }
      },
      "required": [
        "type",
        "code",
        "message",
        "details",
        "request_id",
        "documentation_url"
      ],
      "type": "object"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
```

#### Example

Illustrative data. Use the identifiers, cursors, and URLs returned by your requests.



```json
{
  "error": {
    "code": "invalid_api_key",
    "details": [],
    "documentation_url": "https://docs.staging.levr.ai/rest-api-reference/businesses/replace-business-people/",
    "message": "Provide a valid API key and try again.",
    "request_id": "req_2m8q7c9k4x6p3n5d",
    "type": "authentication_error"
  }
}
```

### 403

This API key does not allow the requested action.

#### Response headers



```json
{
  "RateLimit-Limit": {
    "description": "Maximum requests in the effective fixed quota window.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "RateLimit-Remaining": {
    "description": "Requests remaining in the effective quota window.",
    "schema": {
      "minimum": 0,
      "type": "integer"
    }
  },
  "RateLimit-Reset": {
    "description": "Seconds until the effective quota window resets.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "Request-Id": {
    "description": "Server-generated request identifier for support and event correlation.",
    "schema": {
      "pattern": "^req_[a-z0-9]+$",
      "type": "string"
    }
  }
}
```

Content type: application/json

#### Schema



```json
{
  "additionalProperties": false,
  "properties": {
    "error": {
      "additionalProperties": false,
      "properties": {
        "code": {
          "type": "string"
        },
        "details": {
          "items": {
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "pointer": {
                "type": "string"
              }
            },
            "required": [
              "pointer",
              "code",
              "message"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "documentation_url": {
          "format": "uri",
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "request_id": {
          "pattern": "^req_[a-z0-9]+$",
          "type": "string"
        },
        "type": {
          "enum": [
            "api_error",
            "authentication_error",
            "conflict_error",
            "idempotency_error",
            "invalid_request_error",
            "permission_error",
            "rate_limit_error"
          ],
          "type": "string"
        }
      },
      "required": [
        "type",
        "code",
        "message",
        "details",
        "request_id",
        "documentation_url"
      ],
      "type": "object"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
```

#### Example

Illustrative data. Use the identifiers, cursors, and URLs returned by your requests.



```json
{
  "error": {
    "code": "permission_denied",
    "details": [],
    "documentation_url": "https://docs.staging.levr.ai/rest-api-reference/businesses/replace-business-people/",
    "message": "This API key does not allow this action.",
    "request_id": "req_2m8q7c9k4x6p3n5d",
    "type": "permission_error"
  }
}
```

### 404

The requested resource was not found or is not available to this API key.

#### Response headers



```json
{
  "RateLimit-Limit": {
    "description": "Maximum requests in the effective fixed quota window.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "RateLimit-Remaining": {
    "description": "Requests remaining in the effective quota window.",
    "schema": {
      "minimum": 0,
      "type": "integer"
    }
  },
  "RateLimit-Reset": {
    "description": "Seconds until the effective quota window resets.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "Request-Id": {
    "description": "Server-generated request identifier for support and event correlation.",
    "schema": {
      "pattern": "^req_[a-z0-9]+$",
      "type": "string"
    }
  }
}
```

Content type: application/json

#### Schema



```json
{
  "additionalProperties": false,
  "properties": {
    "error": {
      "additionalProperties": false,
      "properties": {
        "code": {
          "type": "string"
        },
        "details": {
          "items": {
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "pointer": {
                "type": "string"
              }
            },
            "required": [
              "pointer",
              "code",
              "message"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "documentation_url": {
          "format": "uri",
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "request_id": {
          "pattern": "^req_[a-z0-9]+$",
          "type": "string"
        },
        "type": {
          "enum": [
            "api_error",
            "authentication_error",
            "conflict_error",
            "idempotency_error",
            "invalid_request_error",
            "permission_error",
            "rate_limit_error"
          ],
          "type": "string"
        }
      },
      "required": [
        "type",
        "code",
        "message",
        "details",
        "request_id",
        "documentation_url"
      ],
      "type": "object"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
```

#### Example

Illustrative data. Use the identifiers, cursors, and URLs returned by your requests.



```json
{
  "error": {
    "code": "not_found",
    "details": [],
    "documentation_url": "https://docs.staging.levr.ai/rest-api-reference/businesses/replace-business-people/",
    "message": "The requested resource was not found.",
    "request_id": "req_2m8q7c9k4x6p3n5d",
    "type": "invalid_request_error"
  }
}
```

### 409

The request conflicts with the resource's current state. Refresh it before trying again.

#### Response headers



```json
{
  "RateLimit-Limit": {
    "description": "Maximum requests in the effective fixed quota window.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "RateLimit-Remaining": {
    "description": "Requests remaining in the effective quota window.",
    "schema": {
      "minimum": 0,
      "type": "integer"
    }
  },
  "RateLimit-Reset": {
    "description": "Seconds until the effective quota window resets.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "Request-Id": {
    "description": "Server-generated request identifier for support and event correlation.",
    "schema": {
      "pattern": "^req_[a-z0-9]+$",
      "type": "string"
    }
  }
}
```

Content type: application/json

#### Schema



```json
{
  "additionalProperties": false,
  "properties": {
    "error": {
      "additionalProperties": false,
      "properties": {
        "code": {
          "type": "string"
        },
        "details": {
          "items": {
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "pointer": {
                "type": "string"
              }
            },
            "required": [
              "pointer",
              "code",
              "message"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "documentation_url": {
          "format": "uri",
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "request_id": {
          "pattern": "^req_[a-z0-9]+$",
          "type": "string"
        },
        "type": {
          "enum": [
            "api_error",
            "authentication_error",
            "conflict_error",
            "idempotency_error",
            "invalid_request_error",
            "permission_error",
            "rate_limit_error"
          ],
          "type": "string"
        }
      },
      "required": [
        "type",
        "code",
        "message",
        "details",
        "request_id",
        "documentation_url"
      ],
      "type": "object"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
```

#### Example

Illustrative data. Use the identifiers, cursors, and URLs returned by your requests.



```json
{
  "error": {
    "code": "conflict",
    "details": [],
    "documentation_url": "https://docs.staging.levr.ai/rest-api-reference/businesses/replace-business-people/",
    "message": "The request conflicts with the current resource state.",
    "request_id": "req_2m8q7c9k4x6p3n5d",
    "type": "conflict_error"
  }
}
```

### 412

The request was not completed.

#### Response headers



```json
{
  "RateLimit-Limit": {
    "description": "Maximum requests in the effective fixed quota window.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "RateLimit-Remaining": {
    "description": "Requests remaining in the effective quota window.",
    "schema": {
      "minimum": 0,
      "type": "integer"
    }
  },
  "RateLimit-Reset": {
    "description": "Seconds until the effective quota window resets.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "Request-Id": {
    "description": "Server-generated request identifier for support and event correlation.",
    "schema": {
      "pattern": "^req_[a-z0-9]+$",
      "type": "string"
    }
  }
}
```

Content type: application/json

#### Schema



```json
{
  "additionalProperties": false,
  "properties": {
    "error": {
      "additionalProperties": false,
      "properties": {
        "code": {
          "type": "string"
        },
        "details": {
          "items": {
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "pointer": {
                "type": "string"
              }
            },
            "required": [
              "pointer",
              "code",
              "message"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "documentation_url": {
          "format": "uri",
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "request_id": {
          "pattern": "^req_[a-z0-9]+$",
          "type": "string"
        },
        "type": {
          "enum": [
            "api_error",
            "authentication_error",
            "conflict_error",
            "idempotency_error",
            "invalid_request_error",
            "permission_error",
            "rate_limit_error"
          ],
          "type": "string"
        }
      },
      "required": [
        "type",
        "code",
        "message",
        "details",
        "request_id",
        "documentation_url"
      ],
      "type": "object"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
```

#### Example

Illustrative data. Use the identifiers, cursors, and URLs returned by your requests.



```json
{
  "error": {
    "code": "precondition_failed",
    "details": [],
    "documentation_url": "https://docs.staging.levr.ai/rest-api-reference/businesses/replace-business-people/",
    "message": "Refresh the resource and try again.",
    "request_id": "req_2m8q7c9k4x6p3n5d",
    "type": "invalid_request_error"
  }
}
```

### 429

Too many requests were sent. Wait before trying again.

#### Response headers



```json
{
  "RateLimit-Limit": {
    "description": "Maximum requests in the effective fixed quota window.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "RateLimit-Remaining": {
    "description": "Requests remaining in the effective quota window.",
    "schema": {
      "minimum": 0,
      "type": "integer"
    }
  },
  "RateLimit-Reset": {
    "description": "Seconds until the effective quota window resets.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "Request-Id": {
    "description": "Server-generated request identifier for support and event correlation.",
    "schema": {
      "pattern": "^req_[a-z0-9]+$",
      "type": "string"
    }
  },
  "Retry-After": {
    "description": "Minimum seconds to wait before retrying.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  }
}
```

Content type: application/json

#### Schema



```json
{
  "additionalProperties": false,
  "properties": {
    "error": {
      "additionalProperties": false,
      "properties": {
        "code": {
          "type": "string"
        },
        "details": {
          "items": {
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "pointer": {
                "type": "string"
              }
            },
            "required": [
              "pointer",
              "code",
              "message"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "documentation_url": {
          "format": "uri",
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "request_id": {
          "pattern": "^req_[a-z0-9]+$",
          "type": "string"
        },
        "type": {
          "enum": [
            "api_error",
            "authentication_error",
            "conflict_error",
            "idempotency_error",
            "invalid_request_error",
            "permission_error",
            "rate_limit_error"
          ],
          "type": "string"
        }
      },
      "required": [
        "type",
        "code",
        "message",
        "details",
        "request_id",
        "documentation_url"
      ],
      "type": "object"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
```

#### Example

Illustrative data. Use the identifiers, cursors, and URLs returned by your requests.



```json
{
  "error": {
    "code": "rate_limited",
    "details": [],
    "documentation_url": "https://docs.staging.levr.ai/rest-api-reference/businesses/replace-business-people/",
    "message": "Wait before sending another request.",
    "request_id": "req_2m8q7c9k4x6p3n5d",
    "type": "rate_limit_error"
  }
}
```

### 500

Levr could not complete the request. Keep the request ID and retry when safe.

#### Response headers



```json
{
  "RateLimit-Limit": {
    "description": "Maximum requests in the effective fixed quota window.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "RateLimit-Remaining": {
    "description": "Requests remaining in the effective quota window.",
    "schema": {
      "minimum": 0,
      "type": "integer"
    }
  },
  "RateLimit-Reset": {
    "description": "Seconds until the effective quota window resets.",
    "schema": {
      "minimum": 1,
      "type": "integer"
    }
  },
  "Request-Id": {
    "description": "Server-generated request identifier for support and event correlation.",
    "schema": {
      "pattern": "^req_[a-z0-9]+$",
      "type": "string"
    }
  }
}
```

Content type: application/json

#### Schema



```json
{
  "additionalProperties": false,
  "properties": {
    "error": {
      "additionalProperties": false,
      "properties": {
        "code": {
          "type": "string"
        },
        "details": {
          "items": {
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "pointer": {
                "type": "string"
              }
            },
            "required": [
              "pointer",
              "code",
              "message"
            ],
            "type": "object"
          },
          "type": "array"
        },
        "documentation_url": {
          "format": "uri",
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "request_id": {
          "pattern": "^req_[a-z0-9]+$",
          "type": "string"
        },
        "type": {
          "enum": [
            "api_error",
            "authentication_error",
            "conflict_error",
            "idempotency_error",
            "invalid_request_error",
            "permission_error",
            "rate_limit_error"
          ],
          "type": "string"
        }
      },
      "required": [
        "type",
        "code",
        "message",
        "details",
        "request_id",
        "documentation_url"
      ],
      "type": "object"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
```

#### Example

Illustrative data. Use the identifiers, cursors, and URLs returned by your requests.



```json
{
  "error": {
    "code": "internal_error",
    "details": [],
    "documentation_url": "https://docs.staging.levr.ai/rest-api-reference/businesses/replace-business-people/",
    "message": "Retry the request, then contact support if it fails again.",
    "request_id": "req_2m8q7c9k4x6p3n5d",
    "type": "api_error"
  }
}
```
