Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Projects

DesignSafe projects are collaborative workspaces where team members share files, curate datasets, and publish research. Projects include both your own projects (MyProjects) and published projects (NHERI-Published). Each project has a PRJ number (e.g., PRJ-6270), a UUID, and a corresponding Tapis storage system.

Project metadata is fetched from the DesignSafe portal API (/api/projects/v2/), which provides project details, team information, and DOIs. File listings use the Tapis Files API against the project’s storage system (project-<uuid>).

List your projects

Returns a DataFrame by default. Use output="list" for a list of dicts.

from dapi import DSClient
ds = DSClient()

# DataFrame (renders as a table in Jupyter)
ds.projects.list()

# List of dicts
projects = ds.projects.list(output="list")

Pagination:

ds.projects.list(limit=100, offset=100)

DataFrame columns: projectId, title, pi, type, created, lastUpdated, uuid.

Get project details

Returns a dictionary with full project metadata.

info = ds.projects.get("PRJ-6270")

info['title']
info['description']
info['pi']           # PI display name (e.g., "Cheng-Hsi Hsiao")
info['dois']         # Associated DOIs
info['keywords']
info['awardNumbers']
info['projectType']  # experimental, simulation, field_recon, other, etc.
info['systemId']     # Tapis system ID for file access

Full field reference:

FieldDescription
uuidProject UUID
projectIdProject ID (e.g., “PRJ-6270”)
titleProject title
descriptionProject description
piPrincipal investigator display name
coPisCo-PIs
teamMembersTeam members
awardNumbersGrant/award numbers
keywordsKeywords
doisAssociated DOIs
projectTypeType (experimental, simulation, field_recon, etc.)
systemIdTapis system ID for file access
createdCreation timestamp
lastUpdatedLast update timestamp

List files in a project

Returns a DataFrame by default. Use output="raw" for Tapis file objects.

# Root of a project
ds.projects.files("PRJ-6270")

# Subfolder
ds.projects.files("PRJ-1305", path="/Training/")

# Raw Tapis file objects
files = ds.projects.files("PRJ-6270", output="raw")

DataFrame columns: name, type, size, lastModified, path.

Projects and file path translation

ds.files.to_uri() also accepts project paths. dapi resolves the PRJ number to the Tapis system UUID automatically:

uri = ds.files.to_uri("/MyProjects/PRJ-6270/data/")
# tapis://project-8ef68b96-dad5-4029-aba3-614ff3fa8f97/data/

files = ds.files.list(uri)

Both /MyProjects/PRJ-XXXX/ and /projects/PRJ-XXXX/ are accepted.

How it works

  1. Project listing and metadata: dapi queries the DesignSafe portal API (https://designsafe-ci.org/api/projects/v2/) using your Tapis authentication token. This API returns project metadata including the project UUID.

  2. PRJ-to-UUID resolution: Each project’s Tapis storage system ID is project-<uuid>. When you use a PRJ number (e.g., PRJ-6270), dapi looks up the UUID via the portal API.

  3. File operations: File listings use the standard Tapis Files API (t.files.listFiles) against the resolved project-<uuid> system.

Error handling