Get Master Profile
Retrieves the authenticated user's master profile along with an account summary. Requires the `resume:read` scope when called with an API key. When the user has never saved a profile, this still returns `200` with a placeholder whose `id` is an empty string and whose `content` is `{}` — it does not return `404`. Cached for 1 hour and invalidated on write.
Your personal API key — vw_ followed by 64 hex characters. The same key is also accepted
as Authorization: Bearer vw_....
In: header
Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/api/v1/profiles/master"{ "success": true, "message": "Master profile fetched successfully", "data": { "profile": { "id": "profile_123", "userId": "user_123", "content": {}, "createdAt": "2026-04-01T10:00:00.000Z", "updatedAt": "2026-04-10T10:00:00.000Z" }, "summary": { "id": "user_123", "name": "Admin", "email": "[email protected]", "createdAt": "2026-04-01T10:00:00.000Z", "emailVerified": true, "autoSyncEnabled": false, "shareResumeCount": 4 } }}Master Profile
The single source of truth new resumes, cover letters, and portfolios are seeded from.
Update Master ProfilePUT
Replaces the authenticated user's master profile. Requires the `resume:write` scope when called with an API key. **This is a full replacement, not a patch.** `profile` is validated strictly: every property of `MasterProfileContent` must be present, and any key not in the schema is rejected. Send empty arrays for sections you have no data for. Read the profile first, modify the object you got back, and send the whole thing. Pass the `updatedAt` you last read as `expectedUpdatedAt` for optimistic concurrency; omit it only when creating the profile for the first time. The example below is a complete minimal payload that validates.