Projects

Every import needs a project_id. Create a project or list the ones your key can already reach.

EndpointScope
POST /api/v1/developer/import/projects/createproject:write
GET /api/v1/developer/import/projectsproject: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.

bash
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):

json
{
  "id": 44,
  "name": "Q3 Customer Calls"
}

Use id as project_id when you initialize an upload.

Required fields#

FieldTypeDescription
namestringProject display name (max 200 characters). Whitespace-only names are rejected.

Language & AI settings#

FieldTypeDefaultWhat it does
supported_languagesstring[]team / system defaultLocale codes used for transcription on files in this project (e.g. ["en-US", "de-DE"]). Multi-select.
transcript_languagestringusually en-USPrimary transcript language for the project.
default_ai_languagestringsame as transcriptLanguage Marvin AI prefers when summarizing / answering Ask AI.
disable_search_ask_aibooleanfalseControls whether project data is used in Ask AI / cross-project search. See below.
auto_ai_notes_payloadobjectunsetEnables 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):

ValueProduct settingMeaning
false (default)ONProject data may appear in Ask AI answers and cross-project analysis
trueOFFKeep 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:

json
{ "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
json
{ "name": "Auto-notes Project", "auto_ai_notes_payload": {} }

The API stores an enabled config with is_enabled: true and empty selected_guides:

json
{
  "selected_guides": [],
  "is_enabled": true
}

Sharing settings#

If you omit sharing fields, the new project inherits the team's default share preference.

FieldTypeWhat it does
project_share_preferenceintegerWho can see the project. See modes below.
shared_rolesinteger[]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

ModeMeaningPayload
PrivateOnly the project owner{ "project_share_preference": 1 }
Project owner + adminsOwner 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] }
EveryoneEntire team, including viewers{ "project_share_preference": 2 }

shared_roles role IDs (used with preference 4):

IDRole
0Full seat
2Viewer
3Team admin
4Collaborator

Examples:

json
{ "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.

FieldTypeWhat it does
auto_pii_enabled_at_project_levelbooleanMaster switch for applying project PII settings automatically to new files
redact_piibooleanRedact sensitive details from the transcript (and beep in audio when audio redaction is in scope)
pii_redaction_categoryinteger[]IDs of PII categories to redact when redact_pii is true. See Selecting PII categories below
pii_redaction_typestring[]Where redaction applies. Allowed: "audio", "transcript", "video"
anonymize_videostring | nullVideo visual anonymization: "blur_faces" (faces + on-screen names) or "blur_entire_video"
audio_modulationbooleanAlter voices so speakers are harder to recognize
blank_videobooleanReplace video with a blank/placeholder frame track (audio can remain)
remove_videobooleanDrop the video track
remove_audiobooleanDrop the audio track
video_name_blurbooleanBlur on-screen name overlays in video
speaker_anonymizationstring | nullReplace 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.

IDNameClassification
1Person namePersonal Information
2Email addressPersonal Information
3Date of birthPersonal Information
4Phone numberPersonal Information
5OrganizationPersonal Information
7LanguageOther
10Drivers licensePersonal Information
11Banking informationFinancial Information
13Blood typeHealth & Medical
17Number sequenceOther
18Credit card numberFinancial Information
19Credit card expirationFinancial Information
20Credit card CVVFinancial Information
21US social security numberPersonal Information
22DateOther
23Person agePersonal Information
24NationalityOther
25LocationPersonal Information

Behavior

  • Pair with "redact_pii": true (and usually pii_redaction_type) so redaction actually runs.
  • Passing any PII field (including pii_redaction_category) without auto_pii_enabled_at_project_level auto-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:

json
{
  "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/or audio_modulation: true
  • Hide speaker identities in UI: speaker_anonymization: "only_participants"

Full example:

json
{
  "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#

  1. Project is created for the API key's user
  2. Sharing defaults come from the team unless you override project_share_preference
  3. A default (empty) label template is created and attached to the project
  4. Response returns { "id", "name" } — use id as project_id in initialize

Errors#

HTTPWhen
403Missing project:write scope, or project creation disabled for the team
429Rate 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.

bash
curl -s "$BASE_URL/api/v1/developer/import/projects?limit=50&offset=0" \
  -H "Authorization: Bearer $TOKEN" | python3 -m json.tool

Response:

json
{
  "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.