Create a Project
Creates a new Marvin project that you can then use as project_id for File Import, Insight Import, or Survey Import.
Requirements#
- Scope:
project:write(add it to your token request, e.g.scope=project:read project:write file:write) - Team setting
allow_manual_project_creationmust be enabled — otherwise the API returns403
See API Key Integration Guide for the full auth setup.
export BASE_URL="https://app.heymarvin.com"
export CLIENT_ID="cid-mrv_..."
export CLIENT_SECRET="sk-mrv_..."
TOKEN=$(curl -s -X POST "$BASE_URL/api/v1/oauth/token" \
-d "grant_type=client_credentials" \
-d "client_id=$CLIENT_ID" \
-d "client_secret=$CLIENT_SECRET" \
-d "scope=project:read project:write file:write" \
| python3 -c "import sys,json;print(json.load(sys.stdin)['access_token'])")
What happens on create#
- Project is created for the API key’s user
- Sharing defaults come from the team unless you override
project_share_preference - A default (empty) label template is created and attached to the project
- Response returns
{ "id", "name" }— useidasproject_idin initialize
POST /api/v1/developer/import/projects/create #
curl -s -X POST "$BASE_URL/api/v1/developer/import/projects/create" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Q3 Customer Calls",
"supported_languages": ["en-US"],
"project_share_preference": 1
}' | python3 -m json.tool
Response (201):
{
"id": 44,
"name": "Q3 Customer Calls"
}
Required fields#
| Field | Type | Description |
|---|---|---|
name | string | Project display name (max 200 characters). Whitespace-only names are rejected. |
Language & AI settings#
| Field | Type | Default | What it does |
|---|---|---|---|
supported_languages | string[] | team / system default | Locale codes used for transcription on files in this project (e.g. ["en-US", "de-DE"]). Multi-select. |
transcript_language | string | usually en-US | Primary transcript language for the project. |
default_ai_language | string | same as transcript | Language Marvin AI prefers when summarizing / answering Ask AI. |
disable_search_ask_ai | boolean | false | When true, project content is not used for Marvin Ask AI / search over project data. |
auto_ai_notes_payload | object | unset | Enables automatic AI notes after files are processed. Presence of the object turns auto-notes on. |
auto_ai_notes_payload shape:
{
"skip_discussion_guide": false,
"auto_apply_labels": false
}
| Nested field | What it does |
|---|---|
skip_discussion_guide | If true, auto-notes run without requiring a discussion guide. |
auto_apply_labels | If true, Marvin auto-applies labels from the project’s label setup when generating notes. |
The API stores this as an enabled auto-notes config (is_enabled: true, empty selected_guides). Pass the object to enable the feature; omit it to leave auto-notes off.
Sharing settings#
If you omit sharing fields, the new project inherits the team’s default share preference.
| Field | Type | What it does |
|---|---|---|
project_share_preference | integer | Who can see the project. See modes below. |
shared_roles | integer[] | Role IDs that get access when preference is shared with roles (4). Required for Project owner + admins and Team (no viewers). Unknown IDs are ignored. |
Share modes
| Mode | Meaning | Payload |
|---|---|---|
| Private | Only the project owner | { "project_share_preference": 1 } |
| Project owner + admins | Owner and team admins | { "project_share_preference": 4, "shared_roles": [3] } |
| Team (no viewers) | Full seats, collaborators, and admins — viewers excluded | { "project_share_preference": 4, "shared_roles": [0, 3, 4] } |
| Everyone | Entire team, including viewers | { "project_share_preference": 2 } |
shared_roles role IDs (used with preference 4):
| ID | Role |
|---|---|
0 | Full seat |
2 | Viewer |
3 | Team admin |
4 | Collaborator |
Examples:
{ "name": "Private Drafts", "project_share_preference": 1 }
{
"name": "Admin Review",
"project_share_preference": 4,
"shared_roles": [3]
}
{
"name": "Team Editors",
"project_share_preference": 4,
"shared_roles": [0, 3, 4]
}
{ "name": "Company-wide Research", "project_share_preference": 2 }
Privacy / auto-PII settings#
These set the project’s default PII / privacy behavior for files imported into it.
Important: if you send any of the PII fields below and do not send auto_pii_enabled_at_project_level, the API automatically sets auto_pii_enabled_at_project_level = true so auto-PII runs on new files. To configure settings without enabling that pipeline, pass "auto_pii_enabled_at_project_level": false explicitly.
| Field | Type | What it does |
|---|---|---|
auto_pii_enabled_at_project_level | boolean | Master switch for applying project PII settings automatically to new files |
redact_pii | boolean | Redact sensitive details from the transcript (and beep in audio when audio redaction is in scope) |
pii_redaction_category | integer[] | Category IDs to redact (names, emails, phone, etc.). Get IDs from Marvin’s PII categories API / UI. Empty / omitted uses platform defaults when redaction is on |
pii_redaction_type | string[] | Where redaction applies. Allowed: "audio", "transcript", "video" |
anonymize_video | string | null | Video visual anonymization: "blur_faces" (faces + on-screen names) or "blur_entire_video" |
audio_modulation | boolean | Alter voices so speakers are harder to recognize |
blank_video | boolean | Replace video with a blank/placeholder frame track (audio can remain) |
remove_video | boolean | Drop the video track |
remove_audio | boolean | Drop the audio track |
video_name_blur | boolean | Blur on-screen name overlays in video |
speaker_anonymization | string | null | Replace speaker labels with permanent aliases: "only_participants" or "participants_and_researchers" |
Typical combinations
- Transcript + audio redaction:
redact_pii: true, optionallypii_redaction_category,pii_redaction_type: ["transcript", "audio"] - Face blur:
anonymize_video: "blur_faces" - Stronger video privacy:
anonymize_video: "blur_entire_video"and/oraudio_modulation: true - Hide speaker identities in UI:
speaker_anonymization: "only_participants"
Full example:
{
"name": "Compliance Interviews",
"supported_languages": ["en-US"],
"default_ai_language": "en-US",
"disable_search_ask_ai": false,
"project_share_preference": 2,
"auto_ai_notes_payload": {
"skip_discussion_guide": true,
"auto_apply_labels": false
},
"redact_pii": true,
"pii_redaction_type": ["transcript", "audio"],
"anonymize_video": "blur_faces",
"audio_modulation": true,
"speaker_anonymization": "only_participants"
}
Errors#
| HTTP | When |
|---|---|
403 | Missing project:write scope, or project creation disabled for the team |
429 | Rate limit exceeded (20 req/min per API key) |