Service twin · API + UI
Test professional-network agents that research people and companies and manage content workflows.
$ uv tool install blobfish-cli
$ blobfish twin login
$ blobfish twin-runs create --twins linkedin --ttl 60 --waitWhat’s inside
A deterministic, seeded, resettable replica: every operation below executes real state transitions against the twin’s own SQLite state — reads are hash-invariant, writes produce inspectable diffs, and reset restores the seed baseline.
Seeded entities
| Entity | Table | Fields | About |
|---|---|---|---|
| person_profile | person_profiles | 8 | Member profile as exposed by the LinkedIn People API. |
| organization | organizations | 8 | Company page managed through the LinkedIn Organizations API. |
| post | posts | 7 | UGC post with a draft → published → archived lifecycle. |
| comment | comments | 6 | Comment left on a post's social-actions thread. |
| invitation | invitations | 6 | Connection invitation the invitee can accept or ignore. |
| reaction | reactions | 6 | Member reaction placed on a post via the Reactions API. |
Guarded lifecycles
These state machines are enforced, not decorative: an action whose fromstate doesn’t match is rejected the way the production service rejects it.
post.lifecycle_state
publish: draft → publishedarchive: published → archived
invitation.status
accept: pending → acceptedignore: pending → ignored
Three surfaces, one state
Mount LinkedIn in a twin environment and the same seeded state serves vendor-shaped REST operations, an MCP endpoint for tool calling, and a generated bf-twin CLI — with copy-on-write sessions per rollout and a one-call reset to the seed baseline. Prefer raw HTTP? The same create works with curl:
$ curl -sS -X POST https://blobfish.ai/api/v1/twin/environments \
-H "X-API-Key: $BLOBFISH_API_KEY" -H "Content-Type: application/json" \
-d '{"services":["linkedin"],"ttl_minutes":60}'Known limitations
- transcribed from https://learn.microsoft.com/en-us/linkedin/ (People, Organizations, Community Management, and Invitations APIs); parameter and response schemas simplified
- URN identifiers simplified to plain string ids; socialActions comment threads and reactions flattened to top-level collections addressed by post_id; post lifecycle changes modeled as explicit publish/archive actions
- synthetic seeded values