# AX Check: portraitresearch.com
Checked 2026-09-19.

Docs and CLI work well, but pricing isn't on the site itself.
Getting Started, CLI, MCP and skills docs all resolve cleanly with working install commands. Pricing details only surfaced via agents finding a separate pricing/hosting page, not the homepage.

## Onboarding needs a login

## Coding sessions
Two of three independent sessions completed and found pricing: a free tier plus a $10/month Plus plan paid onchain on Base, with no usage-based or API pricing, sourced from the site's pricing and hosting pages. The third session did not complete, stopping before it could evaluate pricing.

### DeepSeek V4 Pro
[View public run](https://agents.withgauge.com/p/runs/4c2daf9c-7f2f-4f5a-9694-a28c82767151) · [Read transcript](https://www.ax-check.com/portraitresearch.com/sessions/deepseek.json)

#### End-to-end onboarding
- **Onboarding needs a login**: Agent installed the real Portrait CLI from npm and ran portrait auth login, getting a genuine Auth0 device-code URL and code. That flow needs a human to open the browser and approve sign-in, which the agent could not do itself. auth status remained unauthenticated afterward, and no authenticated command (ask, sessions, monitors, files) ever ran. Session ended after the login attempt with only a local example script written to disk.
  Event 164:

  ```text
  Verification URL: https://portraitanalytics.us.auth0.com/activate?user_code=HRJB-CPBC
  User code: HRJB-CPBC
  Requested the default browser to open the verification URL.
  (timed out intentionally — no browser approval possible here)
  ```
  Event 165:

  ```text
  (timed out intentionally — no browser approval possible here)
  ```
  Event 160:

  ```text
  {"schemaVersion":1,"ok":true,"command":"auth.status","data":{"authenticated":false,"environment":"production","expiresAt":null}}
  ```

#### Hallucinated URLs
None identified in this transcript.

#### Blockers
- **OAuth device-code login requires a human browser approval**: Portrait CLI's `portrait auth login` uses an Auth0 device-code OAuth flow that prints a verification URL and code for a human to approve in a browser. This is normal, expected authentication behavior for the product (not a defect), but it meant the automated agent could not complete sign-in on its own and could not proceed to any authenticated command (ask, sessions, monitors, files). The agent correctly identified this as a stopping point rather than attempting a workaround.
  Event 164:

  ```text
  Verification URL: https://portraitanalytics.us.auth0.com/activate?user_code=HRJB-CPBC
  User code: HRJB-CPBC
  Requested the default browser to open the verification URL.
  ```
  Event 165:

  ```text
  (timed out intentionally — no browser approval possible here)
  ```
- **No public pricing information discoverable**: Extensive web research (homepage, blog, terms of service, privacy policy, docs guide) turned up no pricing page or plan/tier details for Portrait. The site only exposes a 'Start Free Trial' / 'Book a Demo' gated signup flow, and the CLI docs mention 'usage-based pricing' and monthly 'research usage' credits without disclosing rates. This is a product/marketing-site gap rather than agent error: the agent searched multiple sources before concluding pricing isn't public.
  Event 132:

  ```text
  trial-signup-form" class="trial-modal-form" method="post" action="/trial-signup/"
  ```
  Event 123:

  ```text
  This section appears on accounts with usage-based pricing.
  ```
  Event 103:

  ```text
  === https://portraitresearch.com/sitemap.xml ===
  
  <!doctype html>
  <html lang="en">
  <head>
    <title>Not Found</title>
  </head>
  ```

#### Suggested Changes
- **Publish a public pricing page or summary**: Add a dedicated pricing page (or a section on the homepage/docs) that states plan tiers, usage-based credit rates, or at least a representative price range. Verify by checking that a request to portraitresearch.com or its docs surfaces concrete pricing without requiring a sales demo; currently only 'Start Free Trial' and 'Book a Demo' CTAs are present and the terms/privacy pages contain no pricing detail.
  Event 132:

  ```text
  trial" href="#" style="padding:15px 30px;font-size:16px" data-cta-location="final_cta
  ```
  Event 171:

  ```text
  fees, that arise from any claim or demand, made by any third pa
  ```
- **Add a non-interactive or CI-friendly auth path to the CLI docs**: On the Portrait CLI guide page, document whether any non-browser authentication option exists (e.g., a service/API token for headless or CI use) for developers who cannot complete an interactive OAuth device-code flow. If none exists, state this plainly so agent/CI users know upfront that `portrait auth login` requires a human with browser access, avoiding wasted setup attempts.
  Event 114:

  ```text
  The command prints a verification URL and a user code, and tries to open the URL in your default browser. If it cannot, open the printed URL yourself and enter the code — signing in by hand always works. Sign in with your normal Portrait credentials.
  ```

### Kimi K3
[View public run](https://agents.withgauge.com/p/runs/785e7015-ce29-4e1f-a62a-7fe810a332d3) · [Read transcript](https://www.ax-check.com/portraitresearch.com/sessions/kimi.json)
Final output states registration is free (fee removed Dec 2025) and Portrait Plus is $10/month paid onchain on Base mainnet, explicitly noting there is no usage-based/API pricing and citing the blog as the source since no pricing page exists.
#### End-to-end onboarding
- **End-to-end onboarding not demonstrated**: No signup, API key, or authenticated request against Portrait's product was attempted. The agent only performed unauthenticated GET requests to public pages, npm/pypi registries, and GitHub, and it explicitly stopped before attempting any account creation or SDK usage because it judged there was no actionable developer workflow (an abandoned SDK targeting a decommissioned testnet, and a desktop GUI app). No credentials for Portrait were obtained or used.
  Event 93:

  ```text
  Portrait has no developer workflow I can act on, so I'm stopping here rather than building an example.
  ```
  Event 78:

  ```text
  GET /api/v2/portraits -> 404
  ```

#### Hallucinated URLs
None identified in this transcript.

#### Blockers
- **No usable SDK or public API for hosted Portrait product**: The only npm SDK package found (portrait-sdk) is abandoned since Feb 2023 and targets the Goerli testnet, which has since been decommissioned, making it non-functional. The hosted API (api.portrait.so) returns only a generic 'API v2 active' message with no public docs, endpoints, or auth scheme discoverable, and probing a plausible resource path returned 404. This is a product characteristic (lack of a documented, current developer API/SDK), not an agent or environment error.
  Event 43:

  ```text
  This is recommended to be set to 'goerl', as Portrait is currently only deployed on the Goerli testnet.
  ```
  Event 78:

  ```text
  API v2 active
  ```
  Event 78:

  ```text
  GET /api/v2/portraits -> 404
  ```
  Event 33:

  ```text
  published: 2023-02-27T15:46:54.638Z
  ```
- **Only developer-facing artifact requires a local desktop GUI app**: The one actively maintained repo relevant to running Portrait infrastructure (portrait-hosting-app) is an Electron desktop application for Mac/Windows that must be downloaded, installed, and run locally with keychain access — explicitly out of scope per the session's instruction to avoid local service stacks. This is a product design characteristic, not something the agent could route around while respecting its constraints.
  Event 63:

  ```text
  Once you have downloaded the app and moved it to your Applications folder, you can run the Portrait Hosting Node by clicking on the app icon. The app will start running in the background
  ```
  Event 93:

  ```text
  The one "developer" artifact is the Hosting Node — a Mac/Windows Electron desktop GUI app (beta). That's a local service stack with a GUI, which your constraints explicitly exclude.
  ```

#### Suggested Changes
- **Publish a current, working SDK or REST API reference for third-party developers**: The only discoverable SDK (npm package portrait-sdk) has not been updated since February 2023 and hardcodes support for the Goerli testnet, which is no longer operative; the hosted API root at api.portrait.so returns no documentation or schema. Add a maintained SDK (or documented REST endpoints with auth instructions) linked from portrait.so's 'Developers' footer link, and verify it works by having a new developer successfully call an endpoint end-to-end without needing a desktop app or raw contract calls.
  Event 33:

  ```text
  readme: # Portrait Protocol SDK
  ```
  Event 78:

  ```text
  API v2 active
  ```
- **Add a public pricing page**: No dedicated pricing page exists; pricing details had to be pieced together from scattered blog posts (registration fee removal, Plus plan price change). Add a single pricing page linked from the main nav or footer alongside 'Pages/Wallet/Pay' that states current registration cost and Plus subscription price, and confirm it matches the latest blog announcement (Portrait is now free for everyone, Dec 10 2025; Plus at $10/month since June 2025).
  Event 85:

  ```text
  Today, we are removing the ten-dollar registration fee. Portrait is now open to everyone, at no cost.
  ```
  Event 85:

  ```text
  the monthly price has changed from five to ten dollars per month
  ```

### Qwen 3.8 Max
[View public run](https://agents.withgauge.com/p/runs/c73de70c-17e1-4ffa-b7fe-f26db2091ad8) · [Read transcript](https://www.ax-check.com/portraitresearch.com/sessions/qwen.json)
Final output names the free tier vs Plus ($10/month) plan structure and what each includes (custom domain, no Pay fees, wallet balance) sourced from portrait.so/pricing and /hosting (seq 74), giving the plan basis for the figure rather than a bare number.
#### End-to-end onboarding
- **End-to-end onboarding not demonstrated**: The agent never attempted account creation, sign-up, or credential acquisition of any kind. It only performed unauthenticated GET requests against public marketing/docs pages and npm/GitHub registries. No API keys, tokens, or wallet credentials were obtained, and no authenticated operation (creating a Portrait, calling an authenticated API endpoint) was ever attempted or demonstrated.
  Event 38:

  ```text
  curl -sS -m 15 -L https://portrait.so | grep -oiE 'href="[^"]*"' | sort -u | head -40
  ```
  Event 74:

  ```text
  Account creation requires an interactive web sign-up (wallet connect or email + X/Twitter verification), and there's no documented headless/admin API.
  ```

#### Hallucinated URLs
- **Guessed docs/developer subdomains that don't exist**: The agent guessed several plausible subdomains for Portrait's developer docs (docs.portrait.so, developers.portrait.so) purely based on naming convention, without any prior link pointing to them. These failed to resolve, indicating pure guesses rather than following a documented but broken link.
  Event 30:

  ```text
  for p in docs.por­trait.so docs.portrait.so developers.portrait.so api.portrait.so; do echo -n "$p: "; curl -sS -m 8 -o /dev/null -w "%{http_code}\n" -L https://$p; done
  ```
  Event 33:

  ```text
  docs.portrait.so: curl: (6) Could not resolve host: docs.portrait.so
  ```
- **Guessed alternate product domains that don't resolve**: The agent speculatively tried a handful of plausible domain variants for the product name (getportrait.co, tryportrait.com, portrait.dev) with no basis from search results or links, none of which resolved.
  Event 18:

  ```text
  curl -sS -m 15 -o /dev/null -w "%{http_code} %{url_effective}\n" -L https://getportrait.co
  ```
  Event 48:

  ```text
  for d in portrait.io tryportrait.com useportrait.com portrait.dev; do echo "== $d"; curl -sS -m 8 -o /dev/null -w "%{http_code}\n" -L https://$d; done
  ```
  Event 50:

  ```text
  tryportrait.com
  curl: (6) Could not resolve host: tryportrait.com
  ```

#### Blockers
- **No documented, current API or SDK to build against**: Product-side gap, not agent error or missing credentials: the only published SDK (npm portrait-sdk) targets the deprecated Goerli testnet and hasn't been updated since Feb 2023; api.portrait.so responds but has no public documentation; learn.portrait.so describes a web-UI onboarding flow, not a programmatic one. This left no usable, current hosted-API surface for the agent to build an SDK/API example against.
  Event 33:

  ```text
  `portraitNetwork` - The network that the user would like to use. This is recommended to be set to 'goerli', as Portrait is currently only deployed on the Goerli testnet.
  ```
  Event 72:

  ```text
  {'latest': '0.0.11'} ['0.0.7', '0.0.10', '0.0.11'] 2023-02-27T15:47:58.084Z
  ```
  Event 40:

  ```text
  Server active
  ```
- **Account creation and management require interactive human sign-up**: Product behavior: Portrait's account/page creation flow is gated behind wallet-connect or email plus X/Twitter verification through the web UI, with no documented headless or admin API alternative observed, which the agent flagged as blocking any non-interactive developer workflow.
  Event 66:

  ```text
  Sign up with your wallet or email address. Sign up or login Connect with X (formerly Twitter) Login to unlock more tasks and earn Points.
  ```

#### Suggested Changes
- **Publish current API documentation for api.portrait.so**: api.portrait.so returns a live response but exposes no discoverable documentation; add a docs page (e.g., at docs.portrait.so or linked from the Developers page on portrait.so) describing authentication and endpoints, and verify by having a new developer successfully call an endpoint without contacting the team.
  Event 40:

  ```text
  Server active
  ```
  Event 33:

  ```text
  docs.portrait.so: curl: (6) Could not resolve host: docs.portrait.so
  ```
- **Update or deprecate the portrait-sdk npm package**: The published portrait-sdk (npm, v0.0.11, last updated Feb 2023) only supports the deprecated Goerli testnet; either update it to target the current network/mainnet and hosted API, or mark it deprecated in the npm README and GitHub repo so new developers don't attempt to build on it. Verify by confirming a fresh `npm install portrait-sdk` example can initialize and complete a real call against the current network.
  Event 33:

  ```text
  This is recommended to be set to 'goerli', as Portrait is currently only deployed on the Goerli testnet.
  ```
  Event 72:

  ```text
  {'latest': '0.0.11'} ['0.0.7', '0.0.10', '0.0.11'] 2023-02-27T15:47:58.084Z
  ```
- **Link the Developers page directly to working docs and SDK**: portrait.so's footer lists Developers/GitHub/Docs/Smart Contracts links, but investigation found no working docs subdomain reachable from these; audit and fix the Developers section so it points to a live, current docs resource, and confirm by clicking through from portrait.so/developers to a functioning API reference.
  Event 66:

  ```text
  Resources Blog Points Open Internet Protocol Brand Kit Developers GitHub Docs Smart Contracts Hosting Overview Hosting for Mac Host
  ```

### Task given to each agent
Help me build a simple example using Portrait. Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage. Let me know if you get blocked. If this product has no developer workflow you can act on, say so plainly and stop. Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop.

No product credentials were supplied and no purchases were authorized.

## Score: C · 55/100 (provisional)
Grades come from completed site checks. Coding sessions and skipped checks do not affect the score.

### Clarity
- **Failed** — Homepage answers Markdown requests

  ```text
  Homepage returned text/html even when text/markdown was requested, so Markdown negotiation is unsupported.
  ```

- **Failed** — llms.txt provides an actionable documentation index

  ```text
  /llms.txt returned HTTP 404, so no actionable documentation index exists.
  ```

- **Failed** — A compact guide representation exists

  ```text
  Docs pages offer 'Copy for agent' with Markdown/Plain text, but no standalone compact guide representation was fetched.
  ```

- **Skipped** — llms.txt provides navigation guidance

  ```text
  No llms.txt body was returned (404), so navigation guidance cannot be assessed.
  ```

- **Skipped** — llms.txt mentions offered API, MCP, and skills

  ```text
  No llms.txt body was returned (404), so API/MCP/skills mentions cannot be assessed.
  ```

- **Pass** — A focused guide is directly retrievable

  ```text
  Getting Started and Welcome pages are directly retrievable with concrete first steps and next links.
  ```

- **Pass** — Equivalent instructions fit a token budget

  ```text
  Fetched guide pages are ~1.5-1.7k tokens, well under the 8000-token budget.
  ```

- **Skipped** — Product-docs links survive format changes

  ```text
  Homepage Markdown is unsupported, so link preservation across format changes cannot be measured.
  ```

- **Pass** — The compact guide is independently actionable

  ```text
  Getting Started lists concrete first steps: create a project, deep research report, monitor, quick chats.
  ```

- **Pass** — Install and next-step links resolve

  ```text
  Fetched getting-started, welcome, MCP, CLI and skills pages all returned HTTP 200.
  ```


### Onboarding
- **Pass** — Docs lead to a relevant quickstart

  ```text
  Getting Started index links concrete first steps: Create a Project, Deep Research Report, Monitor.
  ```

- **Pass** — Installation commands are extractable

  ```text
  CLI page gives extractable install: npm install --global @portrait-research/portrait, Node 20.17+.
  ```

- **Pass** — Code examples are available without interaction

  ```text
  CLI page shows inline commands for auth, ask, sessions, files, install-skill without interaction.
  ```

- **Pass** — Prerequisites and auth boundaries are explicit

  ```text
  CLI requires Easel access and sign-in via portrait auth login; contact team if not enabled.
  ```


### Pricing
- **Skipped** — Pricing is readable without interaction

  ```text
  No pricing page fetched; homepage only offers a free trial and demo request.
  ```

- **Skipped** — Prices are stated, not gated

  ```text
  No pricing page fetched; homepage shows no stated prices, only trial and demo.
  ```

- **Skipped** — Pricing units and limits are explicit

  ```text
  No pricing page fetched; no units or limits stated on the homepage.
  ```

- **Pass** — Agents identify pricing and its assumptions

  ```text
  2 of 3 sessions were judged on pricing; 0 fell short. Kimi K3: Final output states registration is free (fee removed Dec 2025) and Portrait Plus is $10/month paid onchain on Base mainnet, explicitly noting there is no usage-based/API pricing and citing the blog as the source since no pricing page exists. Qwen 3.8 Max: Final output names the free tier vs Plus ($10/month) plan structure and what each includes (custom domain, no Pay fees, wallet balance) sourced from portrait.so/pricing and /hosting (seq 74), giving the plan basis for the figure rather than a bare number. This behavioural item does not affect the fast grade.
  ```


### Activation
- **Skipped** — An API reference or OpenAPI spec is reachable

  ```text
  No API reference or OpenAPI spec page was fetched; docs only mention an MCP server and CLI.
  ```

- **Pass** — An MCP server is documented and well-formed

  ```text
  Portrait MCP documented: server URL, OAuth connection, and Claude/ChatGPT/Cursor setup steps.
  ```

- **Pass** — A CLI install path is documented

  ```text
  CLI install documented: npm install --global @portrait-research/portrait, Node 20.17+, plus auth login.
  ```

- **Pass** — SDK packages resolve on their registries

  ```text
  npm registry lookup for @portrait-research/portrait returned HTTP 200.
  ```

- **Pass** — Agent skills are published

  ```text
  Easel Skills published: how to write, upload, and use skills in My Library.
  ```



[Full report data](https://www.ax-check.com/portraitresearch.com/report.json)
