profitelligence
SEC filings, insider trading and market signals in Python.
pip install profitelligence
import profitelligence as prof
prof.api_key("pk_live_...") # or set PROFITELLIGENCE_API_KEY
prices = prof.company.ohlc("AAPL", days=90) # 90 rows, typed
prices[0].close # 305.69, a float
prices.df # a DataFrame, with [pandas]
That is the whole idea. The Profitelligence API answers in pipe-delimited CSV. This package parses it, types it, and hands you rows you can work with.
What you get
Nine namespaces cover 68 endpoints. Every method is generated from the same API reference the documentation site renders, so the package cannot describe an endpoint the API does not have.
| Namespace | Data |
|---|---|
prof.company |
Profiles, daily prices, technical signals, corporate actions |
prof.filings |
8-K summaries and filing patterns |
prof.form4 |
Insider transactions, clusters, insider profiles |
prof.institutional |
13F holdings, managers, crowded trades |
prof.financials |
Income statement, balance sheet, cash flow |
prof.fred |
Economic series from the Federal Reserve |
prof.discovery |
Search, spotlights, interesting companies |
prof.graph |
The knowledge graph |
prof.analytics |
Correlations, opportunity scores, strategies |
Every method carries the endpoint's own documentation. In a notebook,
prof.form4.clusters? shows the arguments, the tier it needs, and the columns
it returns.
Authentication
Get a key at profitelligence.com/account/api-keys.
prof.api_key("pk_live_...") # for a notebook
export PROFITELLIGENCE_API_KEY=pk_live_...
You can also call with no key at all. Guests reach the free endpoints on the top 500 symbols, which is enough to try the package before you sign up.
In a service, build a client and hold it. One client is one connection pool.
from profitelligence import Client
with Client(api_key="pk_live_...", timeout=60) as prof:
holdings = prof.institutional.manager_top_holdings("0001067983")
Tables
CSV endpoints return a Table: named columns, typed values, one row object per
record. It is a normal Python sequence, so index it, slice it, and iterate it.
prices = prof.company.ohlc("AAPL,MSFT", days=180)
prices.columns # ['symbol', 'time', 'open', 'high', 'low', 'close']
len(prices) # 360
prices[0].close # 305.69 a float
prices[0].time # date(2026, 8, 17) a date
prices.column("close") # the whole column
prices.to_dicts() # plain dictionaries
Types come from the API reference where it declares them, and from the data
where it does not. A column is typed as a whole: if one value will not parse,
the column stays text rather than becoming a mix you cannot do arithmetic on.
An empty cell is None, never 0 and never "".
For pandas, install the extra:
pip install 'profitelligence[pandas]'
frame = prices.df # or prices.to_pandas()
frame.set_index("time").close.resample("W").last()
Date columns arrive as datetime64, so resampling and plotting work with no
further conversion.
JSON endpoints — the page routes, FRED, search, and the knowledge graph — return the decoded body as it stands.
When a call does not work
Errors say what happened, in the API's own words.
try:
scores = prof.analytics.opportunities()
except prof.UpgradeRequired as error:
print(error.message) # the plan this endpoint needs
except prof.RateLimited as error:
print(error.retry_after) # seconds until the window resets
| Error | Means |
|---|---|
AuthenticationError |
The key is absent, wrong, or revoked |
UpgradeRequired |
Your plan does not include this endpoint or this symbol |
RateLimited |
The window is spent. retry_after, limit, remaining, reset |
BadRequest |
An argument is missing or out of range |
NoData |
The API looked and found nothing to return |
ServerError |
The API failed. The client already retried twice |
Timeout |
No answer inside the timeout |
All of them inherit ProfitelligenceError.
A rate limit is never retried behind your back. A notebook that sleeps for a minute without telling you is worse than an error you can see. Server errors and timeouts are retried twice, with backoff.
Two of these deserve a word. The API sometimes reports a problem in-band: HTTP
200, with a body of error,<message>. Read raw, that looks like success and
parses to nothing. This package raises instead — BadRequest when you caused
it, NoData when the API simply had nothing — so an empty result never passes
for a real one. A genuinely empty result, which the API returns as a header row
with no data rows, stays an empty Table.
What this package does not do
It reads. There is nothing here that writes to your account, and nothing that places a trade.
It reports what filings and prices show. It does not advise, predict, or recommend. What you do with the data is your decision, and a licensed advisor is the right person to help you make it.
Rate limits and tiers
Each key has a request window and a symbol list that follow your plan. Guests
and Free see the top 500 symbols, Pro the top 6,000, Elite all of them. A
symbol outside your tier raises UpgradeRequired with the plan it needs.
How this package is built
The client is generated. The nine modules under
src/profitelligence/resources/ are produced by codegen/generate.py from
codegen/spec.json, which is exported from the same API reference that renders
at profitelligence.com/api-reference.
That reference is the contract: an endpoint reaches this package by being
documented, not by someone hand-writing a signature.
Editing a generated file therefore has no lasting effect — the next generation
replaces it. The hand-written part is the core: client.py, _http.py,
table.py and errors.py.
uv sync --group dev
pytest # offline, every response mocked
pytest -m live # hits the public API; no key needed for the free endpoints
ruff check . && ruff format --check .
The source repository is private, so there is nowhere to send a pull request.
Bug reports are genuinely useful and are acted on: mail
support@profitelligence.com or use
profitelligence.com/support, and say
what you called, what came back, what you expected, and your Python and
profitelligence.__version__. A failing five-line script is worth more than a
paragraph.
License
MIT.
Metadata
Release files for profitelligence 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| profitelligence-0.1.1.tar.gz | 64.9 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| profitelligence-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 110.9 kB
Release files / profitelligence-0.1.1.tar.gz
| Download URL | profitelligence-0.1.1.tar.gz |
|---|---|
| Size | 64.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
48a4e23c323b275c3e09f47d85ffd5b935ed120a2fdc60174f6c0dbea4f0fa9b
|
|
BLAKE2b-256 checksum How to use checksums |
15a08d5904a7b51a3624f2d88c51c440138d8a88bd81797baa89d7658f40a59f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.
Transparency logRelease files / profitelligence-0.1.1-py3-none-any.whl
| Download URL | profitelligence-0.1.1-py3-none-any.whl |
|---|---|
| Size | 46.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d3a2cbed99f9c6fd0c31b8d566cca3d8a4d7ba9077a6693613ec3d488b0671a2
|
|
BLAKE2b-256 checksum How to use checksums |
40cbeae92c9c5be497c549031f75df195b88cb3752170ccce206aca7c0b767db
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.
Transparency logSecurity for profitelligence 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for profitelligence-0.1.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.