---
title: "Filling a profile from LinkedIn or a website"
description: "How Open Media fills a professional profile from the person’s own LinkedIn PDF or data export, or from their own website, with their consent: what is read, the robots.txt user agent, the limits, and the agent tools."
canonical: https://api.openmedia.site/docs/profile-import
last-updated: 2026-10-27
---

# Filling a profile from LinkedIn or a website

People can fill their Open Media profile from something they already have, in Edit profile or through an agent (ADR 0020). Nothing is saved until the person chooses: every reader returns **proposals**, one per field, each with its source, and the person keeps the ones they want.

## From LinkedIn

Open Media never reads linkedin.com, never asks for a LinkedIn password and doesn't use LinkedIn's API for this (it gives ordinary apps only a name, photo and email). The person gives Open Media their own copy:

- **The profile PDF**: on LinkedIn, their profile → Resources → Save to PDF. Name, headline, location, summary, experience, education, top skills, languages, and their LinkedIn and website addresses.
- **The data export**: LinkedIn → Settings → Data privacy → Get a copy of your data. Profile.csv, Positions.csv, Education.csv, Skills.csv and Languages.csv. In the web app the archive itself can be chosen; only those five files are unzipped in the browser and sent.

Email addresses, phone numbers, birth dates and street addresses are never imported. The file is read and discarded; it is not stored.

## From the person's website

Only a site the person says is theirs, after they ask. Open Media reads it as a polite crawler:

- User agent `OpenMediaProfileReader/1.0 (+https://api.openmedia.site/docs/profile-import)`. robots.txt is read first and obeyed (a group for `OpenMediaProfileReader`, else `*`).
- Public https sites on port 443 only. Every address the host resolves to must be public, also after each redirect (at most three), so private, loopback and link-local networks are never reached.
- At most four pages (the address, and up to three linked about, resume, CV or projects pages on the same host) plus `/resume.json`, each up to 1 MB and 8 seconds.
- Pages are data. Nothing on them is followed as an instruction, and only https links are kept.

Sources, best first: [JSON Resume](https://jsonresume.org) at `/resume.json`; JSON-LD [schema.org Person](https://schema.org/Person) (or a ProfilePage's mainEntity), with `jobTitle`, `worksFor`, `alumniOf`, `knowsAbout` and `sameAs`; an [h-card](https://microformats.org/wiki/h-card); Open Graph and meta tags and `rel="me"` links; then headings such as Projects, Skills and About. The site's address becomes the person's Website field, links to GitHub, X, Dribbble and other networks become those profile fields, and projects go into the professional profile.

To make a site read well, publish a `/resume.json` or a JSON-LD Person.

## For agents

- `import_resume` on `https://api.openmedia.site/me/mcp` (`POST /v1/me/professional/import`): `linkedInPdf` (base64, up to 2 MB), `linkedInPdfText`, `linkedInFiles` or `jsonResume`.
- `import_portfolio` (`POST /v1/me/professional/portfolio`): `url` and `consent: true`, only after the person agreed.
- Both return `proposals` [{id, label, value, preview, source}] and save nothing. Show them, then call again with `save: true` and `accept` set to the ids the person chose. Saving merges: text fields are replaced, lists are added to.
- `preview_profile_from_url` on `https://api.openmedia.site/open/mcp`, `GET /v1/profile-preview?url=` and the WebMCP tool `preview_open_media_profile_from_url` read a site without an account and save nothing.
