Security News
Fluent Assertions Faces Backlash After Abandoning Open Source Licensing
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.
A Python client for the Financial Modeling Prep (FMP) API with comprehensive logging, rate limiting, and error handling.
To use this library, you'll need an API key from Financial Modeling Prep (FMP). You can:
# Using pip
pip install fmp-data
# Using poetry
poetry add fmp-data
# For Langchain integration
pip install fmp-data[langchain]
# or
poetry add fmp-data --extras langchain
FMP_API_KEY
) - Get one hereOPENAI_API_KEY
) - Required for embeddingsfrom fmp_data import create_vector_store
# Initialize the vector store
vector_store = create_vector_store(
fmp_api_key="YOUR_FMP_API_KEY", # pragma: allowlist secret
openai_api_key="YOUR_OPENAI_API_KEY" # pragma: allowlist secret
)
# Example queries
queries = [
"what is the price of Apple stock?",
"what was the revenue of Tesla last year?",
"what's new in the market?"
]
# Search for relevant endpoints and tools
for query in queries:
print(f"\nQuery: {query}")
# Get tools formatted for OpenAI
tools = vector_store.get_tools(query, provider="openai")
print("\nMatching Tools:")
for tool in tools:
print(f"Name: {tool.get('name')}")
print(f"Description: {tool.get('description')}")
print("Parameters:", tool.get('parameters'))
print()
# You can also search endpoints directly
results = vector_store.search(query)
print("\nRelevant Endpoints:")
for result in results:
print(f"Endpoint: {result.name}")
print(f"Score: {result.score:.2f}")
print()
from fmp_data import FMPDataClient, ClientConfig
from fmp_data.lc.config import LangChainConfig
from fmp_data.lc.embedding import EmbeddingProvider
# Configure with LangChain support
config = LangChainConfig(
api_key="YOUR_FMP_API_KEY", # pragma: allowlist secret
embedding_provider=EmbeddingProvider.OPENAI,
embedding_api_key="YOUR_OPENAI_API_KEY", # pragma: allowlist secret
embedding_model="text-embedding-3-small"
)
# Create client with LangChain config
client = FMPDataClient(config=config)
# Create vector store using the client
vector_store = client.create_vector_store()
# Search for relevant endpoints
results = vector_store.search("show me Tesla's financial metrics")
for result in results:
print(f"Found endpoint: {result.name}")
print(f"Relevance score: {result.score:.2f}")
Try out the LangChain integration in our interactive Colab notebook:
This notebook demonstrates how to:
You can also configure the integration using environment variables:
# Required
export FMP_API_KEY=your_fmp_api_key_here
export OPENAI_API_KEY=your_openai_api_key_here
# Optional
export FMP_EMBEDDING_PROVIDER=openai
export FMP_EMBEDDING_MODEL=text-embedding-3-small
from fmp_data import FMPDataClient, ClientConfig, LoggingConfig
from fmp_data.exceptions import FMPError, RateLimitError, AuthenticationError
# Method 1: Initialize with direct API key
client = FMPDataClient(api_key="your_api_key_here") # pragma: allowlist secret
# Method 2: Initialize from environment variable (FMP_API_KEY)
client = FMPDataClient.from_env()
# Method 3: Initialize with custom configuration
config = ClientConfig(
api_key="your_api_key_here", #pragma: allowlist secret
timeout=30,
max_retries=3,
base_url="https://financialmodelingprep.com/api",
logging=LoggingConfig(level="INFO")
)
client = FMPDataClient(config=config)
# Using with context manager (recommended)
with FMPDataClient(api_key="your_api_key_here") as client: # pragma: allowlist secret
try:
# Get company profile
profile = client.company.get_profile("AAPL")
print(f"Company: {profile.company_name}")
print(f"Industry: {profile.industry}")
print(f"Market Cap: ${profile.mkt_cap:,.2f}")
# Search companies
results = client.company.search("Tesla", limit=5)
for company in results:
print(f"{company.symbol}: {company.name}")
except RateLimitError as e:
print(f"Rate limit exceeded. Wait {e.retry_after} seconds")
except AuthenticationError:
print("Invalid API key")
except FMPError as e:
print(f"API error: {e}")
# Client is automatically closed after the with block
from fmp_data import FMPDataClient
with FMPDataClient.from_env() as client:
# Get company profile
profile = client.company.get_profile("AAPL")
# Get company executives
executives = client.company.get_executives("AAPL")
# Search companies
results = client.company.search("Tesla", limit=5)
# Get employee count history
employees = client.company.get_employee_count("AAPL")
from fmp_data import FMPDataClient
with FMPDataClient.from_env() as client:
# Get income statements
income_stmt = client.fundamental.get_income_statement(
"AAPL",
period="quarter", # or "annual"
limit=4
)
# Get balance sheets
balance_sheet = client.fundamental.get_balance_sheet(
"AAPL",
period="annual"
)
# Get cash flow statements
cash_flow = client.fundamental.get_cash_flow_statement("AAPL")
from fmp_data import FMPDataClient
with FMPDataClient.from_env() as client:
# Get real-time quote
quote = client.market.get_quote("TSLA")
# Get historical prices
history = client.market.get_historical_price(
"TSLA",
from_date="2023-01-01",
to_date="2023-12-31"
)
import asyncio
from fmp_data import FMPDataClient
async def get_multiple_profiles(symbols):
async with FMPDataClient.from_env() as client:
tasks = [client.company.get_profile_async(symbol)
for symbol in symbols]
return await asyncio.gather(*tasks)
# Run async function
symbols = ["AAPL", "MSFT", "GOOGL"]
profiles = asyncio.run(get_multiple_profiles(symbols))
# Required
FMP_API_KEY=your_api_key_here
# Optional
FMP_BASE_URL=https://financialmodelingprep.com/api
FMP_TIMEOUT=30
FMP_MAX_RETRIES=3
# Rate Limiting
FMP_DAILY_LIMIT=250
FMP_REQUESTS_PER_SECOND=10
FMP_REQUESTS_PER_MINUTE=300
# Logging
FMP_LOG_LEVEL=INFO
FMP_LOG_PATH=/path/to/logs
FMP_LOG_MAX_BYTES=10485760
FMP_LOG_BACKUP_COUNT=5
from fmp_data import FMPDataClient, ClientConfig, LoggingConfig, RateLimitConfig, LogHandlerConfig
config = ClientConfig(
api_key="your_api_key_here", # pragma: allowlist secret
timeout=30,
max_retries=3,
base_url="https://financialmodelingprep.com/api",
rate_limit=RateLimitConfig(
daily_limit=250,
requests_per_second=10,
requests_per_minute=300
),
logging=LoggingConfig(
level="DEBUG",
handlers={
"console": LogHandlerConfig(
class_name="StreamHandler",
level="INFO",
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
),
"file": LogHandlerConfig(
class_name="RotatingFileHandler",
level="DEBUG",
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handler_kwargs={
"filename": "fmp.log",
"maxBytes": 10485760,
"backupCount": 5
}
)
}
)
)
client = FMPDataClient(config=config)
from fmp_data import FMPDataClient
from fmp_data.exceptions import (
FMPError,
RateLimitError,
AuthenticationError,
ValidationError,
ConfigError
)
try:
with FMPDataClient.from_env() as client:
profile = client.company.get_profile("INVALID")
except RateLimitError as e:
print(f"Rate limit exceeded. Wait {e.retry_after} seconds")
print(f"Status code: {e.status_code}")
print(f"Response: {e.response}")
except AuthenticationError as e:
print("Invalid API key or authentication failed")
print(f"Status code: {e.status_code}")
except ValidationError as e:
print(f"Invalid parameters: {e.message}")
except ConfigError as e:
print(f"Configuration error: {e.message}")
except FMPError as e:
print(f"General API error: {e.message}")
git clone https://github.com/MehdiZare/fmp-data.git
cd fmp-data
poetry install
poetry run pre-commit install
# Run all tests with coverage
poetry run pytest --cov=fmp_data
# Run specific test file
poetry run pytest tests/test_client.py
# Run integration tests (requires API key)
FMP_TEST_API_KEY=your_test_api_key poetry run pytest tests/integration/
View the latest test coverage report here.
git checkout -b feature-name
poetry run pytest
Please ensure:
This project is licensed under the MIT License - see the LICENSE file for details.
# Basic usage example
from fmp_data import FMPDataClient
with FMPDataClient.from_env() as client:
# Get company profile
profile = client.company.get_profile("AAPL")
print(f"Company: {profile.company_name}")
See CHANGELOG.md for a list of changes in each release.
FAQs
Python client for Financial Modeling Prep API
We found that fmp-data demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.
Research
Security News
Socket researchers uncover the risks of a malicious Python package targeting Discord developers.
Security News
The UK is proposing a bold ban on ransomware payments by public entities to disrupt cybercrime, protect critical services, and lead global cybersecurity efforts.