---
title: "Create a resume upload session"
method: POST
path: "/v1/people/{person_id}/resume_upload_sessions"
tags: ["People"]
---

# Create a resume upload session

`POST /v1/people/{person_id}/resume_upload_sessions`

## Request

- Base URL: `https://api.yardstick.team`
- URL: `https://api.yardstick.team/v1/people/{person_id}/resume_upload_sessions`
- Auth: HTTP bearer

Create a resume upload session

**Required scopes:** `people:write`

Server-mediated signed upload-session. Returns a single-path, short-lived (≤5 min), one-shot signed Storage `upload_url`. Upload the PDF or DOCX bytes to that URL with an HTTP `PUT`, then call the finalize endpoint to attach and parse the resume. Secret keys (`ys_sk_*`) only.

**Example (curl):**

```bash
curl -X POST https://api.yardstick.team/v1/people/per_abc123/resume_upload_sessions \
  -H 'Authorization: Bearer ys_sk_live_…' \
  -H 'Content-Type: application/json' \
  -d '{"file_name":"resume.pdf","size_bytes":48211,"content_type":"application/pdf"}'
```

**Example (TypeScript):**

```ts
await fetch(
  "https://api.yardstick.team/v1/people/per_abc123/resume_upload_sessions",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.YS_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      file_name: "resume.pdf",
      size_bytes: 48211,
      content_type: "application/pdf",
    }),
  },
).then((r) => r.json());
```

## Path parameters

- `person_id` string, required

## Headers

- `Idempotency-Key` string
- `X-Request-Id` string

## Request body

- object
  - `file_name` string, required
  - `size_bytes` integer, required
  - `content_type` string

## Response `201`

Resume upload session created.

- ResumeUploadSession: A pending resume upload session: hand the signed `upload_url` the bytes, then finalize.
  - `id` string, required: Display id, e.g. `rus_<base32>`
  - `object` 'resume_upload_session', required
  - `person_id` string, required: Canonical `per_...` person id.
  - `upload_url` string, required: Single-path, short-lived (≤5 min), one-shot signed Storage URL. PUT the resume bytes here, then call finalize.
  - `object_path` string, required: Server-minted storage object key for the resume.
  - `expires_at` string, required: ISO-8601 UTC expiry of the signed upload URL.
  - `status` 'pending', required

## Other responses

- `400`: Invalid request
- `401`: Authentication failure
- `403`: Permission denied (scope or feature flag)
- `404`: Resource not found. The error uses the resource-specific code and param names the exact body field or path parameter that referenced it.
- `409`: Conflict (e.g. idempotency key reuse with different body)
- `429`: Rate limited
- `500`: Internal error

---

[API](https://skmtc.dev/yardstick/apis/yardstick-public-api.md) · [All operations](https://skmtc.dev/yardstick/apis/yardstick-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/yardstick/apis/yardstick-public-api/revisions/bef1d2eaaaa1?raw)
