Profile Import
Import a master profile from GitHub (real OAuth) or LinkedIn (AI-parsed paste).
Description
Two independent ways to bootstrap a Master Profile without typing it in by hand:
- GitHub import is a real integration against the GitHub REST API — it fetches the account's public profile and up to 30 of its most recently updated repositories, and deterministically maps repository languages to a skills list. No AI is involved. Free users may only import their own OAuth-connected GitHub account, once a day. Paid users (any active AI Credits or Portfolio Pro/Bundle plan) may import any public GitHub username, but are still capped at a hidden 50 imports/day — this protects the single shared server-side GitHub token budget from being exhausted by one account, not a real per-user usage ceiling.
- LinkedIn import is not a LinkedIn API integration — LinkedIn does not offer one for this use case. It is an AI parse of raw text the user pastes in (copied profile text, or text extracted from an exported PDF). Free users get 1 import/month; paid users get unlimited imports.
Both import types accept a replaceMaster boolean and, regardless of that flag, always create a
brand-new RESUME document seeded from the imported data.
Authentication
| Method | Access Level | Requirement |
|---|---|---|
GET | Authenticated | Session cookie, or any valid API key. No specific scope is required. |
POST | Authenticated | Session cookie, or any valid API key. No specific scope is required. |
Unlike most modules, these routes carry no scope gate — any valid API key is accepted. The quota and entitlement rules above still apply, and are keyed to the user who owns the key.
Available Endpoints
GET /profiles/import/quota— Get Profile Import QuotaPOST /profiles/import/github— Import Profile From GitHubPOST /profiles/import/linkedin— Import Profile From LinkedIn
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.
Get Profile Import QuotaGET
Returns the caller's current GitHub and LinkedIn import quota status in one call. - **GitHub import** is a real GitHub OAuth-backed integration (up to 30 of the account's most recently updated repositories, deterministically mapped to skills by repository language — no AI is involved). Free users get 1 import/day and may only import their own OAuth-connected GitHub account. Paid users (any active AI Credits or Portfolio Pro/Bundle plan) may import any public GitHub username, but are still capped at a hidden 50 imports/day — this protects the single shared `config.github.token` request budget used by every paid import and the GitHub sync cron job from being exhausted by one account. - **LinkedIn import** is not a LinkedIn API integration — it's an AI parse of raw text the user pastes in (copied profile text, or text extracted from an exported PDF). Free users get 1 import/month; paid users get unlimited imports. Both import types share a single `replaceMaster` request flag and always create a brand-new RESUME document from the imported data, in addition to optionally overwriting the master profile.