Skip to main content

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)

Source distribution for profitelligence 0.1.1
File Size Uploaded Provenance
profitelligence-0.1.1.tar.gz 64.9 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for profitelligence 0.1.1
File Interpreter ABI Platform
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page