# addContactNote

Add a text note to a contact, synchronously (getContact returns it at once). The response is the OWNING CONTACT, not the note (`id` and `name` are the contact's), so report the name it gives back, never the name you searched for. They differ more often than they look: contactId usually comes from a findContacts search, which ranks and can return a near match for a name with no exact one. A run that wrote to the top row and told the user the note landed on the searched name has reported a record it did not touch, which nothing downstream catches. If the echoed name is not the contact the user named, say so and offer to move the note. Returns no noteId: re-read getContact notes[] for one (see editContactNote).

- Call: `POST https://server.goliathdata.com/api/v1/call` with `{ "operationId": "addContactNote", "variables": {...} }`
- Scope: `WRITE`
- Type: mutation
- Idempotency: honors `Idempotency-Key` (24 h)
- Rate-limited: no

## Variables

- `contactId`: `ID!` (required)
- `body`: `String!` (required)

## Response (data, an example)

```json
{
  "noteMutation": {
    "createNote": {
      "id": "<ID>",
      "name": "…"
    }
  }
}
```

## Example

```bash
curl https://server.goliathdata.com/api/v1/call \
  -H "Authorization: Bearer $GOLIATH_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "operationId": "addContactNote",
    "variables": {
      "contactId": "<contactId>",
      "body": "<String>"
    }
  }'
```
