# getContactsProperties

Many contacts' linked properties in ONE read: `contactIds` in (a bulk selection's ids, up to 200), each contact's `properties[]` out (`propertyString`, and `property.id`, the property id a skip trace, export or PROPOSE_BULK_TASK selection takes; null when the address never matched a parcel, so it cannot be traced). Use it to turn contacts into their properties, never one getContact per contact. Every id must be one of this workspace's contacts (one outside it refuses the call); a contact you may not open is left out, and a merged id is not followed, so use the ids filterContacts or findContacts returned.

- Call: `POST https://server.goliathdata.com/api/v1/call` with `{ "operationId": "getContactsProperties", "variables": {...} }`
- Scope: `READ`
- Type: query
- Idempotency: a read; rejects `Idempotency-Key`
- Rate-limited: no

## Variables

- `contactIds`: `[ID!]!` (required)

## Response (data, an example)

```json
{
  "contactQuery": {
    "getContacts": [
      {
        "id": "<ID>",
        "name": "…",
        "isArchived": true,
        "properties": [
          {
            "propertyString": "…",
            "status": "…",
            "property": {
              "id": "<ID>"
            }
          }
        ]
      }
    ]
  }
}
```

## Example

```bash
curl https://server.goliathdata.com/api/v1/call \
  -H "Authorization: Bearer $GOLIATH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "operationId": "getContactsProperties",
    "variables": {
      "contactIds": [
        "<contactIds>"
      ]
    }
  }'
```
