Skip to content

Provider Profile

Resource

ProviderProfileResource

Operations on provider profile data (certs, licenses, IDs, etc.).

Source code in src/assured/resources/provider_profile.py
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
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
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
452
453
454
455
456
457
458
459
460
class ProviderProfileResource:
    """Operations on provider profile data (certs, licenses, IDs, etc.)."""

    def __init__(self, client: AssuredClient) -> None:
        self._client = client

    # ---- Personal Info ----

    async def get_personal_info(self, provider_id: str) -> ProviderPersonalInfo:
        """GET provider personal info by provider ID."""
        path = _PERSONAL_INFO.format(id=provider_id)
        data = await self._client._get(path)
        return ProviderPersonalInfo.model_validate(data)

    async def update_personal_info(
        self,
        provider_id: str,
        data: ProviderPersonalInfoUpdate,
    ) -> ProviderPersonalInfo:
        """PATCH provider personal info (partial update).

        The API requires the full model on every PATCH, so this method
        automatically fetches the current record, overlays your changes,
        and sends the complete payload.  You only need to set the fields
        you want to change on ``data``.
        """
        # 1. Fetch current state as JSON-safe dict (all fields, dates as ISO strings)
        current = await self.get_personal_info(provider_id)
        merged = current.model_dump(mode="json")

        # 2. Overlay user-provided fields (explicit None → sends null to clear)
        merged.update(data.model_dump(mode="json", exclude_unset=True))

        # 3. PATCH with full payload
        path = _PERSONAL_INFO.format(id=provider_id)
        resp = await self._client._patch(path, json=merged)
        return ProviderPersonalInfo.model_validate(resp)

    async def update_ssn(self, provider_id: str, ssn: str, jwt: str) -> dict[str, Any]:
        """Encrypt and update a provider's SSN.

        Due to platform limitations, the SSN must be symmetrically encrypted
        using AES-256-CTR with the JWT token as the derivation source.
        This specific endpoint also requires the JWT for Bearer Auth instead
        of the standard API key.
        """
        import base64
        import hashlib
        import os

        from cryptography.hazmat.backends import default_backend
        from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

        # Normalize SSN
        ssn_digits = ssn.replace("-", "").strip()

        # Encrypt SSN using Assured's frontend scheme
        key = hashlib.sha256(jwt.encode("utf-8")).digest()
        iv = os.urandom(16)
        cipher = Cipher(algorithms.AES(key), modes.CTR(iv), backend=default_backend())
        enc = cipher.encryptor()
        ciphertext = enc.update(ssn_digits.encode("utf-8")) + enc.finalize()
        encrypted_ssn = base64.b64encode(iv + ciphertext).decode("ascii")

        # Execute PATCH Request with Bearer Auth
        path = f"/api/v1/users/retrieve-update-provider-ssn-sym-encrypted/{provider_id}/"
        url = self._client._settings.base_url.rstrip("/") + path

        import httpx

        async with httpx.AsyncClient() as client:
            resp = await client.patch(
                url,
                json={"ssn": encrypted_ssn},
                headers={"Authorization": f"Bearer {jwt}"},
                timeout=30.0,
            )
            resp.raise_for_status()
            return resp.json()

    # ---- Certifications ----

    async def list_certifications(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[Certification]:
        data = await self._client._get_page(_CERTS, params=_params(provider, limit, offset))
        return [Certification.model_validate(i) for i in data.get("results", [])]

    async def list_certifications_all(self, *, provider: str | None = None) -> list[Certification]:
        records = await self._client._get_all_pages(_CERTS, params=_params(provider))
        return [Certification.model_validate(i) for i in records]

    async def list_certifications_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_CERTS, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_certification(self, data: CertificationCreate) -> dict[str, Any]:
        return await self._client._post(_CERTS, json=data.model_dump(mode="json", exclude_none=False))

    # ---- Licenses ----

    async def list_licenses(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[License]:
        data = await self._client._get_page(_LICENSE, params=_params(provider, limit, offset))
        return [License.model_validate(i) for i in data.get("results", [])]

    async def list_licenses_all(self, *, provider: str | None = None) -> list[License]:
        records = await self._client._get_all_pages(_LICENSE, params=_params(provider))
        return [License.model_validate(i) for i in records]

    async def list_licenses_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_LICENSE, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_license(self, data: LicenseCreate) -> dict[str, Any]:
        return await self._client._post(_LICENSE, json=data.model_dump(mode="json", exclude_none=False))

    # ---- DEA ----

    async def list_dea(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[DEARecord]:
        data = await self._client._get_page(_DEA, params=_params(provider, limit, offset))
        return [DEARecord.model_validate(i) for i in data.get("results", [])]

    async def list_dea_all(self, *, provider: str | None = None) -> list[DEARecord]:
        records = await self._client._get_all_pages(_DEA, params=_params(provider))
        return [DEARecord.model_validate(i) for i in records]

    async def list_dea_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_DEA, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_dea(self, data: DEARecordCreate) -> dict[str, Any]:
        return await self._client._post(_DEA, json=data.model_dump(mode="json", exclude_none=False))

    # ---- CDS ----

    async def list_cds(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[CDSRecord]:
        data = await self._client._get_page(_CDS, params=_params(provider, limit, offset))
        return [CDSRecord.model_validate(i) for i in data.get("results", [])]

    async def list_cds_all(self, *, provider: str | None = None) -> list[CDSRecord]:
        records = await self._client._get_all_pages(_CDS, params=_params(provider))
        return [CDSRecord.model_validate(i) for i in records]

    async def list_cds_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_CDS, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_cds(self, data: CDSRecordCreate) -> dict[str, Any]:
        return await self._client._post(_CDS, json=data.model_dump(mode="json", exclude_none=False))

    # ---- Medicaid ----

    async def list_medicaid(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[MedicaidRecord]:
        data = await self._client._get_page(_MEDICAID, params=_params(provider, limit, offset))
        return [MedicaidRecord.model_validate(i) for i in data.get("results", [])]

    async def list_medicaid_all(self, *, provider: str | None = None) -> list[MedicaidRecord]:
        records = await self._client._get_all_pages(_MEDICAID, params=_params(provider))
        return [MedicaidRecord.model_validate(i) for i in records]

    async def list_medicaid_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_MEDICAID, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_medicaid(self, data: MedicaidRecordCreate) -> dict[str, Any]:
        return await self._client._post(_MEDICAID, json=data.model_dump(mode="json", exclude_none=False))

    # ---- Medicare ----

    async def list_medicare(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[MedicareRecord]:
        data = await self._client._get_page(_MEDICARE, params=_params(provider, limit, offset))
        return [MedicareRecord.model_validate(i) for i in data.get("results", [])]

    async def list_medicare_all(self, *, provider: str | None = None) -> list[MedicareRecord]:
        records = await self._client._get_all_pages(_MEDICARE, params=_params(provider))
        return [MedicareRecord.model_validate(i) for i in records]

    async def list_medicare_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_MEDICARE, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_medicare(self, data: MedicareRecordCreate) -> dict[str, Any]:
        return await self._client._post(_MEDICARE, json=data.model_dump(mode="json", exclude_none=False))

    # ---- Employment ----

    async def list_employments(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[Employment]:
        data = await self._client._get_page(_EMPLOYMENT, params=_params(provider, limit, offset))
        return [Employment.model_validate(i) for i in data.get("results", [])]

    async def list_employments_all(self, *, provider: str | None = None) -> list[Employment]:
        records = await self._client._get_all_pages(_EMPLOYMENT, params=_params(provider))
        return [Employment.model_validate(i) for i in records]

    async def list_employments_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_EMPLOYMENT, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_employment(self, data: EmploymentCreate) -> dict[str, Any]:
        return await self._client._post(_EMPLOYMENT, json=data.model_dump(mode="json", exclude_none=False))

    # ---- Gap History ----

    async def list_gap_history(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[GapHistory]:
        data = await self._client._get_page(_GAP, params=_params(provider, limit, offset))
        return [GapHistory.model_validate(i) for i in data.get("results", [])]

    async def list_gap_history_all(self, *, provider: str | None = None) -> list[GapHistory]:
        records = await self._client._get_all_pages(_GAP, params=_params(provider))
        return [GapHistory.model_validate(i) for i in records]

    async def list_gap_history_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_GAP, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_gap_history(self, data: GapHistoryCreate) -> dict[str, Any]:
        return await self._client._post(_GAP, json=data.model_dump(mode="json", exclude_none=False))

    # ---- Education ----

    async def list_education(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[Education]:
        data = await self._client._get_page(_EDUCATION, params=_params(provider, limit, offset))
        return [Education.model_validate(i) for i in data.get("results", [])]

    async def list_education_all(self, *, provider: str | None = None) -> list[Education]:
        records = await self._client._get_all_pages(_EDUCATION, params=_params(provider))
        return [Education.model_validate(i) for i in records]

    async def list_education_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_EDUCATION, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_education(self, data: EducationCreate) -> dict[str, Any]:
        return await self._client._post(_EDUCATION, json=data.model_dump(mode="json", exclude_none=False))

    # ---- Professional Training ----

    async def list_training(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[ProfessionalTraining]:
        data = await self._client._get_page(_TRAINING, params=_params(provider, limit, offset))
        return [ProfessionalTraining.model_validate(i) for i in data.get("results", [])]

    async def list_training_all(self, *, provider: str | None = None) -> list[ProfessionalTraining]:
        records = await self._client._get_all_pages(_TRAINING, params=_params(provider))
        return [ProfessionalTraining.model_validate(i) for i in records]

    async def list_training_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_TRAINING, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_training(self, data: ProfessionalTrainingCreate) -> dict[str, Any]:
        return await self._client._post(_TRAINING, json=data.model_dump(mode="json", exclude_none=False))

    # ---- Documents ----

    async def create_document(self, data: ProviderDocumentCreate) -> ProviderDocument:
        payload = data.model_dump(mode="json", exclude_none=False)
        payload["id"] = ""
        payload["presigned_document_url"] = ""
        resp = await self._client._post(_DOCUMENTS, json=payload, requires_jwt=True)
        return ProviderDocument.model_validate(resp)

    async def upload_and_associate_document(
        self,
        provider_id: str,
        file_content: bytes,
        filename: str,
        document_name: str,
        document_type: str,
        mime_type: str | None = None,
    ) -> ProviderDocument:
        """High-level orchestration: uploads a file to S3 and associates it to a provider.

        This manages both steps of the hidden endpoints automatically:
        1. Submits file to `/api/v1/files/handle/` to acquire S3 storage URI.
        2. Submits association to `/api/v1/users/provider-documents/`.
        """
        import os

        ext = os.path.splitext(filename)[1].lower()
        if ext not in {".pdf", ".png", ".jpg", ".jpeg"}:
            raise ValueError(f"Unsupported file format: '{ext}'. Assured only accepts PDF, PNG, and JPEG files.")

        # Step 1: Upload file to storage backend
        file_record = await self._client.files.upload(
            file_content=file_content,
            filename=filename,
            mime_type=mime_type,
        )

        if not file_record.file_url:
            from assured.exceptions import AssuredAPIError

            raise AssuredAPIError(
                500,
                f"Failed to extract `file_url` from upload response: {file_record}",
                url=_DOCUMENTS,
            )

        # Step 2: Associate with provider
        doc_create = ProviderDocumentCreate(
            provider=provider_id,
            document_name=document_name,
            document_type=document_type,
            document_url=file_record.file_url,
        )
        return await self.create_document(doc_create)

    # ---- Professional Liability Insurance ----

    async def list_insurance(
        self,
        *,
        provider: str | None = None,
        limit: int | None = None,
        offset: int | None = None,
    ) -> list[ProfessionalLiabilityInsurance]:
        data = await self._client._get_page(_INSURANCE, params=_params(provider, limit, offset))
        return [ProfessionalLiabilityInsurance.model_validate(i) for i in data.get("results", [])]

    async def list_insurance_all(self, *, provider: str | None = None) -> list[ProfessionalLiabilityInsurance]:
        records = await self._client._get_all_pages(_INSURANCE, params=_params(provider))
        return [ProfessionalLiabilityInsurance.model_validate(i) for i in records]

    async def list_insurance_df(self, *, provider: str | None = None) -> pd.DataFrame:
        records = await self._client._get_all_pages(_INSURANCE, params=_params(provider))
        return self._client.to_dataframe(records)

    async def create_insurance(self, data: ProfessionalLiabilityInsuranceCreate) -> dict[str, Any]:
        return await self._client._post(_INSURANCE, json=data.model_dump(mode="json", exclude_none=False))

get_personal_info(provider_id) async

GET provider personal info by provider ID.

Source code in src/assured/resources/provider_profile.py
async def get_personal_info(self, provider_id: str) -> ProviderPersonalInfo:
    """GET provider personal info by provider ID."""
    path = _PERSONAL_INFO.format(id=provider_id)
    data = await self._client._get(path)
    return ProviderPersonalInfo.model_validate(data)

update_personal_info(provider_id, data) async

PATCH provider personal info (partial update).

The API requires the full model on every PATCH, so this method automatically fetches the current record, overlays your changes, and sends the complete payload. You only need to set the fields you want to change on data.

Source code in src/assured/resources/provider_profile.py
async def update_personal_info(
    self,
    provider_id: str,
    data: ProviderPersonalInfoUpdate,
) -> ProviderPersonalInfo:
    """PATCH provider personal info (partial update).

    The API requires the full model on every PATCH, so this method
    automatically fetches the current record, overlays your changes,
    and sends the complete payload.  You only need to set the fields
    you want to change on ``data``.
    """
    # 1. Fetch current state as JSON-safe dict (all fields, dates as ISO strings)
    current = await self.get_personal_info(provider_id)
    merged = current.model_dump(mode="json")

    # 2. Overlay user-provided fields (explicit None → sends null to clear)
    merged.update(data.model_dump(mode="json", exclude_unset=True))

    # 3. PATCH with full payload
    path = _PERSONAL_INFO.format(id=provider_id)
    resp = await self._client._patch(path, json=merged)
    return ProviderPersonalInfo.model_validate(resp)

update_ssn(provider_id, ssn, jwt) async

Encrypt and update a provider's SSN.

Due to platform limitations, the SSN must be symmetrically encrypted using AES-256-CTR with the JWT token as the derivation source. This specific endpoint also requires the JWT for Bearer Auth instead of the standard API key.

Source code in src/assured/resources/provider_profile.py
async def update_ssn(self, provider_id: str, ssn: str, jwt: str) -> dict[str, Any]:
    """Encrypt and update a provider's SSN.

    Due to platform limitations, the SSN must be symmetrically encrypted
    using AES-256-CTR with the JWT token as the derivation source.
    This specific endpoint also requires the JWT for Bearer Auth instead
    of the standard API key.
    """
    import base64
    import hashlib
    import os

    from cryptography.hazmat.backends import default_backend
    from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

    # Normalize SSN
    ssn_digits = ssn.replace("-", "").strip()

    # Encrypt SSN using Assured's frontend scheme
    key = hashlib.sha256(jwt.encode("utf-8")).digest()
    iv = os.urandom(16)
    cipher = Cipher(algorithms.AES(key), modes.CTR(iv), backend=default_backend())
    enc = cipher.encryptor()
    ciphertext = enc.update(ssn_digits.encode("utf-8")) + enc.finalize()
    encrypted_ssn = base64.b64encode(iv + ciphertext).decode("ascii")

    # Execute PATCH Request with Bearer Auth
    path = f"/api/v1/users/retrieve-update-provider-ssn-sym-encrypted/{provider_id}/"
    url = self._client._settings.base_url.rstrip("/") + path

    import httpx

    async with httpx.AsyncClient() as client:
        resp = await client.patch(
            url,
            json={"ssn": encrypted_ssn},
            headers={"Authorization": f"Bearer {jwt}"},
            timeout=30.0,
        )
        resp.raise_for_status()
        return resp.json()

upload_and_associate_document(provider_id, file_content, filename, document_name, document_type, mime_type=None) async

High-level orchestration: uploads a file to S3 and associates it to a provider.

This manages both steps of the hidden endpoints automatically: 1. Submits file to /api/v1/files/handle/ to acquire S3 storage URI. 2. Submits association to /api/v1/users/provider-documents/.

Source code in src/assured/resources/provider_profile.py
async def upload_and_associate_document(
    self,
    provider_id: str,
    file_content: bytes,
    filename: str,
    document_name: str,
    document_type: str,
    mime_type: str | None = None,
) -> ProviderDocument:
    """High-level orchestration: uploads a file to S3 and associates it to a provider.

    This manages both steps of the hidden endpoints automatically:
    1. Submits file to `/api/v1/files/handle/` to acquire S3 storage URI.
    2. Submits association to `/api/v1/users/provider-documents/`.
    """
    import os

    ext = os.path.splitext(filename)[1].lower()
    if ext not in {".pdf", ".png", ".jpg", ".jpeg"}:
        raise ValueError(f"Unsupported file format: '{ext}'. Assured only accepts PDF, PNG, and JPEG files.")

    # Step 1: Upload file to storage backend
    file_record = await self._client.files.upload(
        file_content=file_content,
        filename=filename,
        mime_type=mime_type,
    )

    if not file_record.file_url:
        from assured.exceptions import AssuredAPIError

        raise AssuredAPIError(
            500,
            f"Failed to extract `file_url` from upload response: {file_record}",
            url=_DOCUMENTS,
        )

    # Step 2: Associate with provider
    doc_create = ProviderDocumentCreate(
        provider=provider_id,
        document_name=document_name,
        document_type=document_type,
        document_url=file_record.file_url,
    )
    return await self.create_document(doc_create)

Models

ProviderPersonalInfo

Bases: BaseModel

Provider personal information (GET response).

Source code in src/assured/models/provider_profile.py
class ProviderPersonalInfo(BaseModel):
    """Provider personal information (GET response)."""

    nucc_grouping: str | None = None
    provider_type: str | None = None
    practice_setting: str | None = None
    primary_practice_state: str | None = None
    languages: list[str] | None = None
    additional_practice_states: list[str] | None = None
    first_name: str | None = None
    middle_name: str | None = None
    last_name: str | None = None
    suffix: str | None = None
    home_street_address_1: str | None = None
    home_street_address_2: str | None = None
    home_city: str | None = None
    home_state: str | None = None
    home_zip_code: str | None = None
    primary_email_address: str | None = None
    primary_phone: str | None = None
    individual_npi: str | None = None
    caqh_id: str | None = None
    ssn: str | None = None
    gender: str | None = None
    birth_date: date | None = None
    us_citizen: bool | None = None
    birth_country: str | None = None
    birth_state: str | None = None
    birth_city: str | None = None
    race: str | None = None
    county: str | None = None
    supervising_or_collaborative_physician_name: str | None = None
    physician_individual_npi: str | None = None
    home_phone_number: str | None = None
    fax_number: str | None = None
    correspondence_address_same_as_residence: bool | None = None
    correspondence_street_address_1: str | None = None
    correspondence_street_address_2: str | None = None
    correspondence_city: str | None = None
    correspondence_state: str | None = None
    correspondence_country: str | None = None
    correspondence_postal_code: str | None = None
    upin: str | None = None
    visa_number: str | None = None
    citizenship_country: str | None = None
    eligible_to_work_in_us: bool | None = None
    served_military: bool | None = None
    date_of_service_start: date | None = None
    date_of_service_end: date | None = None
    last_location_of_service: str | None = None
    branch_of_service: str | None = None
    is_ecfmg: bool | None = None
    ecfmg_number: str | None = None
    ecfmg_issue_date: date | None = None

ProviderPersonalInfoUpdate

Bases: BaseModel

Payload for PATCH /provider-personal-info/{id}/.

All fields optional — only send what you want to change.

Source code in src/assured/models/provider_profile.py
class ProviderPersonalInfoUpdate(BaseModel):
    """Payload for PATCH /provider-personal-info/{id}/.

    All fields optional — only send what you want to change.
    """

    nucc_grouping: str | None = None
    provider_type: str | None = None
    practice_setting: str | None = None
    primary_practice_state: str | None = None
    languages: list[str] | None = None
    additional_practice_states: list[str] | None = None
    first_name: str | None = None
    middle_name: str | None = None
    last_name: str | None = None
    suffix: str | None = None
    home_street_address_1: str | None = None
    home_street_address_2: str | None = None
    home_city: str | None = None
    home_state: str | None = None
    home_zip_code: str | None = None
    primary_email_address: str | None = None
    primary_phone: str | None = None
    individual_npi: str | None = None
    caqh_id: str | None = None
    ssn: str | None = None
    gender: str | None = None
    birth_date: date | None = None
    us_citizen: bool | None = None
    birth_country: str | None = None
    birth_state: str | None = None
    birth_city: str | None = None
    race: str | None = None
    county: str | None = None
    supervising_or_collaborative_physician_name: str | None = None
    physician_individual_npi: str | None = None
    home_phone_number: str | None = None
    fax_number: str | None = None
    correspondence_address_same_as_residence: bool | None = None
    correspondence_street_address_1: str | None = None
    correspondence_street_address_2: str | None = None
    correspondence_city: str | None = None
    correspondence_state: str | None = None
    correspondence_country: str | None = None
    correspondence_postal_code: str | None = None
    upin: str | None = None
    visa_number: str | None = None
    citizenship_country: str | None = None
    eligible_to_work_in_us: bool | None = None
    served_military: bool | None = None
    date_of_service_start: date | None = None
    date_of_service_end: date | None = None
    last_location_of_service: str | None = None
    branch_of_service: str | None = None
    is_ecfmg: bool | None = None
    ecfmg_number: str | None = None
    ecfmg_issue_date: date | None = None

Certification

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class Certification(BaseModel):
    id: str | None = None
    speciality: str | None = None
    certifying_board_name: str | None = None
    number: str | None = None
    initial_date: date | None = None
    expiration_date: date | None = None
    speciality_level: str | None = None
    document: str | None = None
    provider: str | None = None
    recertification_date: date | None = None
    is_board_certified: bool | None = None
    not_board_certified_reason: str | None = None
    maintenance_of_certification: bool | None = None
    list_in_hmo_directory: bool | None = None
    list_in_ppo_directory: bool | None = None
    list_in_pos_directory: bool | None = None
    other_practice_interest_or_focus: str | None = None
    board_exam_date: date | None = None

CertificationCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class CertificationCreate(BaseModel):
    provider: str
    speciality: str | None = None
    certifying_board_name: str | None = None
    number: str | None = None
    initial_date: date | None = None
    expiration_date: date | None = None
    speciality_level: str | None = None
    document: str | None = None
    recertification_date: date | None = None
    is_board_certified: bool | None = None
    not_board_certified_reason: str | None = None
    list_in_hmo_directory: bool | None = None
    list_in_ppo_directory: bool | None = None
    list_in_pos_directory: bool | None = None
    other_practice_interest_or_focus: str | None = None
    board_exam_date: date | None = None

License

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class License(BaseModel):
    id: str | None = None
    state: str | None = None
    number: str | None = None
    issue_date: date | None = None
    expiration_date: date | None = None
    license_type: str | None = None
    provider: str | None = None
    override_licenses_status: str | None = None
    is_currently_practicing_in_state: bool | None = None

LicenseCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class LicenseCreate(BaseModel):
    provider: str
    state: str | None = None
    number: str | None = None
    issue_date: date | None = None
    expiration_date: date | None = None
    license_type: str | None = None
    override_licenses_status: str | None = None
    is_currently_practicing_in_state: bool | None = None

DEARecord

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class DEARecord(BaseModel):
    id: str | None = None
    state: str | None = None
    number: str | None = None
    issue_date: date | None = None
    expiration_date: date | None = None
    license_unlimited: bool | None = None
    provider: str | None = None

DEARecordCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class DEARecordCreate(BaseModel):
    provider: str
    state: str | None = None
    number: str | None = None
    issue_date: date | None = None
    expiration_date: date | None = None
    license_unlimited: bool | None = None

CDSRecord

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class CDSRecord(BaseModel):
    id: str | None = None
    state: str | None = None
    number: str | None = None
    issue_date: date | None = None
    expiration_date: date | None = None
    provider: str | None = None
    is_currently_practicing_in_state: bool | None = None

CDSRecordCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class CDSRecordCreate(BaseModel):
    provider: str
    state: str | None = None
    number: str | None = None
    issue_date: date | None = None
    expiration_date: date | None = None
    is_currently_practicing_in_state: bool | None = None

MedicaidRecord

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class MedicaidRecord(BaseModel):
    id: str | None = None
    state: str | None = None
    number: str | None = None
    provider: str | None = None

MedicaidRecordCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class MedicaidRecordCreate(BaseModel):
    provider: str
    state: str | None = None
    number: str | None = None

MedicareRecord

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class MedicareRecord(BaseModel):
    id: str | None = None
    state: str | None = None
    number: str | None = None
    provider: str | None = None

MedicareRecordCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class MedicareRecordCreate(BaseModel):
    provider: str
    state: str | None = None
    number: str | None = None

Employment

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class Employment(BaseModel):
    id: str | None = None
    employer_name: str | None = None
    position: str | None = None
    type: str | None = None
    currently_employed: bool | None = None
    is_current: bool | None = None  # Keeping for backwards compatibility if needed
    start_date: date | None = None
    end_date: date | None = None
    gap_explanation: str | None = None
    address: str | None = None
    city: str | None = None
    state: str | None = None
    country: str | None = None
    zip_code: str | None = None
    phone_number: str | None = None
    email_address: str | None = None
    contact_information: str | None = None
    provider: str | None = None
    reason_for_discontinuance: str | None = None
    reason_for_leaving: str | None = None  # Keeping for backward compatibility
    document: str | None = None

EmploymentCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class EmploymentCreate(BaseModel):
    provider: str
    employer_name: str | None = None
    position: str | None = None
    type: str | None = None
    currently_employed: bool | None = None
    is_current: bool | None = None
    start_date: date | None = None
    end_date: date | None = None
    gap_explanation: str | None = None
    address: str | None = None
    city: str | None = None
    state: str | None = None
    country: str | None = None
    zip_code: str | None = None
    phone_number: str | None = None
    email_address: str | None = None
    contact_information: str | None = None
    reason_for_discontinuance: str | None = None
    reason_for_leaving: str | None = None
    document: str | None = None

GapHistory

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class GapHistory(BaseModel):
    id: str | None = None
    start_date: date | None = None
    end_date: date | None = None
    reason: str | None = None
    provider: str | None = None

GapHistoryCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class GapHistoryCreate(BaseModel):
    provider: str
    start_date: date | None = None
    end_date: date | None = None
    reason: str | None = None

Education

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class Education(BaseModel):
    id: str | None = None
    name: str | None = None
    institution_name: str | None = None  # Keeping for backward compatibility
    degree: str | None = None
    start_date: date | None = None
    end_date: date | None = None
    city: str | None = None
    state: str | None = None
    country: str | None = None
    is_primary: bool | None = None
    address_street_1: str | None = None
    address_street_2: str | None = None
    postal_code: str | None = None
    provider: str | None = None

EducationCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class EducationCreate(BaseModel):
    provider: str
    name: str | None = None
    institution_name: str | None = None
    degree: str | None = None
    start_date: date | None = None
    end_date: date | None = None
    city: str | None = None
    state: str | None = None
    country: str | None = None
    is_primary: bool | None = None
    address_street_1: str | None = None
    address_street_2: str | None = None
    postal_code: str | None = None

ProfessionalTraining

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class ProfessionalTraining(BaseModel):
    id: str | None = None
    institution_name: str | None = None
    program_type: str | None = None
    specialty: str | None = None
    start_date: date | None = None
    end_date: date | None = None
    provider: str | None = None

ProfessionalTrainingCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class ProfessionalTrainingCreate(BaseModel):
    provider: str
    institution_name: str | None = None
    program_type: str | None = None
    specialty: str | None = None
    start_date: date | None = None
    end_date: date | None = None

ProfessionalLiabilityInsurance

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class ProfessionalLiabilityInsurance(BaseModel):
    id: str | None = None
    carrier_name: str | None = None
    policy_number: str | None = None
    coverage_amount_per_occurrence: str | None = None
    coverage_amount_aggregate: str | None = None
    effective_date: date | None = None
    expiration_date: date | None = None
    provider: str | None = None

ProfessionalLiabilityInsuranceCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class ProfessionalLiabilityInsuranceCreate(BaseModel):
    provider: str
    carrier_name: str | None = None
    policy_number: str | None = None
    coverage_amount_per_occurrence: str | None = None
    coverage_amount_aggregate: str | None = None
    effective_date: date | None = None
    expiration_date: date | None = None

ProviderDocument

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class ProviderDocument(BaseModel):
    id: str | None = None
    provider: str | None = None
    document_name: str | None = None
    document_type: str | None = None
    document_url: str | None = None
    document_file: str | None = None
    uploaded_date: str | None = None
    expiration_date: str | None = None
    state: str | None = None
    presigned_document_url: str | None = None

ProviderDocumentCreate

Bases: BaseModel

Source code in src/assured/models/provider_profile.py
class ProviderDocumentCreate(BaseModel):
    provider: str
    document_name: str | None = None
    document_type: str | None = None
    document_url: str | None = None