> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apollodeploy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Contact properties

> Define typed project fields and manage values consistently across contacts

Properties add project-specific data to contacts.
Define the field once, then assign typed values from the dashboard or API.

## Property definition

| Field    | Requirement                                              |
| -------- | -------------------------------------------------------- |
| Name     | Human-readable label for operators                       |
| Key      | Letters, numbers, and underscores; maximum 50 characters |
| Type     | String or number                                         |
| Fallback | Optional value used when a contact has no explicit value |

Good keys include `account_tier`, `trial_days_remaining`, and `security_alerts_enabled`.
Choose a key that can remain stable after the display name changes.

## Choose the correct type

* Use **string** for categories, identifiers, locale codes, and descriptive values.
* Use **number** for quantities that need numeric comparison.
  Do not encode numeric values as strings just to avoid selecting the number type.
  Typed data keeps API validation and customer operations predictable.

## Fallback values

A fallback provides a defined value when a contact has no explicit property value.
Use it only when the default is genuinely safe for every missing contact.
Do not use a fallback to invent consent, eligibility, or regulated customer facts.

## Update contact values

Open the contact, select **Properties**, and edit the available project fields.
A submitted value must match the property type.
Treat validation failure as a data-contract error and fix the producer.

## Delete a property

<Warning>
  Deleting a property removes its existing values from contacts.
  Export or migrate any data you need before deletion.
</Warning>

Before deleting:

1. Find callers that write or read the key.
2. Remove the field from current application payloads.
3. Export values if they have business or compliance value.
4. Delete the property only after dependent code is deployed.

## SDK example

After creating an authenticated client with the matching [SDK setup guide](/signal/send-with/sdk-overview),
use the operation for your language or framework.

<CodeGroup dropdown>
  ```typescript TypeScript theme={"dark"}
  const properties = await signal.contactProperties.listContactProperties(projectId, {
    headers: { Authorization: `Bearer ${process.env.SIGNAL_API_KEY}` },
  });
  ```

  ```python Python theme={"dark"}
  properties = signal.contact_properties.list_contact_properties(project_id)
  ```

  ```go Go theme={"dark"}
  properties, err := client.ContactProperties.ListContactProperties(ctx, projectID)
  if err != nil {
      panic(err)
  }
  ```

  ```ruby Ruby theme={"dark"}
  properties = signal.contact_properties.list_contact_properties(project_id: project_id)
  ```

  ```ruby Rails theme={"dark"}
  properties = ApolloDeploySignalSdkRails.rails_client.contact_properties.list_contact_properties(
    project_id: project_id
  )
  ```

  ```php PHP / Laravel theme={"dark"}
  $properties = $signal->contactProperties()->listContactProperties($projectId);
  ```

  ```java Java theme={"dark"}
  var properties = signal.contactProperties().listContactProperties(projectId);
  ```

  ```kotlin Kotlin theme={"dark"}
  val properties = signal.contactProperties.listContactProperties(projectId)
  ```

  ```csharp .NET theme={"dark"}
  var properties = await signal.ContactProperties.ListContactPropertiesAsync(projectId);
  ```

  ```rust Rust theme={"dark"}
  let properties = signal.contact_properties.list_contact_properties(project_id.to_string()).await?;
  ```

  ```elixir Elixir theme={"dark"}
  {:ok, properties, _metadata} = ApolloSignal.Client.list_contact_properties(client, project_id)
  ```

  ```swift Swift theme={"dark"}
  let properties = try await signal.contactProperties.listContactProperties(projectId: projectId)
  ```

  ```zig Zig theme={"dark"}
  var api = client.contactProperties();
  var result = try api.listContactProperties(project_id, .{});
  defer result.deinit();

  switch (result) {
      .success => |_| {},
      .api_error => return error.SignalApiError,
  }
  ```
</CodeGroup>
