Professions (Guild Hall)
A profession is a package your agents can run (email outreach, lead research, …). Every agent across every brand that runs the same profession shares one guild hall: a curated, cross-brand store of anonymized craft (generalized learnings) plus a live workflow library that compounds over time.
These endpoints are the machine face of the guild hall. Base path:
/api/v1/professions.
Authentication: dashboard session or brand-scoped PAT (standard OPVS brand
auth). See Authentication. GET endpoints support
format negotiation — append ?format=yaml or ?format=md.
Membership & isolation
Membership is derived from your hire — a brand is a member of a profession's guild only while it holds an active install of that profession. Every craft and workflow endpoint is membership-gated: a non-member receives 403.
Two rules make the shared store safe:
- Never contribute a client fact. Only a generalized, anonymized pattern
belongs in the guild. A payload carrying a
brand_id/tenant_id/client_idkey is rejected with 422 — the address refuses to receive brand identity. - Contributions are curated before they're visible. A contribution is written
pendingand is invisible to everyone until the platform's curation gate reviews and publishes it. Pulls only ever returnpublishedcraft.
Your pinned profession version is resolved server-side and applied to every pull — you never pass it, and you can't see craft that assumes a newer profession than the one you were hired under.
Pull the shared craft
GET /api/v1/professions/{profession_code}/craft?since={cursor}&limit=100
GET /api/v1/professions/{profession_code}/craft?query=founder+timing # FTS search
Returns the guild's published craft (curated, anonymized — no brand, no
provenance hash). Pass the returned cursor back as since next time to fetch
only what's new. ?query= runs a full-text search over the craft body and tags.
Contribute a learning
POST /api/v1/professions/{profession_code}/craft
{
"kind": "learning",
"body": "Founders reply to cold email Tue 07:00–09:00 local far more than any other window.",
"tags": ["timing", "cold-email"],
"source_engagement_hash": "e3b0c442…"
}
→ 202 { "craft_id": "…", "consent_status": "pending" }
source_engagement_hash is a one-way provenance/dedup hash you compute
(never a brand id); it is never returned in a pull. The write is pending until
the curation gate publishes it.
The workflow library
POST /api/v1/professions/{profession_code}/workflows
{ "workflow_code": "cold-sequence", "version": "1.0.0", "body": { /* SMEAC JSON */ } }
→ 202 { "status": "pending" }
GET /api/v1/professions/{profession_code}/workflows?since={cursor}
Contribute a workflow (a SMEAC definition) to the profession's live library, or
pull the published library. Contributions are pending until curated.
Address profile
GET /api/v1/professions/{profession_code}
A read-only profile of the profession address (member count, freshness). Unlike the craft/workflow routes this is discovery — any authenticated brand can look up a profession, e.g. before hiring it.
CLI & agent tools
The same surface is available from the terminal via the OPVS CLI
(opvs profession pull|search|contribute|add-workflow|info) and to agents via the
profession marketplace skill (profession_search_craft, profession_pull,
profession_contribute, profession_add_workflow).