Skip to content

Reminders (V1)

Service for managing reminders.

Reminders are V1-only in this SDK (create/update/delete via V1).

Source code in affinity/services/v1_only.py
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
class ReminderService:
    """
    Service for managing reminders.

    Reminders are V1-only in this SDK (create/update/delete via V1).
    """

    def __init__(self, client: HTTPClient):
        self._client = client

    def list(
        self,
        *,
        person_id: PersonId | None = None,
        company_id: CompanyId | None = None,
        opportunity_id: OpportunityId | None = None,
        creator_id: UserId | None = None,
        owner_id: UserId | None = None,
        completer_id: UserId | None = None,
        type: ReminderType | None = None,
        reset_type: ReminderResetType | None = None,
        status: ReminderStatus | None = None,
        due_before: datetime | None = None,
        due_after: datetime | None = None,
        page_size: int | None = None,
        page_token: str | None = None,
    ) -> V1PaginatedResponse[Reminder]:
        """
        Get reminders with optional filtering.

        Args:
            person_id: Filter reminders for this person
            company_id: Filter reminders for this company
            opportunity_id: Filter reminders for this opportunity
            creator_id: Filter by reminder creator
            owner_id: Filter by reminder owner (assignee)
            completer_id: Filter by who completed the reminder
            type: Filter by reminder type (ONE_TIME or RECURRING)
            reset_type: Filter by reset type (FIXED_DATE, DATE_ADDED, or INTERACTION)
            status: Filter by status (ACTIVE, SNOOZED, or COMPLETE)
            due_before: Filter reminders due before this datetime
            due_after: Filter reminders due after this datetime
            page_size: Number of results per page
            page_token: Pagination token from previous response

        Returns:
            V1PaginatedResponse with reminders and next_page_token
        """
        params: dict[str, Any] = {}
        if person_id:
            params["person_id"] = int(person_id)
        if company_id:
            params["organization_id"] = int(company_id)
        if opportunity_id:
            params["opportunity_id"] = int(opportunity_id)
        if creator_id:
            params["creator_id"] = int(creator_id)
        if owner_id:
            params["owner_id"] = int(owner_id)
        if completer_id:
            params["completer_id"] = int(completer_id)
        if type is not None:
            params["type"] = int(type)
        if reset_type is not None:
            params["reset_type"] = int(reset_type)
        if status is not None:
            params["status"] = int(status)
        if due_before:
            params["due_before"] = due_before.isoformat()
        if due_after:
            params["due_after"] = due_after.isoformat()
        if page_size:
            params["page_size"] = page_size
        if page_token:
            params["page_token"] = page_token

        data = self._client.get("/reminders", params=params or None, v1=True)
        items = data.get("reminders", data.get("data", []))
        if not isinstance(items, list):
            items = []
        return V1PaginatedResponse[Reminder](
            data=[Reminder.model_validate(r) for r in items],
            next_page_token=data.get("next_page_token") or data.get("nextPageToken"),
        )

    def get(self, reminder_id: ReminderIdType) -> Reminder:
        """Get a single reminder."""
        data = self._client.get(f"/reminders/{reminder_id}", v1=True)
        return Reminder.model_validate(data)

    def create(self, data: ReminderCreate) -> Reminder:
        """Create a new reminder."""
        payload = data.model_dump(by_alias=True, mode="python", exclude_none=True)
        _coerce_isoformat(payload, ("due_date",))

        result = self._client.post("/reminders", json=payload, v1=True)
        return Reminder.model_validate(result)

    def update(self, reminder_id: ReminderIdType, data: ReminderUpdate) -> Reminder:
        """Update a reminder."""
        payload = data.model_dump(
            by_alias=True,
            mode="python",
            exclude_unset=True,
            exclude_none=True,
        )
        _coerce_isoformat(payload, ("due_date",))

        result = self._client.put(f"/reminders/{reminder_id}", json=payload, v1=True)
        return Reminder.model_validate(result)

    def delete(self, reminder_id: ReminderIdType) -> bool:
        """Delete a reminder."""
        result = self._client.delete(f"/reminders/{reminder_id}", v1=True)
        return bool(result.get("success", False))

create(data: ReminderCreate) -> Reminder

Create a new reminder.

Source code in affinity/services/v1_only.py
286
287
288
289
290
291
292
def create(self, data: ReminderCreate) -> Reminder:
    """Create a new reminder."""
    payload = data.model_dump(by_alias=True, mode="python", exclude_none=True)
    _coerce_isoformat(payload, ("due_date",))

    result = self._client.post("/reminders", json=payload, v1=True)
    return Reminder.model_validate(result)

delete(reminder_id: ReminderIdType) -> bool

Delete a reminder.

Source code in affinity/services/v1_only.py
307
308
309
310
def delete(self, reminder_id: ReminderIdType) -> bool:
    """Delete a reminder."""
    result = self._client.delete(f"/reminders/{reminder_id}", v1=True)
    return bool(result.get("success", False))

get(reminder_id: ReminderIdType) -> Reminder

Get a single reminder.

Source code in affinity/services/v1_only.py
281
282
283
284
def get(self, reminder_id: ReminderIdType) -> Reminder:
    """Get a single reminder."""
    data = self._client.get(f"/reminders/{reminder_id}", v1=True)
    return Reminder.model_validate(data)

list(*, person_id: PersonId | None = None, company_id: CompanyId | None = None, opportunity_id: OpportunityId | None = None, creator_id: UserId | None = None, owner_id: UserId | None = None, completer_id: UserId | None = None, type: ReminderType | None = None, reset_type: ReminderResetType | None = None, status: ReminderStatus | None = None, due_before: datetime | None = None, due_after: datetime | None = None, page_size: int | None = None, page_token: str | None = None) -> V1PaginatedResponse[Reminder]

Get reminders with optional filtering.

Parameters:

Name Type Description Default
person_id PersonId | None

Filter reminders for this person

None
company_id CompanyId | None

Filter reminders for this company

None
opportunity_id OpportunityId | None

Filter reminders for this opportunity

None
creator_id UserId | None

Filter by reminder creator

None
owner_id UserId | None

Filter by reminder owner (assignee)

None
completer_id UserId | None

Filter by who completed the reminder

None
type ReminderType | None

Filter by reminder type (ONE_TIME or RECURRING)

None
reset_type ReminderResetType | None

Filter by reset type (FIXED_DATE, DATE_ADDED, or INTERACTION)

None
status ReminderStatus | None

Filter by status (ACTIVE, SNOOZED, or COMPLETE)

None
due_before datetime | None

Filter reminders due before this datetime

None
due_after datetime | None

Filter reminders due after this datetime

None
page_size int | None

Number of results per page

None
page_token str | None

Pagination token from previous response

None

Returns:

Type Description
V1PaginatedResponse[Reminder]

V1PaginatedResponse with reminders and next_page_token

Source code in affinity/services/v1_only.py
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
def list(
    self,
    *,
    person_id: PersonId | None = None,
    company_id: CompanyId | None = None,
    opportunity_id: OpportunityId | None = None,
    creator_id: UserId | None = None,
    owner_id: UserId | None = None,
    completer_id: UserId | None = None,
    type: ReminderType | None = None,
    reset_type: ReminderResetType | None = None,
    status: ReminderStatus | None = None,
    due_before: datetime | None = None,
    due_after: datetime | None = None,
    page_size: int | None = None,
    page_token: str | None = None,
) -> V1PaginatedResponse[Reminder]:
    """
    Get reminders with optional filtering.

    Args:
        person_id: Filter reminders for this person
        company_id: Filter reminders for this company
        opportunity_id: Filter reminders for this opportunity
        creator_id: Filter by reminder creator
        owner_id: Filter by reminder owner (assignee)
        completer_id: Filter by who completed the reminder
        type: Filter by reminder type (ONE_TIME or RECURRING)
        reset_type: Filter by reset type (FIXED_DATE, DATE_ADDED, or INTERACTION)
        status: Filter by status (ACTIVE, SNOOZED, or COMPLETE)
        due_before: Filter reminders due before this datetime
        due_after: Filter reminders due after this datetime
        page_size: Number of results per page
        page_token: Pagination token from previous response

    Returns:
        V1PaginatedResponse with reminders and next_page_token
    """
    params: dict[str, Any] = {}
    if person_id:
        params["person_id"] = int(person_id)
    if company_id:
        params["organization_id"] = int(company_id)
    if opportunity_id:
        params["opportunity_id"] = int(opportunity_id)
    if creator_id:
        params["creator_id"] = int(creator_id)
    if owner_id:
        params["owner_id"] = int(owner_id)
    if completer_id:
        params["completer_id"] = int(completer_id)
    if type is not None:
        params["type"] = int(type)
    if reset_type is not None:
        params["reset_type"] = int(reset_type)
    if status is not None:
        params["status"] = int(status)
    if due_before:
        params["due_before"] = due_before.isoformat()
    if due_after:
        params["due_after"] = due_after.isoformat()
    if page_size:
        params["page_size"] = page_size
    if page_token:
        params["page_token"] = page_token

    data = self._client.get("/reminders", params=params or None, v1=True)
    items = data.get("reminders", data.get("data", []))
    if not isinstance(items, list):
        items = []
    return V1PaginatedResponse[Reminder](
        data=[Reminder.model_validate(r) for r in items],
        next_page_token=data.get("next_page_token") or data.get("nextPageToken"),
    )

update(reminder_id: ReminderIdType, data: ReminderUpdate) -> Reminder

Update a reminder.

Source code in affinity/services/v1_only.py
294
295
296
297
298
299
300
301
302
303
304
305
def update(self, reminder_id: ReminderIdType, data: ReminderUpdate) -> Reminder:
    """Update a reminder."""
    payload = data.model_dump(
        by_alias=True,
        mode="python",
        exclude_unset=True,
        exclude_none=True,
    )
    _coerce_isoformat(payload, ("due_date",))

    result = self._client.put(f"/reminders/{reminder_id}", json=payload, v1=True)
    return Reminder.model_validate(result)