Skip to content
AlterEstate

Custom fields

GEThttps://secure.alterestate.com/api/v1/custom-fields/schema/

Lists the custom fields defined for your company. Use the keys when you send a lead, so values land on the contact, the deal, or both.

Custom fields are created in the dashboard under Settings → Fields → Custom fields. This endpoint returns only the fields of the company that owns the API token, and only those that are active and enabled for the API.


Authentication

Send Authorization: Token your_api_key_here. Account token. Keep it on your server.


Query parameters

appstring
Module to list: deals, contacts, properties or project_units. For leads, call it for deals and for contacts. Omit it to return every module.Example: deals
groupboolean
When true, fields come back grouped by module under schema instead of a flat fields list.Example: true

Example request

GET
curl --request GET \
  --url 'https://secure.alterestate.com/api/v1/custom-fields/schema/?app=deals' \
  --header 'Authorization: Token your_api_key_here' \
  --header 'Accept: application/json'

Example response

200 OK
{
  "fields": [
    {
      "key": "client_type",
      "label": "Client type",
      "field_type": "select",
      "app": "deals",
      "description": "How this person plans to buy.",
      "placeholder": null,
      "help_text": null,
      "is_required": false,
      "options": [
        {
          "label": "Investor",
          "value": "investor"
        },
        {
          "label": "End user",
          "value": "end_user"
        }
      ],
      "validation": {},
      "default_value": null,
      "show_on_filters": true
    },
    {
      "key": "lead_score",
      "label": "Lead score",
      "field_type": "number",
      "app": "deals",
      "description": null,
      "placeholder": null,
      "help_text": null,
      "is_required": false,
      "options": [],
      "validation": {
        "minimum": 0,
        "maximum": 100
      },
      "default_value": null,
      "show_on_filters": false
    }
  ],
  "total": 2
}
200 Grouped
{
  "schema": {
    "deals": [
      {
        "key": "client_type",
        "label": "Client type",
        "field_type": "select",
        "app": "deals"
      }
    ],
    "contacts": [
      {
        "key": "original_source",
        "label": "Original source",
        "field_type": "text",
        "app": "contacts"
      }
    ]
  },
  "total": 2
}

Response fields

FieldUse it for
keyThe name you send inside custom_fields when you create a lead.
labelThe name shown to agents in the dashboard.
field_typetext, textarea, number, boolean, date, datetime, select or multiselect.
appdeals or contacts for leads. properties and project_units are for listings.
is_requiredWhen you include this key, the value cannot be empty.
optionsFor select and multiselect. Send the value, not the label.
validationRules such as minimum, maximum, min_length, max_length or a regex.
show_on_filtersWhether agents can filter lists by this field.

Sending values on a lead

Pass the keys you just listed in custom_fields on POST /api/v1/leads/. Two formats are accepted.


Use each field key as the JSON key. AlterEstate routes every value to the contact, the deal or both, depending on which module owns the key. If the same key exists in both, the value is written to both.

JSON
{
  "full_name": "John Doe",
  "phone": "8091234567",
  "email": "johndoe@email.com",
  "property_uid": "KNM6135T3B",
  "custom_fields": {
    "lead_score": 85,
    "client_type": "investor",
    "visit_date": "2026-06-12",
    "original_source": "instagram",
    "has_financing": true
  }
}

Namespaced format

Use it when the same key exists in both modules but should only be written to one.

JSON
{
  "full_name": "John Doe",
  "phone": "8091234567",
  "email": "johndoe@email.com",
  "custom_fields": {
    "deals": {
      "lead_score": 85,
      "client_type": "investor"
    },
    "contacts": {
      "original_source": "instagram",
      "has_financing": true
    }
  }
}

Field types

TypeJSON valueExample
textstring"Beach house"
textareastring"Long notes..."
numbernumber or numeric string85 or "85"
booleanbool, "true", "si" or 1true
dateYYYY-MM-DD"2026-06-12"
datetimeISO 8601"2026-06-12T14:30:00Z"
selectstring matching an option value"investor"
multiselectarray of option values["sea", "city"]

Validation

  • Every key must match an active custom field of your company.
  • select and multiselect values must match an option value, not its label.
  • Min/max, length and regex rules defined on the field are enforced.
  • A required field must have a value when you include its key. Leaving the key out of a lead does not reject the request.
  • Invalid values return 400 with one error per key. Validation messages are returned in Spanish.

Where values appear

  • In the Custom fields section of the contact and the deal.
  • As list columns, when the field has show on list enabled.
  • In filters, reports and the API responses for that record.
  • In a timeline activity so the assigned agent sees exactly what arrived.

Status codes

StatusMeaning
200The request succeeded.
400A parameter or the body is invalid. The response names the field.
401The token is missing or invalid.
404The resource or route does not exist.
429Too many requests. Wait and retry.
500Server error while processing the request.

Frequently asked questions

How do I list the custom fields of my company?

Send GET /api/v1/custom-fields/schema/ with your account token. Add app=deals or app=contacts to limit the list. The response only includes fields of the company that owns the token.

Which value do I send for a dropdown custom field?

Send the option value from the schema, for example investor, not the label shown to agents, such as Investor.

Last updated . Questions? Emailengineering@alterestate.com.