UCSF Profiles JSON API

Open, unauthenticated JSON API (v2) over UCSF Profiles, the research-networking platform run by UCSF CTSI, covering 8,000+ UCSF researchers, faculty and postdocs — name, school, department, titles, ORCID iD, education and training, narrative, keywords, publications, clinical trials, awards, and research activities and funding. GET requests return application/json with CORS support; JSONP is supported via a callback parameter. A `source` parameter identifying the calling application is required on every request, but it is an attribution convention rather than a credential. UCSF asks callers to make contact before production use, to add an acknowledgement, to refresh cached data at least weekly, and to leave at least one second between calls. Notably, deprecation notices travel in the response body itself via an `api_notes` field. Verified live 2026-08-19.

OpenAPI Specification

ucsf-profiles-json-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: UCSF Profiles JSON API
  version: '2'
  description: >-
    Public JSON API over UCSF Profiles, the research-networking platform operated by the
    UCSF Clinical and Translational Science Institute (CTSI). Returns the public record for
    a UCSF researcher, faculty member or postdoc — name, school, department, titles, ORCID
    iD, education and training, narrative, keywords, publications, clinical trials, and
    research activities and funding. GET requests return JSON with CORS support; JSONP is
    supported for legacy callers. This OpenAPI description is DERIVED by API Evangelist from
    UCSF's own developer documentation plus live probed responses; UCSF does not publish an
    OpenAPI document.
  contact:
    name: UCSF Profiles / UCSF CTSI
    url: https://profilesdeveloper.ucsf.edu/
  x-operator: institution
  x-operator-evidence: >-
    servers[] host api.profiles.ucsf.edu is under the ucsf.edu registrable domain; the
    platform instance, its data and its developer documentation are operated by UCSF CTSI.
    The underlying Profiles RNS software is open source, but the running service is UCSF's.
  x-provenance:
    generated: '2026-08-19'
    method: derived
    source:
      - https://profilesdeveloper.ucsf.edu/json-api
      - https://api.profiles.ucsf.edu/json/v2/?source=apievangelist.com&ProfilesURLName=kirsten.bibbins-domingo
servers:
  - url: https://api.profiles.ucsf.edu/json/v2
    description: UCSF Profiles JSON API v2
tags:
  - name: Profiles
    description: Look up a UCSF person's public research profile.
paths:
  /:
    get:
      tags: [ Profiles ]
      operationId: getProfile
      summary: Retrieve a UCSF Profiles record
      description: >-
        Returns the public UCSF Profiles record for one person. Exactly one identifier
        parameter must be supplied. `source` is required and must identify the calling
        application or host. Callers requesting many profiles are asked to wait at least one
        second between calls and to refresh any cached copy at least weekly.
      parameters:
        - name: source
          in: query
          required: true
          description: >-
            Identifies the calling application or host, e.g. `example.ucsf.edu` or
            `UCSF+Mobile+App+for+iOS`. Required on every request.
          schema: { type: string }
        - name: ProfilesURLName
          in: query
          description: 'Profiles URL slug — for profiles.ucsf.edu/alexandra.brown use `alexandra.brown`.'
          schema: { type: string }
        - name: EPPN
          in: query
          description: eduPerson Principal Name for the person.
          schema: { type: string }
        - name: URL
          in: query
          description: A full profiles.ucsf.edu URL, including a variety of legacy URL forms.
          schema: { type: string, format: uri }
        - name: EmployeeID
          in: query
          description: Nine-digit UCSF employee ID. Supported but strongly discouraged by UCSF — prefer EPPN.
          schema: { type: string }
          deprecated: true
        - name: ProfilesNodeID
          in: query
          description: Internal Profiles node ID used after Feb 2013. Deprecated; 2013–2018 IDs are mapped on a best-effort basis.
          schema: { type: string }
          deprecated: true
        - name: Person
          in: query
          description: Legacy Profiles Person ID used in URLs before Feb 2013. Deprecated.
          schema: { type: string }
          deprecated: true
        - name: FNO
          in: query
          description: Legacy FNO code. Deprecated — only FNOs issued before April 2018 are supported.
          schema: { type: string }
          deprecated: true
        - name: publications
          in: query
          description: Set to `full` to return complete publication records rather than a summary.
          schema: { type: string, enum: [ full ] }
        - name: callback
          in: query
          description: JSONP callback function name. When present the response is served as text/javascript.
          schema: { type: string }
      responses:
        '200':
          description: The person's public profile.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/ProfilesResponse' }
            text/javascript:
              schema: { type: string, description: JSONP wrapper around the JSON body. }
        '400':
          description: Invalid request — no identifier type supplied, or an unrecognised parameter.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Error' }
        '404':
          description: No matching person.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/Error' }
components:
  schemas:
    ProfilesResponse:
      type: object
      properties:
        Profiles:
          type: array
          items: { $ref: '#/components/schemas/Profile' }
        api_notes: { type: string }
    Profile:
      type: object
      properties:
        Name: { type: string }
        FirstName: { type: string }
        LastName: { type: string }
        Title: { type: string }
        Titles: { type: array, items: { type: string } }
        School: { type: string }
        Department: { type: string }
        Address: { type: object, additionalProperties: true }
        Email: { type: string }
        PhotoURL: { type: string, format: uri }
        ProfilesURL: { type: string, format: uri }
        ORCID:
          type: string
          pattern: '^\d{4}-\d{4}-\d{4}-\d{3}[\dX]$'
          description: ORCID iD for the researcher.
          example: 0000-0002-8962-0622
        Narrative: { type: string }
        Keywords: { type: array, items: { type: string } }
        FreetextKeywords: { type: array, items: { type: string } }
        Education_Training: { type: array, items: { type: object, additionalProperties: true } }
        PublicationCount: { type: integer }
        Publications: { type: array, items: { type: object, additionalProperties: true } }
        ClinicalTrials: { type: array, items: { type: object, additionalProperties: true } }
        ResearchActivitiesAndFunding: { type: array, items: { type: object, additionalProperties: true } }
        AwardOrHonors: { type: array, items: { type: object, additionalProperties: true } }
        CollaborationInterests: { type: string }
        FacultyMentoring: { type: string }
        GlobalHealth: { type: object, additionalProperties: true }
        GlobalHealth_beta: { type: object, additionalProperties: true }
        NIHGrants_beta:
          type: array
          description: Deprecated by UCSF in favour of ResearchActivitiesAndFunding; fiscal year may be inaccurate.
          deprecated: true
          items: { type: object, additionalProperties: true }
        MediaLinks_beta: { type: array, items: { type: object, additionalProperties: true } }
        SlideShare_beta: { type: array, items: { type: object, additionalProperties: true } }
        Twitter_beta: { type: array, items: { type: object, additionalProperties: true } }
        Videos: { type: array, items: { type: object, additionalProperties: true } }
        WebLinks_beta: { type: array, items: { type: object, additionalProperties: true } }
    Error:
      type: object
      properties:
        error: { type: string, description: Human-readable error message. }
      example:
        error: >-
          You didn't specify an identifier type to look up! We were expecting to see one of
          the following: ?EPPN=... / ?EmployeeID=... / ?FNO=... / ?Person=... /
          ?ProfilesNodeID=... / ?ProfilesURLName=... / ?URL=...