Fill the Organization
Create the project and add the people Valmar can contact — through the Admin UI or programmatically.
Before Valmar can do anything useful, the organization needs a project and some people. There are two paths: the Admin UI (best for a one-time setup or for an operator with a spreadsheet) and the SDK / REST API (best for seed scripts, fixtures, or repeatable provisioning).
Use the Admin UI when an operator is setting up a workspace by hand.
Create the project
Use the getting-started flow or New Project in the Admin UI to create the project that will own credentials and knowledge requests.
Open the People page
Select the organization in the Admin UI, then open the People page. This is the primary operator surface for adding, editing, and removing people.
Add one person manually
Use Add Person for one-off entries. The form supports name, email, title, timezone, and a short description of what that person usually knows.
Import many people from CSV
Use Import People when you already have a spreadsheet or export. The
CSV input accepts rows in the shape email, name, title, timezone.
Assign people to the project
Open Project Settings and add the relevant people as project_member,
project_admin, or service.
What makes a good person profile
- A real work email that Valmar is allowed to contact.
- A clear display name and job title.
- A correct timezone so outreach timing is sensible.
- A short description that says what context this person usually knows.
When the UI path is best
Use the UI when you are setting up one organization by hand, checking imported people, or deciding project membership interactively with an operator.
Use the code path when you want repeatable seed scripts, demo setup, or fixtures.
What's available today
- Bulk import of people is available in the Python and TypeScript SDKs
(called
membersin code — see Core Concepts). - Project creation is available over
POST /api/organizations/{organization_id}/projects. - Project membership assignment is available over
POST /api/projects/{project_id}/members. - Project creation requires org-admin rights. Membership assignment requires project-admin rights.
Bulk import people
from valmar import CreateMemberInput, ValmarClient
client = ValmarClient(
api_key=os.environ["VALMAR_API_KEY"],
organization_id=os.environ["VALMAR_ORGANIZATION_ID"],
project_id=os.environ["VALMAR_PROJECT_ID"],
)
result = client.members.import_bulk(
[
CreateMemberInput(
email="casey@company.com",
display_name="Casey Torres",
title="Staff Engineer",
timezone="Europe/Berlin",
description_md="Owns deployment runbooks and incident procedures.",
),
CreateMemberInput(
email="morgan@company.com",
display_name="Morgan Lee",
title="Support Lead",
timezone="America/New_York",
),
]
)
print(f"Created: {len(result.created)}")
print(f"Skipped: {len(result.skipped)}")const result = await valmar.members.importBulk(process.env.VALMAR_ORGANIZATION_ID!, {
members: [
{
email: "casey@company.com",
displayName: "Casey Torres",
title: "Staff Engineer",
timezone: "Europe/Berlin",
},
{
email: "morgan@company.com",
displayName: "Morgan Lee",
title: "Support Lead",
timezone: "America/New_York",
},
],
});
console.log(`Imported: ${result.imported}`);
console.log(`Skipped: ${result.skipped}`);Create a project over HTTP
This setup endpoint is part of the backend REST API. It is not exposed through the public SDKs today, so use direct HTTP from an authenticated operator/admin session.
import os
import httpx
base_url = os.environ["VALMAR_BASE_URL"]
organization_id = os.environ["VALMAR_ORGANIZATION_ID"]
with httpx.Client(base_url=base_url) as client:
login = client.post(
"/api/auth/login",
json={
"username": os.environ["VALMAR_USERNAME"],
"password": os.environ["VALMAR_PASSWORD"],
},
)
login.raise_for_status()
project = client.post(
f"/api/organizations/{organization_id}/projects",
json={
"name": "Support Assistant",
"slug": "support-assistant",
"description_md": "Handles support escalations and missing policy answers.",
},
)
project.raise_for_status()
print(project.json()["id"])const organizationId = process.env.VALMAR_ORGANIZATION_ID!;
// Assumes this runs inside an already-authenticated operator web app.
const project = await fetch(`/api/organizations/${organizationId}/projects`, {
method: "POST",
headers: { "Content-Type": "application/json" },
credentials: "include",
body: JSON.stringify({
name: "Support Assistant",
slug: "support-assistant",
description_md: "Handles support escalations and missing policy answers.",
}),
});
if (!project.ok) throw new Error(await project.text());
console.log((await project.json()).id);Assign a person to the project
Once the project and the organization-level people exist, add project memberships over the project-members API.
import os
import httpx
base_url = os.environ["VALMAR_BASE_URL"]
project_id = os.environ["VALMAR_PROJECT_ID"]
member_id = os.environ["VALMAR_MEMBER_ID"]
with httpx.Client(base_url=base_url) as client:
login = client.post(
"/api/auth/login",
json={
"username": os.environ["VALMAR_USERNAME"],
"password": os.environ["VALMAR_PASSWORD"],
},
)
login.raise_for_status()
membership = client.post(
f"/api/projects/{project_id}/members",
json={
"member_id": member_id,
"role": "project_member",
},
)
membership.raise_for_status()
print(membership.json()["id"])const projectId = process.env.VALMAR_PROJECT_ID!;
const memberId = process.env.VALMAR_MEMBER_ID!;
// Assumes this runs inside an already-authenticated operator web app.
const membership = await fetch(`/api/projects/${projectId}/members`, {
method: "POST",
headers: { "Content-Type": "application/json" },
credentials: "include",
body: JSON.stringify({
member_id: memberId,
role: "project_member",
}),
});
if (!membership.ok) throw new Error(await membership.text());
console.log((await membership.json()).id);Auth model
These setup endpoints use admin-style authorization, not the normal runtime integration flow. A project API key is suitable for search, gather, and MCP. For organization and project provisioning, use an authenticated operator/admin session or internal admin automation.
Next
Continue to Quickstart to run the first search-and-gather loop end to end.