# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [0.5.0] – 2025-09-27
### Added
- Introduced strongly‑typed `ProjectView`, with new `Project` and `ProjectMember`
structs replacing untyped `Value`.
This includes support for project metadata such as entity URN, title,
description, members, and time period.
### Changed
- Updated `get_profile` API to return `ProfileView` instead of `Profile`,
ensuring full compatibility with LinkedIn’s actual response structure.
- Derived helper fields (`profile_id`, contact info, and skills) now populate
correctly inside `ProfileView.profile`.
- All LinkedIn `entity_urn` fields were relaxed from `String` to `Option<String>`
to better handle LinkedIn’s inconsistent payloads.
- Adjusted `Language` typing: `proficiency` is now optional.
## [0.3.1] - 2025-09-27
### Added
- Added back wrapper types for NetworkInfo, School, Company, Conversation, ConversationDetails, and SearchPeopleParams.
- Implemented `FromStr` for `BirthDate`.
- Added important typing crates: `aho-corasick`, `anyhow`, `bincode`, `colored`, `csv`, `csv-core`, `either`, `email_address`, `heck`, `isolang`, `linked-hash-map`, `lru-cache`, `minimal-lexical`, `my_country`, `nom`, `oncemutex`, `phf`, `phf_shared`, `phonenumber`, `prettyplease`, `quick-xml`, `regex`, `regex-automata`, `regex-cache`, `regex-syntax`, `same-file`, `serde_yaml`, `siphasher`, `strum`, `strum_macros`, `thiserror`.
- Added `.cookies.json` for cookie management.
### Changed
- Made several fields in `Education` and `TimePeriod` optional.
- Made the core library type-aware by using strongly typed fields like `EmailAddress`, `BirthDate`, `Url`, and `PhoneNumber`.
- Fixed the naming scheme by removing `#[serde(rename = "entityUrn")]` and similar attributes from many fields.
- Introduced a new approach to typing, refactoring `types.rs` with new structs for `LinkedInProfileView`, `PersonName`, `Address`, `GeoLocation`, `BirthDate`, `Paging`, `CertificationView`, `Certification`, `CourseView`, `Course`, `HonorView`, `Honor`, `LanguageView`, `Language`, `LanguageProficiency`, `Experience`, `CompanyInfo`, `EmployeeCountRange`, `MiniCompany`, `Education`, `SchoolInfo`, `TestScoreView`, `TestScore`, `ContactInfo`, `Website`, `PositionGroupView`, `PositionGroup`, `PositionView`, `EducationView`, `SkillView`, `Skill`, `VolunteerExperienceView`, `VolunteerExperience`, `VolunteerCauseView`, `VolunteerCause`, `OrganizationView`, `PatentView`, `ProjectView`, `PublicationView`.
- Added back skipped fields and moved back towards the naming scheme in `Profile` and `ContactInfo`.
### Removed
- Removed all time period "convenience" methods (`duration_months`, `duration_string`).
### Fixed
- Fixed the language typing on `Locale` from `Language` to `isolang::Language`.
## [0.3.0] – 2025-09-26
### Added
* **Profiles** now include **contact information** by default when fetching a profile.
* This includes the new `ContactInfo` struct, which is added to the `Profile` struct.
* Updated the internal `get_profile_contact_info` function to correctly handle both `public_id` and `UniformResourceName` as input.
* The `get_profile_contact_info_by_urn` function now correctly accepts a `&UniformResourceName` as an argument.
* **Experience** entries now include a `role` and detailed `time_period` structure.
* This required adding the `TimePeriod` and `YearMonth` structs with custom serialization/deserialization logic to correctly handle the time data.
* The **`time` crate** dependency was added with the `["serde"]` feature to support the new time-related data structures.
* The `UniformResourceName` struct's visibility was changed from crate-private (`pub(crate)`) to **public** (`pub`).
### Changed
* Minor refactoring for cleaner string formatting in internal API calls (removed verbose `&format!(...)` in a few places in `src/linkedin.rs`).
## [0.2.1] - 2025-09-26
### Fixed
- The visibility on internal methods
## [0.2.0] - 2025-09-26
### Added
- Implemented helper methods `get_full_name()` and `get_profile_image()` on the `Profile` struct for more convenient data access.
### Changed
- Updated the authentication mechanism to rely on session tokens (`li_at` and `JSESSIONID`) instead of username and password credentials, improving security and stability.
### Fixed
- Corrected the SPDX license expression in `Cargo.toml` to `AGPL-3.0-or-later`.
- Updated the `basic.rs` example to be functional and align with the new authentication method.
- Refactored the test suite for clarity and correctness.
## [0.1.0] - 2025-09-22
### Added
- Implemented `PartialEq` for profile-related data structures to allow for direct comparison.
[Unreleased]: https://github.com/philocalyst/linkedin-api/compare/v0.5.0...HEAD
[0.5.0]: https://github.com/philocalyst/linkedin-api/compare/v0.3.1...v0.5.0
[0.3.1]: https://github.com/philocalyst/linkedin-api/compare/v0.3.0...v0.3.1
[0.3.0]: https://github.com/philocalyst/linkedin-api/compare/v0.2.1...v0.3.0
[0.2.1]: https://github.com/philocalyst/linkedin-api/compare/v0.2.0...v0.2.1
[0.2.0]: https://github.com/philocalyst/linkedin-api/compare/v0.1.0...v0.2.0
[0.1.0]: https://github.com/philocalyst/linkedin-api/compare/v0.1.0... (Comparing against the start of the project)