Field types and values¶
Many endpoints can return “field values” in addition to the core entity shape.
Field types¶
Use FieldType to request which field scopes you want:
from affinity import Affinity
from affinity.types import FieldType, PersonId
with Affinity(api_key="your-key") as client:
person = client.persons.get(PersonId(123), field_types=[FieldType.ENRICHED, FieldType.GLOBAL])
if person.fields.requested:
print(person.fields.data)
Common values include:
FieldType.ENRICHEDFieldType.GLOBALFieldType.LISTFieldType.LIST_SPECIFIC
Notes:
FieldType.LIST_SPECIFICis an alternate string value the API uses for list-scoped fields (you may see it in responses as"list-specific"). Treat it as equivalent toFieldType.LISTfor most use cases.
Field IDs¶
If you know specific field IDs, you can request only those:
from affinity import Affinity
from affinity.types import FieldId, FieldType
with Affinity(api_key="your-key") as client:
page = client.companies.list(field_ids=[FieldId(101)], field_types=[FieldType.GLOBAL])
for company in page.data:
if company.fields.requested:
print(company.fields.data.get("101"))
Accepted FieldId formats¶
FieldId accepts several input formats and normalizes them to field-<digits>:
| Input | Normalized to | Valid |
|---|---|---|
FieldId(123) |
"field-123" |
Yes |
FieldId("456") |
"field-456" |
Yes |
FieldId("field-789") |
"field-789" |
Yes |
FieldId("invalid") |
— | No, raises ValueError |
Invalid formats raise ValueError immediately at construction time.
FieldId comparison semantics¶
FieldId normalizes values at construction time, enabling direct equality comparisons without manual string conversion:
from affinity.types import FieldId
# All these are equal - normalized to "field-123"
assert FieldId(123) == FieldId("123") == FieldId("field-123")
# Works in sets and dicts
seen = {FieldId(123)}
assert FieldId("field-123") in seen # True
# Compare API response IDs directly
field_id = FieldId(123)
if field_id == api_response_field_id: # No str() conversion needed
process(field_id)
This normalization eliminates common comparison bugs where FieldId(123) != FieldId("field-123") due to type differences.
V1-only writes and numeric field IDs¶
The SDK uses V2 field metadata endpoints for reads. Some write operations still use V1 endpoints under the hood (for example, field value writes and field deletes). Those V1 endpoints require numeric field IDs.
Rules:
- IDs of the form
field-<digits>are convertible to V1 numeric IDs. - Enriched and relationship-intelligence IDs (for example,
affinity-data-*orsource-of-introduction) have no V1 numeric equivalent and will raise an error if used in V1-only write paths.
Requested vs not requested¶
Entities expose a fields container that preserves whether the API returned field data:
entity.fields.requested == False: you didn’t request fields (or the API omitted them)entity.fields.requested == True: field data was requested and returned (possibly empty)
Field value type mapping¶
When you read entity.fields.data, values are typed as Any. The expected shape depends on the field’s valueType
(FieldValueType) and whether the field allows multiple values.
FieldValueType is V2-first and string-based (for example: dropdown-multi, ranked-dropdown).
Unknown future values are treated as open enums and preserved as strings.
Affinity FieldValueType |
Typical Python value | Notes |
|---|---|---|
text |
str |
Plain text |
filterable-text / filterable-text-multi |
str / list[str] |
Reserved for Affinity-populated fields |
number / number-multi |
int \| float / list[int \| float] |
JSON numbers |
datetime |
str / datetime.datetime |
Typically ISO-8601 datetime strings on read |
person / person-multi |
PersonId / list[PersonId] |
Under the hood: int or list[int] |
company / company-multi |
CompanyId / list[CompanyId] |
Under the hood: int or list[int] |
dropdown / dropdown-multi |
DropdownOptionId / list[DropdownOptionId] |
Under the hood: int or list[int] |
ranked-dropdown |
DropdownOptionId |
Under the hood: int |
location / location-multi |
dict[str, Any] / list[dict[str, Any]] |
Structured location object(s); shape varies by API |
interaction |
Any |
Relationship-intelligence fields; shape varies by API |