The full family lifecycle in one page — create a family, browse the catalog, link two platforms, unlink one, and prove per-service isolation. Every call is run live against the open sandbox with real requests and responses, and every screenshot follows the same child (Ruby) and the same streaming link the code makes.
This is the whole journey a family takes through Phosra, start to finish, on a single page.
You will create a family, browse the platform catalog, link two platforms, unlink one of
them, watch the other survive untouched, and relink the first — all against the public sandbox.Every request and response below is verbatim live output, captured while writing this page
by running these exact calls against
https://phosra-api-sandbox-production.up.railway.app. No API key, nothing to install.
Sandbox-first. These calls run against the open partner sandbox with no credential. Nothing
you create touches a real family. The shapes are identical in production — you swap the base URL
for https://prodapi.phosra.com and authenticate with a phosra_live_… key.
There is one interactive path — the OAuth connect ceremony — where a real parent approves in
a browser. Its consent page belongs to the sandbox reference provider and ships its own fixed demo
profiles:
The load-bearing idea is phases 7–9: unlinking one platform is scoped to that link alone.
Deleting the Notflix link does not disturb the second link, and that platform keeps verifying.
There is no cross-service bleed.
Before the raw API calls, here is what the ten phases look like to a family. Every screen below
is a real screenshot captured from Propagate — a reference parental-control app built on this
exact sandbox API — and from a platform’s own website. Nothing is mocked or drawn.
One cast, two names. The screenshots and the code below follow the same child and the
same streaming link — only Propagate’s playful brand names differ from the public catalog’s real
platform ids. Follow the code and you land on the exact UI state each frame shows.
In the screenshots (Propagate)
In the API calls below
The bridge
Ruby, the child
child_name: "Ruby"
The same child, end to end.
Notflix (streaming)
platform_id: "netflix"
Notflix is Propagate’s stand-in brand for the catalog’s Netflix — same streaming service, same link/unlink/relink target.
Pixagram (a second service)
platform_id: "xbox"
Pixagram is a social app. The public catalog ships real platform ids and has no social equivalent, so the API links xbox (a gaming platform) as the second, unrelated service. Both prove the identical point: unlink one, the other survives.
1
Create the family
The family lives in the app: two children (Ruby, Mateo) and the parent as owner. This guide’s API
path provisions Ruby — the child every later frame follows. This is the POST /setup/quick
result — a family plus a child plus a starter policy — rendered for a human.
2
Browse the catalog
The catalog of connectable services, grouped by category. GET /platforms returns this list.
3
Link the first platform (Notflix)
The link ceremony — the app-side equivalent of POST /compliance against platform_id: "netflix".
It states, up front, exactly which rules the platform will apply and confirm before anything turns
green.
4
Confirm the link
The link’s detail screen. This is the status: "verified" from the compliance response, shown as
a family sees it: Enforced, connected today, last synced just now.
5
Link a second platform (Pixagram)
A second service — Pixagram, a social app — is linked. The Services dashboard now reads
2 of 2 enforced, the two-managed-platforms state the second POST /compliance produces.
(In the API calls this second service is xbox: the catalog has no social equivalent for Pixagram,
so xbox stands in — see the cast note above.)
6
See it enforced on the platform
Proof that the link is not cosmetic: Ruby’s profile on the streaming platform’s own website
carries a Managed via Phosra badge. The rule is enforced where it actually matters.
7
Unlink one platform
The family cancels one service. The confirmation is scoped and explicit — it will revoke only
this platform’s rules. This is the app-side DELETE /compliance/{linkID} for the Notflix link.
8
Confirm release
The unlinked platform reports Disconnected — rules are no longer applied, and the platform
itself confirmed the removal. Clean teardown, not a silent drop. A Reconnect button waits.
9
The other platform survived
The isolation guarantee, made visible: after unlinking one service, the dashboard reads 1 of 1
enforced — the other platform is untouched and still verifying. No cross-service bleed. (In the
screenshots the survivor is Pixagram; in the API calls it is xbox — the same second, unrelated
service standing in for Pixagram, see the cast note above.)
10
Relink
The family resubscribes and relinks. The platform confirms and protection resumes on a fresh link —
the app-side POST /compliance for netflix again, closing the loop.
Those are the ten phases as a family experiences them. The rest of this page is the same ten
phases as API calls — every request and response run live against the sandbox, following the
same child (Ruby) and the same streaming link (Notflix → netflix).
This guide uses the direct compliance link — the simplest full-lifecycle path, where you
present a platform credential to Phosra. For the interactive OAuth connect ceremony (the
consent page above, with authorize_url → token → profiles), see
Connect a platform. The link/unlink/relink lifecycle below is the
same either way.
1
Create the family
One call onboards a family, a child, and an age-appropriate starter policy. setup/quick needs
only a child name and birth date. We create Ruby — the same child the screenshots follow
(Phase 1).
The response returns the family, the child, and a fully-populated starter policy (20 rules
seeded from the relaxed preset for an 8-year-old, with the content cap at PG / 7+). Truncated to
the parts you carry forward:
Required.YYYY-MM-DD. Drives the age-appropriate rule preset.
family_name
string
Optional. Defaults to "{child_name}'s Family".
strictness
enum
recommended (default), strict, or relaxed.
A missing child_name or birth_date returns 400 { "message": "child_name is required" }.
Re-running with the same (family, child_name, birth_date) de-dupes rather than creating a
duplicate child.
2
Browse the catalog
GET /platforms returns everything a family can connect — streaming apps, game consoles, DNS
filters, devices, operating systems. No auth.
curl -s "$PHOSRA_BASE/api/v1/platforms"
The live sandbox returns 22 platforms. Two of them — netflix (the streaming service the
screenshots brand Notflix) and xbox (the second, unrelated service) — are what we link next:
Linking is a single POST /compliance with the family, the platform, and a platform credential.
In the sandbox the credential is a demo token; in production it is the real access token you
obtained from the connect ceremony. This is the API form of the
link ceremony in Phase 3.
The response is the new link. It comes back verified — Phosra confirmed the credential
against the platform. This is the exact state Phase 4 renders
as Enforced · Applied & verified just now:
Required. A catalog id from step 2 (e.g. netflix).
credentials
string
Required. Sandbox: any demo token. Production: the platform access token.
An unknown platform_id or malformed family_id returns 400. A duplicate active link for the
same (family, platform) returns the existing link rather than a second row.
4
Confirm the link
GET /families/{id}/compliance lists every active link for the family. Right now there is one:
Repeat the link for a second, unrelated platform. The screenshots show this as a second service
(Pixagram, a social app) reaching 2 of 2 enforced in Phase 5;
the public catalog has no social equivalent for Pixagram, so the API links xbox — same call,
different platform_id.
The family cancels Notflix — the Phase 7 “Disconnect Notflix?”
dialog. Delete only the Netflix link by its linkID. A successful teardown returns
204 No Content — no body.
Isolation is not just “the xbox link is still listed” — it is “it still works.” Verify the
Xbox link after the Netflix teardown and it re-confirms clean:
Removing Netflix had zero effect on the Xbox link — a different platform’s enforcement kept running
the whole time. This is the guarantee real households depend on: cancelling one service never
quietly drops protection on another.
10
Relink Notflix (netflix)
The family resubscribes — the Phase 10 “Notflix connected ·
Protecting Ruby” success screen. Relinking is just the link call again — and because the earlier
delete fully released the old link, you get a freshlinkID (note it differs from step 3):
The family is back to two managed platforms, with Netflix on a new link (28163206…, up from the
released 5b6d14f3…) and Xbox on the same one it has had the entire time.