Skip to main content
The official command-line tool is @investorlift/cli. Its binary is investorlift. It is in beta, and its version starts at 0. It runs every endpoint of this reference as one command, through the official TypeScript package. You need Node 20 or later and a key. You write no code.
Investorlift generates the command table from the same OpenAPI document that generates this reference. A new endpoint or a new filter reaches the tool at the next release. The --help of each command is the description on its endpoint page, with the cost sentence.
1

Run it

npx downloads the tool and runs it. To keep it on your path, install it once:
2

Give it the key

The tool reads GM_API_KEY first. For a key that stays on this machine, run investorlift auth login. The tool asks for the key with echo off and writes it to a file only you can read. investorlift auth status says which source is in use and masks the key. investorlift auth logout removes the file.The file is ~/.config/investorlift/credentials.json. When XDG_CONFIG_HOME holds an absolute path, the file is $XDG_CONFIG_HOME/investorlift/credentials.json. investorlift auth login also stores the host when you pass --base-url or export GM_BASE_URL. A later call without --base-url and without GM_BASE_URL uses the stored host.A key file the tool cannot parse is a usage error that names the file. The tool refuses a host without http:// or https://. That error names the source: --base-url, GM_BASE_URL or the key file. On Windows the file has no 0600 mode. Your user profile alone protects it there.The tool has no --api-key flag, so a key never lands in your shell history. Get an API key explains the console.
3

Make one call

On a terminal the answer is a table. In a pipe or a file it is the JSON the API sent. --format json, table, csv or ndjson overrides that. The response facts go to stderr after every call, so stdout is the answer alone:
Quote the request id to support@investorlift.com. --quiet drops the line.
4

Find the command

The command is the endpoint’s method name on the SDKs page, as two words. deals.summary is deals summary. wholesaleListings.list is wholesale-listings list. A flag is a query parameter with dashes: radius_miles is --radius-miles, and the tool also accepts --radius_miles. An id in the path is the first argument. A list parameter repeats the flag, or takes a comma list.
--body takes a JSON text, @file.json, or - for stdin. Every request block on this site has a CLI tab that shows the same call. investorlift <group> <command> --help lists the flags of one command with the text of its endpoint page.
5

Write a spreadsheet

--all follows page.next_cursor to the last page. A command that spends credits requires --max-pages, because every page adds to the bill. A command at 0 credits takes no bound. The CSV flattens a nested block into dotted columns, property.zip, and --columns id,property.zip,bought_price picks and orders them.With --format json, --all prints one document that the tool builds, not the envelope of one page. data holds the rows of every page. meta and summary come from the first page. page is { pages, next_cursor }: the count of pages read, and the cursor after the last page read.A 400 invalid_cursor in the middle of a long export stops the loop with the error’s exit code, here 2. The tool first prints the pages it has, in the requested format. Then it prints the error. Stderr states how many pages it printed and names the resume cursor as --cursor <c>. The tool never starts again from page 1 on its own. Give me a spreadsheet shows the same export with the loop written out.
6

Read an error

A refusal prints the problem body on stderr. The body has the status and the code, the detail, the recovery sentence and the request id. The exit code names the family, so a script can branch on it:With --format json the problem body goes to stdout instead, with the exit code inside it. A parser then reads one stream. The codes and the recovery sentences are on Errors.
7

See the request

--dry-run prints the curl command the tool is about to send, with $GM_API_KEY where the key goes, and sends nothing. Use it to learn the raw API, or to paste a request into a bug report.

Retries and freshness

The tool retries as the package does, and no more. It retries a 429 and the two 503 codes that carry Retry-After. It retries one 500 internal_error and one connection failure before an answer. --max-retries 0 turns them off. The rule is on Rate limits. --etag sends If-None-Match. A 304 prints not modified on stderr, nothing on stdout, and exits 0. The flag works on a command that answers one record or one summary. On every paged command the tool refuses it with a usage error, exit code 1. investorlift dataset get --etag <etag> is the freshness probe. Every call prints dataset_version in its facts line. The cache window is the rule.

Flags on every command

Shell completion

What the tool does not do

  • It does not create a key, change a plan or show your usage. The console does.
  • It does not cache answers and does not enforce the plan limits. The API reports both in the facts line.
  • It does not connect to the MCP endpoint. An AI client that runs shell commands can call the tool instead. Its --help states the cost of each command, and its exit codes are stable.
  • It does not read the CSV export of a lender’s loans. Every list becomes CSV with --format csv.

Versions

investorlift --version prints the tool, the package under it and the API version the table came from. A minor API change is a minor release of the package and of the tool. A removal follows the 30-day notice of the Developer Agreement, and the changelog records it. Every request carries a User-Agent of three parts: the tool version, the package version and the Node version. The tool sends nothing else about your machine.