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

# List custom properties



## OpenAPI

````yaml /api-reference/openapi.json get /v1/properties
openapi: 3.1.0
info:
  title: Ciarem API
  version: v1
  description: >
    The Ciarem public API. Authenticate every request with an org-bound API key

    (created in Settings → API keys; Scale plan or free trial) sent as a bearer
    token:

    `Authorization: Bearer oak_…`.


    Compatibility: this is an early, fast-moving API. Most changes are

    additive (new endpoints, new optional params, new response fields, new

    enum/string values) — clients must tolerate unknown fields and unknown

    string values. Every contract change is listed in the changelog at

    help.ciarem.ai.
servers:
  - url: https://api.ciarem.ai
security:
  - apiKey: []
tags:
  - name: Account
    description: The organization behind the API key.
  - name: Contacts
    description: People in the CRM — create, read, update, delete.
  - name: CRM
    description: 'The shape of the CRM: custom properties and funnel stages.'
  - name: Conversations
    description: Read the message history of a conversation.
  - name: WhatsApp numbers
    description: The connected numbers a send can go out from.
  - name: WhatsApp templates
    description: Message templates, and what each one needs filled before it can be sent.
  - name: Broadcasts
    description: Send a template, and follow what happened to every recipient.
paths:
  /v1/properties:
    get:
      tags:
        - CRM
      summary: List custom properties
      operationId: list_properties_endpoint_v1_properties_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicPropertyListResponse'
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
        '401':
          description: >-
            No usable credential: `missing_bearer_token` (no `Authorization:
            Bearer`) or `invalid_api_key` (unknown or revoked key).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicError'
        '403':
          description: >-
            The credential is real but not allowed here: `api_key_required` (a
            session token rather than an `oak_` key), `scale_plan_required` (a
            live plan below Scale — upgrade to Scale), `trial_expired` (the free
            trial ended without a card — subscribe to keep the key working), or
            `subscription_required` (the subscription is canceled or suspended).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicError'
        '429':
          description: >-
            Over the organization's request budget (`rate_limited`).
            `Retry-After` says how many seconds to wait.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicError'
          headers:
            Retry-After:
              description: Seconds until the window resets.
              schema:
                type: integer
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
components:
  schemas:
    PublicPropertyListResponse:
      properties:
        items:
          items:
            $ref: '#/components/schemas/PublicProperty'
          type: array
          title: Items
      type: object
      required:
        - items
      title: PublicPropertyListResponse
    PublicError:
      description: An error whose `detail` is a stable, machine-readable code.
      properties:
        detail:
          title: Detail
          type: string
      required:
        - detail
      title: PublicError
      type: object
    PublicProperty:
      properties:
        id:
          type: string
          title: Id
        key:
          type: string
          title: Key
        label:
          type: string
          title: Label
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        kind:
          $ref: '#/components/schemas/CrmPropertyKind'
        options:
          anyOf:
            - items:
                $ref: '#/components/schemas/PublicPropertyOption'
              type: array
            - type: 'null'
          title: Options
        currency:
          anyOf:
            - $ref: '#/components/schemas/Currency'
            - type: 'null'
        required:
          type: boolean
          title: Required
        order_idx:
          type: integer
          title: Order Idx
        archived_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Archived At
        created_at:
          type: string
          format: date-time
          title: Created At
        updated_at:
          type: string
          format: date-time
          title: Updated At
      type: object
      required:
        - id
        - key
        - label
        - description
        - kind
        - options
        - currency
        - required
        - order_idx
        - archived_at
        - created_at
        - updated_at
      title: PublicProperty
    CrmPropertyKind:
      type: string
      enum:
        - TEXT
        - NUMBER
        - RADIO
        - DROPDOWN
        - BOOLEAN
        - DATE
        - TEXTAREA
        - MULTI_SELECT
        - EMAIL
        - MONEY
        - FILE
        - URL
        - MULTI_FILE
      title: CrmPropertyKind
      description: >-
        Type of a user-defined custom property on a contact.


        The order mirrors the Postgres `crm_property_kind_enum`: TEXTAREA was

        appended in 0014 (alongside MULTI_SELECT), EMAIL and MONEY in 0025, FILE

        in 0065, URL in 0167, MULTI_FILE in 0186. `EMAIL` and `URL` store into

        `value_text` (like TEXT) and `MONEY` into `value_number` (like NUMBER) —

        they're presentation/validation refinements of those base columns, not
        new

        storage shapes. `FILE` and `MULTI_FILE` both store an array of S3 file

        references in `value_json` (see `ciarem_crm.file_property`); they differ

        only in cardinality — FILE holds at most one file, MULTI_FILE a capped

        gallery. Pre-0186, FILE meant the gallery; 0186 renamed those rows to

        MULTI_FILE and repurposed FILE as the single-file kind (it was

        catalogs-only, so no contact data existed). The bytes live in the

        `record-media` bucket.
    PublicPropertyOption:
      properties:
        key:
          type: string
          minLength: 1
          pattern: ^[A-Za-z][A-Za-z0-9_]*$
          title: Key
        label:
          type: string
          minLength: 1
          title: Label
      type: object
      required:
        - key
        - label
      title: PublicPropertyOption
    Currency:
      type: string
      enum:
        - AED
        - AFN
        - ALL
        - AMD
        - ANG
        - AOA
        - ARS
        - AUD
        - AWG
        - AZN
        - BAM
        - BBD
        - BDT
        - BGN
        - BHD
        - BIF
        - BMD
        - BND
        - BOB
        - BRL
        - BSD
        - BTN
        - BWP
        - BYN
        - BZD
        - CAD
        - CDF
        - CHF
        - CLP
        - CNY
        - COP
        - CRC
        - CUP
        - CVE
        - CZK
        - DJF
        - DKK
        - DOP
        - DZD
        - EGP
        - ERN
        - ETB
        - EUR
        - FJD
        - FKP
        - GBP
        - GEL
        - GHS
        - GIP
        - GMD
        - GNF
        - GTQ
        - GYD
        - HKD
        - HNL
        - HTG
        - HUF
        - IDR
        - ILS
        - INR
        - IQD
        - IRR
        - ISK
        - JMD
        - JOD
        - JPY
        - KES
        - KGS
        - KHR
        - KMF
        - KPW
        - KRW
        - KWD
        - KYD
        - KZT
        - LAK
        - LBP
        - LKR
        - LRD
        - LSL
        - LYD
        - MAD
        - MDL
        - MGA
        - MKD
        - MMK
        - MNT
        - MOP
        - MRU
        - MUR
        - MVR
        - MWK
        - MXN
        - MYR
        - MZN
        - NAD
        - NGN
        - NIO
        - NOK
        - NPR
        - NZD
        - OMR
        - PAB
        - PEN
        - PGK
        - PHP
        - PKR
        - PLN
        - PYG
        - QAR
        - RON
        - RSD
        - RUB
        - RWF
        - SAR
        - SBD
        - SCR
        - SDG
        - SEK
        - SGD
        - SHP
        - SLE
        - SOS
        - SRD
        - SSP
        - STN
        - SVC
        - SYP
        - SZL
        - THB
        - TJS
        - TMT
        - TND
        - TOP
        - TRY
        - TTD
        - TWD
        - TZS
        - UAH
        - UGX
        - USD
        - UYU
        - UZS
        - VES
        - VND
        - VUV
        - WST
        - XAF
        - XCD
        - XOF
        - XPF
        - YER
        - ZAR
        - ZMW
        - ZWG
      title: Currency
      description: |-
        ISO 4217 alpha code of a circulating currency.

        The denomination of a MONEY property definition. Active circulating
        codes only — the fund/metal/testing X-codes (XAU, XDR, XTS, XXX, …)
        are excluded, while the circulating X-currencies (XAF, XOF, XPF, XCD)
        stay. Stored as TEXT (no Postgres enum): the set is ISO's, not ours,
        and codes retire/appear with currency reforms (SLL→SLE, ZWL→ZWG) —
        validation lives at the API boundary where it can evolve without a
        migration.
  headers:
    X-RateLimit-Limit:
      description: Requests allowed per window, shared across the org's keys.
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: Requests left in the current window.
      schema:
        type: integer
    X-RateLimit-Reset:
      description: When the window resets, as a Unix timestamp in seconds.
      schema:
        type: integer
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: 'An org API key: `Authorization: Bearer oak_…`.'

````