Documentation

Everything you need to build and run

The founding white paper, the sector patterns, and a reference written from the code: spaces, roles, and the one endpoint that exists. Guides and the public API documentation are being written — write to us and we will walk you through it.

Reference

Written from the code, field by field. What is not described here does not exist yet — and the page says so rather than hiding it.

A space

A space is a tenant: one organisation, one address, its own members. Table mtb.spaces.

slugtext, uniqueThe sub-domain. Lowercase letters, digits and hyphens, 1 to 32 characters, never starting or ending with a hyphen.
nametextThe name of the space.
org_nametextThe legal or usual name of the organisation.
org_type · sector · size_bandtext, optionalDeclared at creation; descriptive, never used as a filter.
langstext[]The languages of the space. Empty by default.
plancommunity | organisation | territoire | networkConstrained by the database, not by the interface: an unknown value is refused at write time.
statuspending | active | suspendedA newly created space is pending. It is opened by hand — nothing activates itself.
owner_iduuid, nullableThe account that created it. If that account disappears, the space survives without an owner rather than being deleted.

Members and roles

Table mtb.space_members. Three roles, and one rule that is enforced by the database, not by the screen.

ownerroleCreated the space. The only role that can modify it.
adminroleAdministers the space day to day.
memberroleBelongs to the space. The default.
RLSrègleYou only see a space if you are a member of it, and you only modify it if you are its owner. Enforced in the database: calling the API directly does not get around it.

Opening a space

One endpoint, one call. POST to /functions/v1/provision-space.

emailrequisMust match a simple address pattern, otherwise invalid_email (400).
orgNamerequisAt least 2 characters, otherwise invalid_org (400).
spaceNamerequisUsed to derive the slug. If nothing valid can be derived: invalid_slug (400).
orgType · sector · langs · sizeoptionnelsRecorded as declared.
200réponse{ ok: true, slug, url: "<slug>.manatimebank.org", status: "pending" }
400 · 405 · 500refusbad_json, method_not_allowed, owner_failed. Each refusal names its cause — none of them says merely "error".

What does not exist yet

Recording hours, contributions and recognition are described in the white paper as a concept. No table carries them and no function computes them yet. They are deliberately absent from this reference: documentation that describes what does not exist is paid for by the first reader who tries it.

Frequently asked questions

Frequently asked questions

Is the model open?

Yes. The MANAtimebank model and the TEMPOsystem coordination layer are open and stewarded by Alliance MANA.

Can we migrate our existing data?

Yes — members, hours and history can be imported during onboarding. Talk to us about your format.

Who owns the data?

You do. Data ownership, GDPR compliance and export are built in, on every tier.

Ready to create your time space?