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
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
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
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,
    ) -> PaginatedResponse[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 (COMPLETED, ACTIVE, or OVERDUE)
            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:
            PaginatedResponse with reminders and next_page_token
        """
        params: dict[str, Any] = {}
        if person_id is not None:
            params["person_id"] = int(person_id)
        if company_id is not None:
            params["organization_id"] = int(company_id)
        if opportunity_id is not None:
            params["opportunity_id"] = int(opportunity_id)
        if creator_id is not None:
            params["creator_id"] = int(creator_id)
        if owner_id is not None:
            params["owner_id"] = int(owner_id)
        if completer_id is not None:
            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 is not None:
            params["due_before"] = due_before.isoformat()
        if due_after is not None:
            params["due_after"] = due_after.isoformat()
        if page_size is not None:
            params["page_size"] = page_size
        if page_token is not None:
            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 PaginatedResponse[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))

    def iter(
        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,
    ) -> PageIterator[Reminder]:
        """
        Iterate through all reminders with automatic pagination.

        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 (COMPLETED, ACTIVE, or OVERDUE)
            due_before: Filter reminders due before this datetime
            due_after: Filter reminders due after this datetime
            page_size: Number of results per page

        Returns:
            PageIterator that yields Reminder objects
        """

        def fetch_page(cursor: str | None) -> PaginatedResponse[Reminder]:
            return self.list(
                person_id=person_id,
                company_id=company_id,
                opportunity_id=opportunity_id,
                creator_id=creator_id,
                owner_id=owner_id,
                completer_id=completer_id,
                type=type,
                reset_type=reset_type,
                status=status,
                due_before=due_before,
                due_after=due_after,
                page_size=page_size,
                page_token=cursor,
            )

        return PageIterator(fetch_page)

create(data: ReminderCreate) -> Reminder

Create a new reminder.

Source code in affinity/services/v1_only.py
371
372
373
374
375
376
377
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
392
393
394
395
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
366
367
368
369
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)

iter(*, 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) -> PageIterator[Reminder]

Iterate through all reminders with automatic pagination.

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 (COMPLETED, ACTIVE, or OVERDUE)

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

Returns:

Type Description
PageIterator[Reminder]

PageIterator that yields Reminder objects

Source code in affinity/services/v1_only.py
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
def iter(
    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,
) -> PageIterator[Reminder]:
    """
    Iterate through all reminders with automatic pagination.

    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 (COMPLETED, ACTIVE, or OVERDUE)
        due_before: Filter reminders due before this datetime
        due_after: Filter reminders due after this datetime
        page_size: Number of results per page

    Returns:
        PageIterator that yields Reminder objects
    """

    def fetch_page(cursor: str | None) -> PaginatedResponse[Reminder]:
        return self.list(
            person_id=person_id,
            company_id=company_id,
            opportunity_id=opportunity_id,
            creator_id=creator_id,
            owner_id=owner_id,
            completer_id=completer_id,
            type=type,
            reset_type=reset_type,
            status=status,
            due_before=due_before,
            due_after=due_after,
            page_size=page_size,
            page_token=cursor,
        )

    return PageIterator(fetch_page)

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) -> PaginatedResponse[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 (COMPLETED, ACTIVE, or OVERDUE)

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
PaginatedResponse[Reminder]

PaginatedResponse with reminders and next_page_token

Source code in affinity/services/v1_only.py
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
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,
) -> PaginatedResponse[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 (COMPLETED, ACTIVE, or OVERDUE)
        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:
        PaginatedResponse with reminders and next_page_token
    """
    params: dict[str, Any] = {}
    if person_id is not None:
        params["person_id"] = int(person_id)
    if company_id is not None:
        params["organization_id"] = int(company_id)
    if opportunity_id is not None:
        params["opportunity_id"] = int(opportunity_id)
    if creator_id is not None:
        params["creator_id"] = int(creator_id)
    if owner_id is not None:
        params["owner_id"] = int(owner_id)
    if completer_id is not None:
        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 is not None:
        params["due_before"] = due_before.isoformat()
    if due_after is not None:
        params["due_after"] = due_after.isoformat()
    if page_size is not None:
        params["page_size"] = page_size
    if page_token is not None:
        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 PaginatedResponse[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
379
380
381
382
383
384
385
386
387
388
389
390
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)