Projects
Every import needs a project_id. Create a project or list the ones your key can already reach.
| Endpoint | Scope |
|---|---|
POST /api/v1/developer/import/projects/create | project:write |
GET /api/v1/developer/import/projects | project:read |
Both are rate limited to 20 requests/minute per API key. See Access and authorization for how to get a token.
POST /api/v1/developer/import/projects/create #
Creates a project you can use as project_id for file, CSV, or insight imports. Requires project:write, and the team setting allow_manual_project_creation must be enabled — otherwise the API returns 403.
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"
}
Use id as project_id when you initialize an upload.
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 | Controls whether project data is used in Ask AI / cross-project search. See below. |
auto_ai_notes_payload | object | unset | Enables automatic AI notes after files are processed. See below. |
Ask AI (disable_search_ask_ai) #
Maps to the project setting "Marvin's AI will use project data for Ask AI" (that UI toggle is inverted):
| Value | Product setting | Meaning |
|---|---|---|
false (default) | ON | Project data may appear in Ask AI answers and cross-project analysis |
true | OFF | Keep project data private from Ask AI / cross-project search (per-file AI still works) |
Always send the field explicitly if you care about the outcome:
{ "name": "Public Research", "disable_search_ask_ai": false }
{ "name": "Internal Only", "disable_search_ask_ai": true }
Auto-notes (auto_ai_notes_payload) #
Maps to "Create AI auto-notes automatically for all imported files".
- Include the key (even as
{}) to turn auto-notes on - Omit the key to leave auto-notes off
{ "name": "Auto-notes Project", "auto_ai_notes_payload": {} }
The API stores an enabled config with is_enabled: true and empty selected_guides:
{
"selected_guides": [],
"is_enabled": true
}
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.
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[] | IDs of PII categories to redact when redact_pii is true. See Selecting PII categories below |
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" |
Selecting PII categories #
pii_redaction_category is an array of integer category IDs. Pass the IDs of the types you want redacted when redact_pii is true.
| ID | Name | Classification |
|---|---|---|
1 | Person name | Personal Information |
2 | Email address | Personal Information |
3 | Date of birth | Personal Information |
4 | Phone number | Personal Information |
5 | Organization | Personal Information |
7 | Language | Other |
10 | Drivers license | Personal Information |
11 | Banking information | Financial Information |
13 | Blood type | Health & Medical |
17 | Number sequence | Other |
18 | Credit card number | Financial Information |
19 | Credit card expiration | Financial Information |
20 | Credit card CVV | Financial Information |
21 | US social security number | Personal Information |
22 | Date | Other |
23 | Person age | Personal Information |
24 | Nationality | Other |
25 | Location | Personal Information |
Behavior
- Pair with
"redact_pii": true(and usuallypii_redaction_type) so redaction actually runs. - Passing any PII field (including
pii_redaction_category) withoutauto_pii_enabled_at_project_levelauto-enables project-level auto-PII. - Omit
pii_redaction_category(or pass[]) to leave category selection unset / platform defaults for that project.
Example — redact names, emails, and phone numbers in transcript + audio:
{
"name": "PII-safe Calls",
"redact_pii": true,
"pii_redaction_type": ["transcript", "audio"],
"pii_redaction_category": [1, 2, 4]
}
Typical combinations
- Transcript + audio redaction:
redact_pii: true,pii_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": {},
"redact_pii": true,
"pii_redaction_type": ["transcript", "audio"],
"pii_redaction_category": [1, 2, 4],
"anonymize_video": "blur_faces",
"audio_modulation": true,
"speaker_anonymization": "only_participants"
}
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
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) |
GET /api/v1/developer/import/projects #
Returns projects accessible to your API key. Requires project:read. Archived and deleted projects are excluded.
curl -s "$BASE_URL/api/v1/developer/import/projects?limit=50&offset=0" \
-H "Authorization: Bearer $TOKEN" | python3 -m json.tool
Response:
{
"projects": [
{ "id": 42, "name": "Alpha Research" },
{ "id": 43, "name": "Beta Onboarding" }
],
"count": 2,
"next": null,
"previous": null
}
Team-shared keys see team projects; personal keys see user-accessible projects. An empty list usually means the projects aren't shared with the team.
Pagination: results are paginated with limit/offset query params (default and max limit is 50). count is the total number of matching projects; next/previous are full URLs to the adjacent page, or null when there isn't one — the same shape as list files.