---
title: "Import a project"
method: POST
path: "/import/projects"
tags: ["import"]
---

# Import a project

`POST /import/projects`

Imports a project with its original timestamps. Unlike POST /projects, this does not fire triggers,
notifications, realtime updates, or analytics, and it accepts created_at and updated_at.

**Rate limit:** 20 requests per minute

## Request body

- ImportProjectRequestBody
  - `account_id` string, required — The ID of the account this project belongs to.
  - `created_at` string — The time the project was created in the system it is being imported from, in RFC 3339 format. Defaults to now. format: date-time
  - `custom_fields` CustomFieldValue[] — An array of custom fields to be used on this project. Values that cannot be applied are skipped and reported under warnings rather than failing the import.
    - `slug` string — The slug of the custom field.
    - `value` string — The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint. If the custom field is a relationship field, the value must be the related object ID.
    - `values` string[] — The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.
  - `customer_portal_visible` boolean — Whether the project is visible in the customer portal. Defaults to false.
  - `description_html` string — Description HTML for this project.
  - `end_date` string — End date for this project, in RFC 3339 format. format: date-time
  - `name` string, required — The name of the project.
  - `owner_id` string — The ID of the user who owns this project.
  - `start_date` string — Start date for this project, in RFC 3339 format. format: date-time
  - `status` string — The status of the project. One of not_started, in_progress, or completed. Defaults to not_started.
  - `updated_at` string — The time the project was last updated in the system it is being imported from, in RFC 3339 format. Defaults to now. format: date-time

## Response `200`

- ImportProjectResponseBody
  - `data` Project
    - `account` MiniAccount
      - `external_ids` ExternalID[] — External IDs associated with the account.
        - `external_id` string — The external ID. Must be unique per object type (ex. account).
        - `label` string — The label of the external ID. Must be unique per object.
      - `id` string — The ID of the account.
    - `archived_at` string — The archived at time of the project in RFC3339 format.
    - `created_at` string — The created at time of the project.
    - `custom_fields` object — Custom fields for this project, keyed by slug.
    - `customer_portal_visible` boolean — The customer portal visible of the project.
    - `description_html` string — The description of the project in HTML format.
    - `end_date` string — The end date of the project in RFC3339 format.
    - `id` string — The ID of the project.
    - `is_archived` boolean — Whether the project is archived.
    - `name` string — The name of the project.
    - `owner_id` string — The owner ID of the project.
    - `project_template` MiniProjectTemplate
      - `id` string — The ID of the project template.
    - `start_date` string — The start date of the project in RFC3339 format.
    - `updated_at` string — The updated at time of the project.
  - `request_id` string — The request ID for tracking.
  - `warnings` ImportWarnings
    - `skipped_attachments` string[] — Attachment URLs that were skipped because they failed security validation. Present only when at least one was skipped.
    - `skipped_custom_fields` string[] — Custom field slugs that were skipped because they are unknown, belong to another object type, or are read-only. Present only when at least one was skipped.

## Other responses

- `400` — The request was invalid or could not be completed.
- `404`
- `500` — An unexpected internal error occurred.

---

[API](https://skmtc.net/usepylon/apis/pylon-api.md) · [All operations](https://skmtc.net/usepylon/apis/pylon-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/usepylon/pylon-api/revisions/d4db007b26b2/schema)
