Console
Lab has two sides. The API at api.cast.commonapproach.org is what
integrations call with an API key. The console at
app.cast.commonapproach.org is the
signed-in web app for everyone else and for the people behind those
integrations: it is where capsules are built, sent, and received, where
CIDS data is opened and inspected in the browser, and where namespaces and
keys are managed and endpoints tried without writing code.
The console authenticates with your Common Approach account. It never holds an API key — keys are minted there for integrations only.
The Start page asks who you are before you register. The role is stored on your account, shown under Settings → I use Lab as, and can be changed there at any time. It decides what the console shows; it is not a security boundary, and the API never reads it.
| Role | Who | What the console shows |
|---|---|---|
| Report sender | Charities, nonprofits, and purpose-driven businesses | The sender view: My capsules and Help. Build a capsule, keep it, submit it to funders, and hear back. |
| Report receiver | Funders, grantmakers, investors, and finance intermediaries | The full console: the capsules sent to you under Received, plus the browser-side pages for exploring, analyzing, and visualizing. |
| Developer | Teams building on the Lab API | The full console plus the API item: namespaces, keys, and the Playground. |
Accounts created before roles existed read as receivers. If you registered as a receiver and need the API, switch to Developer under Settings.
The sender view
Section titled “The sender view”A sender’s sidebar has two items. My capsules lists everything they have built, where each one has gone, and what came back. Help is the in-app walkthrough. Building a capsule is switched on account by account while Lab is in beta.
- Build. From the filled-in Common Approach reporting template (an Excel workbook) or, as early access, a PDF report. The file is read in the browser, the sender is asked for the web address their organization’s records are named under, and the result is saved as a capsule. Nothing from the source file is kept except the capsule.
- Check. The capsule page shows what a funder will see — the organization and its profiles, then outcomes grouped by SDG with one column per year — and lists anything that could not be read cleanly. Edit changes a value or a detail and saves a new version; earlier versions are never rewritten underneath a funder.
- Send. Pick a funder and Submit. Only funders Common Approach has linked to the organization appear in the list.
- Feedback. A thread beside the capsule carries the funder’s questions, comments pinned to specific rows, and a verdict: changes requested or accepted. After saving a new version, Resubmit continues the same thread.
Capsules are stored in Canada. A funder only ever sees the versions that were submitted to them, and Download gives the sender the same JSON-LD file Lab holds.
The console sidebar
Section titled “The console sidebar”Receivers and developers get the full console. The items follow the order of the work:
| Item | What it is for |
|---|---|
| Workspace | Your library of CIDS capsules and the subset currently loaded for exploring. Drop in JSON-LD files, a filled-in Social Finance Fund reporting workbook (.xlsx), or sample data. |
| Received | The capsules organizations have submitted to you, one row per organization, with status and when it last moved. Open one to see the same view the sender sees, the thread, and the verdict buttons. |
| Explore | Ask questions in plain language (AI writes and runs the SPARQL and explains the answer), or write SPARQL yourself in the editor, with a library of ready-made queries and your history. |
| Records | The loaded capsules as tables, one per CIDS class, with CSV export. |
| Graph | The same data drawn as a graph; click a node to browse the entity. |
| Analysis | The loaded capsules read one layer of the theory of change at a time: summary, organizations, themes, outcomes, indicators. |
| Common Framework | Early access. Build an aggregation methodology — themes, headline indicators, mappings, harmonization — and apply it to the workspace for a reporting period, with published versions and a change log. |
| My charts | Query results and Analysis charts you saved, refreshable against the current workspace. |
| Code Lists | The Common Approach code lists (SDGs, IRIS+, sectors, provinces, units, …) toggled in and out of the workspace. |
| API | Developers only. The integration side: the Playground and Settings tabs described below. |
| Help | The in-app guide to the browser-side pages. |
Everything except API is the CIDS Data Explorer, integrated into the console. It works in the browser on capsules saved to your account and never writes to a graph namespace. Data enters a namespace only through the API — from your integration, or from the console’s explicit Copy to API namespace action.
The Explorer space and the API
Section titled “The Explorer space and the API”The capsules a console account holds — a sender’s builds, a receiver’s
library, the submissions between them — are files, not graphs. On the
API they live in one reserved namespace per tenant, X-Namespace: ~explorer
(shown as “Explorer” in the console). Files there are listable,
downloadable, and explorable in the browser, and nothing more: they are
never ingested, so every graph endpoint refuses that namespace with a 400.
The two sides meet only through the two bridges on the Workspace page,
described below.
API → Settings
Section titled “API → Settings”- Account — your name, address, and role (I use Lab as).
- Tenant — your organization’s name, tenant ID, region, and status. Every key you mint belongs to this tenant.
- API keys — mint a key with a label and, optionally, a restriction to specific namespaces. Revoke keys here too.
- Namespaces — list, create, and delete namespaces. Slugs are lowercase letters, digits, and hyphens. Deleting a namespace drops all of its data irreversibly; the console asks you to type the name to confirm.
- Connection — the API base URL, the two required headers, and a
ready-to-copy
curlline.
Settings is reachable from the profile menu (top right) for every role; the Playground and the API sidebar item are for developers and staff.
API → Playground
Section titled “API → Playground”The Playground runs read endpoints against a namespace as your signed-in
account — nothing to paste — and shows the JSON response with status and
timing. Pick a namespace and an endpoint, fill in any filters, and press
Run. Each request also shows the equivalent curl command with a
placeholder for the API key, and a copy curl button.
| Endpoint | Shows |
|---|---|
GET /rows/indicator-reports |
Denormalized report rows, with theme, fund, org, period[from], period[to], and limit filters |
GET /rows/organizations |
One row per organization |
GET /rows/outcomes |
One row per outcome with its themes and organization; org filter |
GET /rows/indicators |
One row per indicator with unit, outcome, and organization; org filter |
GET /rows/funding-statuses |
One row per sff:FundingStatus: funder, state, organization; org filter |
GET /rows/{table}/export |
The whole table as one versioned file — a download URL, 304 when unchanged, 202 while rebuilding |
GET /rows/themes |
Theme facet with report counts and meta.unthemed_reports |
GET /rows/funds |
Fund facet with organization and report counts |
GET /orgs |
Every organization in the namespace |
GET /orgs/{org_id}/everything |
One organization’s theory of change as a nested tree |
GET /capsules |
Every capsule ingested into the namespace, with status |
GET /capsules/{capsule_id} |
One capsule’s status and plain-language validation report |
GET /export |
A download URL for the whole namespace as CIDS JSON-LD |
Write endpoints — POST /capsules, entity creates, deletes — are not in the
Playground. Use curl or your integration for those, or the API’s own
interactive OpenAPI documentation at
/docs, which runs any endpoint
with an API key.
Checking what your integration produced
Section titled “Checking what your integration produced”In the Playground
Section titled “In the Playground”GET /capsules shows whether each capsule your integration pushed was
accepted or rejected, and GET /capsules/{capsule_id} gives the validation
report for a rejected one. GET /rows/indicator-reports shows the resulting
rows — a report with no outcome or empty themes stands out immediately — and
GET /rows/themes counts the reports no theme filter can reach in
meta.unthemed_reports.
In the browser
Section titled “In the browser”On the Workspace page, Import from an API namespace (at the bottom) lists the capsules in a namespace and copies the original file into your library. From there it opens like any other capsule: as tables in Records, one layer at a time in Analysis, visually in Graph, or by query in Explore. The import is a copy; nothing in the namespace changes.
From the command line
Section titled “From the command line”The same checks with curl, for scripting or CI. Set BASE, KEY, and
NS as in the Quickstart.
One organization’s full theory of change, with outcomes, indicators, and reports nested inline:
curl -s -H "X-API-Key: $KEY" -H "X-Namespace: $NS" \ $BASE/orgs/$ORG_ID/everythingA flat, denormalized view across every organization — each row carries its indicator, outcome, themes, and org, so missing links show up without any join logic:
curl -s -H "X-API-Key: $KEY" -H "X-Namespace: $NS" \ "$BASE/rows/indicator-reports?limit=100"What is filterable. unthemed_reports in the themes response counts reports
no theme filter can reach — if it is high, some indicators are not linked to
outcomes with themes:
curl -s -H "X-API-Key: $KEY" -H "X-Namespace: $NS" $BASE/rows/themescurl -s -H "X-API-Key: $KEY" -H "X-Namespace: $NS" $BASE/rows/fundsExport and diff. The export endpoint answers with a short-lived download URL rather than the document itself. Identifiers come back exactly as you sent them — if something is missing, it either failed validation or was never submitted:
curl -s -H "X-API-Key: $KEY" -H "X-Namespace: $NS" \ "$BASE/export?format=jsonld" | jq -r .url | xargs curl -s \ > namespace-export.jsonldLoading a capsule from the console
Section titled “Loading a capsule from the console”The bridge also runs the other way. On the Workspace page, open a saved
capsule’s row menu and choose Copy to API namespace, then pick the
namespace. A copy is validated and ingested exactly as if your integration
had posted it to POST /capsules; poll its status in the Playground with
GET /capsules. This is a quick way to seed a namespace before an
integration exists, to load a capsule an organization submitted to you, or
to try a hand-edited capsule against the API.
Where next
Section titled “Where next”- Quickstart — from API key to first query.
- Working with capsules — validation rules and rollback.
- Querying impact data — the full filter reference.
- API reference — every endpoint and the error contract.
