Async Python client for LinkedIn data export API
Project description
qodev-linkedin-api
Async Python client for LinkedIn data export API.
Installation
From PyPI (recommended)
pip install qodev-linkedin-api
# or
uv add qodev-linkedin-api
From GitHub (alternative)
uv add qodev-linkedin-api --source git+ssh://git@github.com/qodevai/linkedin-api.git
For development
git clone git@github.com:qodevai/linkedin-api.git
cd linkedin-api
make install
make install-hooks # Set up pre-commit hooks
Quick Start
make install # Install dependencies
make install-hooks # Set up pre-commit hooks (recommended)
make check # Run all quality checks
make test # Run tests with coverage
Usage
Basic Usage
import asyncio
from linkedin import LinkedInClient
async def main():
async with LinkedInClient() as client:
# Get all connections
connections = await client.get_connections()
for conn in connections:
print(f"{conn.first_name} {conn.last_name} - {conn.company}")
# Get invitations (both sent and received)
invitations = await client.get_invitations()
# Get only outgoing invitations
sent = await client.get_outgoing_invitations()
# Get inbox messages
messages = await client.get_inbox()
# Get changelog (API changes tracking)
changelog = await client.get_changelog()
asyncio.run(main())
Configuration
from linkedin import LinkedInClient
# Auth token from environment variable (default)
# Set LINKEDIN_AUTH_TOKEN env var
client = LinkedInClient()
# Or pass token directly
client = LinkedInClient(auth_token="your-token-here")
# Custom API version and timeout
client = LinkedInClient(
api_version="202312", # LinkedIn API version
timeout=60.0, # Request timeout in seconds
)
Error Handling
from linkedin import (
LinkedInClient,
AuthenticationError,
RateLimitError,
APIError,
)
async def fetch_with_retry():
try:
async with LinkedInClient() as client:
return await client.get_connections()
except AuthenticationError:
print("Invalid or expired token")
except RateLimitError as e:
print(f"Rate limited. Retry after: {e.retry_after} seconds")
except APIError as e:
print(f"API error {e.status_code}: {e}")
Models
All responses are typed Pydantic models:
from linkedin import Connection, Invitation, Message, ChangeLogEntry
# Connection fields
conn: Connection
conn.url # LinkedIn profile URL
conn.first_name
conn.last_name
conn.email # Optional
conn.company # Optional
conn.position # Optional
conn.connected_on # Date string
# Invitation fields
inv: Invitation
inv.to
inv.invitee_profile_url
inv.message # Optional
inv.direction # "OUTGOING" or "INCOMING"
inv.sent_at # Date string
# Message fields
msg: Message
msg.conversation_id
msg.from_member
msg.to_member # Optional
msg.content
msg.date # Date string
msg.subject # Optional
msg.folder # Optional
# ChangeLogEntry fields
entry: ChangeLogEntry
entry.id
entry.method
entry.resource_name
entry.captured_at # Unix timestamp (ms)
entry.processed_at # Unix timestamp (ms)
entry.captured_datetime # Property: datetime object
entry.processed_datetime # Property: datetime object
Development
Available Commands
make help # Show all available commands
make install # Install all dependencies
make install-hooks # Install pre-commit hooks
make check # Run all checks (lint, format, typecheck, typos)
make test # Run tests with coverage
make test-fast # Run tests without coverage
make lint # Lint code with ruff
make lint-fix # Auto-fix lint issues
make format # Format code with ruff
make typecheck # Run type checking with pyright
make typos # Check for typos
make build # Build package (sdist + wheel)
make clean # Clean generated files
Pre-commit Hooks
Pre-commit hooks run automatically on every commit:
make install-hooks # Install once
Hooks include:
- YAML/TOML/JSON validation
- Trailing whitespace removal
- Ruff linting and formatting
- Typos spell checking
Running Checks Manually
# Run all checks (recommended before committing)
make check
# Or run individual checks
make lint
make format-check
make typecheck
make typos
Environment Variables
| Variable | Description |
|---|---|
LINKEDIN_AUTH_TOKEN |
LinkedIn API auth token (required if not passed to client) |
Requirements
- Python 3.11+
- uv (for development)
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qodev_linkedin_api-0.3.0.tar.gz.
File metadata
- Download URL: qodev_linkedin_api-0.3.0.tar.gz
- Upload date:
- Size: 10.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
37239b7deb3005b3a734c8f25040ec59213c59f9a56b30c88aa9fa41df703d28
|
|
| MD5 |
ab447c613a22639bc83f1d92ccb12cc5
|
|
| BLAKE2b-256 |
4f23ca80605f5f10c5914fb86e47348513a3666c615885c17a0cf88f783d9a37
|
Provenance
The following attestation bundles were made for qodev_linkedin_api-0.3.0.tar.gz:
Publisher:
publish.yml on qodevai/linkedin-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qodev_linkedin_api-0.3.0.tar.gz -
Subject digest:
37239b7deb3005b3a734c8f25040ec59213c59f9a56b30c88aa9fa41df703d28 - Sigstore transparency entry: 985856757
- Sigstore integration time:
-
Permalink:
qodevai/linkedin-api@90dca4d7326118ff21333e6ed1c2f9b84c7bd0ed -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/qodevai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@90dca4d7326118ff21333e6ed1c2f9b84c7bd0ed -
Trigger Event:
push
-
Statement type:
File details
Details for the file qodev_linkedin_api-0.3.0-py3-none-any.whl.
File metadata
- Download URL: qodev_linkedin_api-0.3.0-py3-none-any.whl
- Upload date:
- Size: 8.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
03852138dbc9110b7a60db95ea549fff29e858174de4f3c8b1658c5a80d48608
|
|
| MD5 |
7b5b872eb037f3f5de718f1bd9a20ce9
|
|
| BLAKE2b-256 |
4fc8bd62e16ac5017162217c7c3628fd8d7e0cbdee56bbd1352fe3670c0d0689
|
Provenance
The following attestation bundles were made for qodev_linkedin_api-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on qodevai/linkedin-api
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qodev_linkedin_api-0.3.0-py3-none-any.whl -
Subject digest:
03852138dbc9110b7a60db95ea549fff29e858174de4f3c8b1658c5a80d48608 - Sigstore transparency entry: 985856800
- Sigstore integration time:
-
Permalink:
qodevai/linkedin-api@90dca4d7326118ff21333e6ed1c2f9b84c7bd0ed -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/qodevai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@90dca4d7326118ff21333e6ed1c2f9b84c7bd0ed -
Trigger Event:
push
-
Statement type: