Skip to documentation

Generic examplesSign in to personalize workspace URLs.

Download OpenAPI

Getting started

Prepare your account

Create a free account and finish account and workspace setup. No card is required. Your first workspace starts the organization's one-time 14-day Growth trial with 100 AI credits in total; additional workspaces share that deadline and allowance. The organization continues on Free unless you explicitly subscribe. During account setup you may continue without inviting teammates; regional provisioning happens before workspace setup.

Select how your company builds software: for clients, in house, or with external development partners. The existing agency, inhouse, and external modes adapt presentation, while the API continues to use client/project resource names and IDs. External mode presents Development partners, Engagements, Supplier spend and invoice/scope review. Estimates and review records do not approve invoices or accept contractual work.

Connect and consent to providers in the app if the workflow requires delivery evidence; an API client creation is not a provider connection. When your development partner controls provider access, use supported CSV imports or manual commercial inputs, or ask the partner's administrator for authorized access.

An owner/admin opens Settings → Workspace → API Keys. For this first read choose only Clients read, a finite expiration, and Generate. Copy the secret once into your server's secret manager/environment as SCOPEWORTH_API_KEY. Never place it in browser storage, source control, a URL, screenshots or support logs. The reference accepts no real credential and has no Send button.

Find your route and execute a read

Copy the current organization/workspace slugs from the app's canonical URL. Set SCOPEWORTH_API_BASE to the combined host plus /api/v1 or the verified regional origin plus /v1. Replace example-org and example-workspace in the snippet below. See regional routing.

Read the client and project directory

Operation: directory.read · GET /directory

Read clients, projects, delivery cadence and latest evidence dates for an accessible workspace or client/project filter. A filtered response recalculates project counts and the latest evidence date from the selected projects only; unmapped workspace evidence is omitted from that aggregate. Requires clients.read. Ordered names are returned as a single directory; no pagination or commercial detail is promised. Preserve null, unavailable and partial evidence, source provenance, confidence qualifiers and currency units; absent evidence is not zero. Dates are civil dates in the supplied IANA zone. No individual performance ranking is returned. Requires a current workspace member, this operation's exact key scope and current creator permission. Invalid filters return 400; missing or foreign resources return 404; missing permission or an effective plan restriction returns 403. Revoked or expired keys return 401; throttled requests return 429 with Retry-After.

Required key scope: clients:read. Current creator action: clients.read. Eligible plans: free, starter, growth, scale; legacy contracts: free, entry, growth. stable contract. These badges do not override current role, evidence window, quotas or target ownership.

Parameters (required flags, defaults, units and bounds are the canonical schema):

View schema or synthetic response
JSON

[
  {
    "in": "query",
    "name": "clientId",
    "required": false,
    "schema": {
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } }, { "in": "query", "name": "projectId", "required": false, "schema": { "format": "uuid", "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)
quot;
, "type": "string" } } ]

Success statuses: 200. The JSON response is the saved/read representation. Synthetic examples below show shape, not customer evidence.

Synthetic response:

View schema or synthetic response
JSON

{
  "clients": [
    {
      "id": "00000000-0000-4000-8000-000000000005",
      "name": "Hidden by selection",
      "projectCount": 1,
      "status": "active"
    },
    {
      "id": "33333333-3333-4333-8333-333333333333",
      "name": "Synthetic visible client",
      "projectCount": 1,
      "status": "active"
    }
  ],
  "latestEvidenceDate": null,
  "projects": [
    {
      "cadence": null,
      "clientId": "00000000-0000-4000-8000-000000000005",
      "id": "00000000-0000-4000-8000-000000000006",
      "latestEvidenceDate": null,
      "name": "Hidden by selection",
      "status": "active"
    },
    {
      "cadence": null,
      "clientId": "33333333-3333-4333-8333-333333333333",
      "id": "11111111-1111-4111-8111-111111111111",
      "latestEvidenceDate": null,
      "name": "Synthetic visible project",
      "status": "active"
    }
  ],
  "teamType": null
}

Use IDs and versions from your own preceding responses. Replace the synthetic UUIDs, dates and names in these independent examples. Set SCOPEWORTH_API_BASE and SCOPEWORTH_API_KEY only on your server.

cURL

cURL / shell
curl --request GET "$SCOPEWORTH_API_BASE/organizations/example-org/workspaces/example-workspace/directory" \
  --header "Authorization: Bearer $SCOPEWORTH_API_KEY"

JavaScript fetch

JavaScript
// Run on your server. API_BASE ends in /api/v1 (combined host) or /v1 (verified cell).
const response = await fetch(process.env.SCOPEWORTH_API_BASE + "/organizations/example-org/workspaces/example-workspace/directory", {
  method: "GET",
  headers: {
  "Authorization": `Bearer ${process.env.SCOPEWORTH_API_KEY}`
},
});
if (!response.ok) throw new Error(`ScopeWorth refused request: ${response.status}`);
const result = await response.json();

Python requests

Python
import os, requests
headers = {"Authorization":"Bearer " + os.environ["SCOPEWORTH_API_KEY"]}
response = requests.request("GET", os.environ["SCOPEWORTH_API_BASE"] + "/organizations/example-org/workspaces/example-workspace/directory", headers=headers, timeout=30)
response.raise_for_status()
result = response.json()

For refusals, follow error recovery. A scope or plan badge is eligibility, not proof of authorization or available evidence. Read current directory IDs and versions before correcting a request. Keep an idempotency key for one unchanged mutation attempt; never blindly retry uncertain external work.

Run the snippet on your server. Save accessible clientId/projectId values from the response and verify their parent relationship. Slugs identify a namespace; UUIDs identify resources inside it. A 200 proves this authenticated read, not write permission. An empty directory means no accessible resources, not measured zero performance.

On 401 check key expiry/revocation; on 403 check scopes and current creator permissions; on 404 recheck the current namespace pair. Continue with clients/projects, imports, reports and error recovery.

Search documentation

Enter a word or phrase to search documentation.