- Start with a rough objective.
- Enhance the objective with
POST /enhance-objective. - Create and submit a strategy.
- Poll until processing is complete (
status == 100). - Review holdings.
- Look up a company id from a symbol with
POST /helper/companies/search. - Fetch reasoning and evidence for a company.
- Craft exclusion phrases grounded in the holdings, then
PATCHthem onto the strategy. - Resubmit and repeat. Optionally generate an inverse objective with
POST /reverse-objectiveand run the same loop.
requests library.
All requests target the REST API base URL https://api.noonum.ai/v2 and authenticate with an
Authorization: Bearer <token> header, where the token is your Noonum API key.
See Authentication for details.
Public-catalog strategies are read-only. You can read them, but you can only refine strategies you own.
Each time you submit a changed draft, Noonum freezes the new objective and exclusions into a fresh
active version and reads default to that version. Watch
active_version_id and draft_version_id
to track which version is serving and whether your draft has unsaved edits.
See Objective versioning for the full model.Setup
Iterate a strategy until you’re happy
1. Start with an objective, then enhance it
2. Create a strategy from the enhanced objective
3. Submit the strategy for processing
Submitting does not generate a factsheet by default. While you’re iterating quickly, that keeps
each run fast and avoids blocking on factsheet generation. When you want one, pass
create_factsheet: true in the submit body, or request it separately later (see
Where to go next).4. Poll until processing is complete
See Build a strategy for how submit-and-poll works (status == 100
means processing finished).
5. Review companies in the strategy
id for fetching its reasoning and evidence.
6. Look up a company id from a symbol
If you have a symbol in mind (e.g."ABC") but don’t know the Noonum company id,
use POST /helper/companies/search.
7. Fetch evidence for a company in your strategy
This endpoint explains why a company is or isn’t in your strategy results:- If the company fits the strategy, you’ll see
isIncluded: true, a human-readablereasoning, andsummariescontaining the evidence excerpts. - If the company does not fit (or there isn’t enough supporting evidence), you’ll still
get a response with
isIncluded: false, a short “why not” message inreasoning, and typically an emptysummarieslist.
8. Craft exclusion phrases grounded in the holdings
An exclusion is a short phrase describing a category of companies you want removed. After you add exclusions and resubmit, the matching companies drop out and new companies may surface to replace them. Add an exclusion to remove a specific company you don’t want even if it’s otherwise relevant, or to remove a type of company such as a sector or business activity. Write each phrase as a short description of what a company is (2–6 words, no negation, no “exclude” prefix, no company names). See Build a strategy for the full exclusion rules. Ground the phrase in the holdings: look at the inclusion reasoning of the companies you want to remove, and describe the shared pattern.POST /exclusion-phrases turns a company’s evidence and reasoning into suggested phrases.
You can also write your own. Pass:
- your strategy
objective - the
companyIdyou’re reviewing - the company’s
inclusionReason(use thereasoningfield you just fetched)
9. Update the strategy with your exclusions, then resubmit
objective or exclusions changes the draft, so draft_version_id becomes null
until you resubmit. The next submit freezes the new draft into a fresh active version.
See Objective versioning for details.
Resubmit and repeat the review loop.
Create an inverse strategy objective
UsePOST /reverse-objective to generate an “inverse” strategy, then repeat the loop above.
POST /strategieswithinverse_nameandinverse_objectivePOST /strategies/{strategyId}/submit- poll
GET /strategies/{strategyId}untilstatus == 100 - review companies and evidence
- craft exclusions and
PATCH /strategies/{strategyId}with the updatedexclusions - resubmit and repeat
Generate historical results
There is no/historical-data endpoint in v2. To produce results for a past date, submit a run
with a past as_of_date, poll that (version, date) cell to completion, then read its companies
with asOfDate. Historical runs are rate-limited; an already-in-flight run for the same date
returns 423.
1. Submit historical runs for specific month-end dates
Submit once per date against the active version. You can omitversion_id (it defaults to the
current draft’s version), but pinning it to the active version is unambiguous.
2. Poll a historical run to completion
Poll the(version, date) cell via GET /strategies/{strategyId}/versions/{versionId} with asOfDate.
3. List the dates that are ready
4. Read historical results for one date
Use the companies endpoint withasOfDate. The response shape matches the live results.
Where to go next
After refinement, request a factsheet withPOST /strategies/{strategyId}/factsheet, then
GET /strategies/{strategyId}/factsheet — it returns a 302 redirect to the PDF when ready,
or a 200 status body (generating / not_requested) while it is still being produced. You
can also pass create_factsheet: true on the original submit. (The MCP server tool
get_strategy_factsheet drives the same flow.)
- Analyze strategies: filter, sort, and compare holdings.
- REST integration: wire the loop into your own application.
- MCP server: drive the same workflow from an agent.