Resume API (1.0.0)

Download OpenAPI specification:

An API for a person's resume-shaped data — profile, work experience, education, skills, certifications, hobbies, and goals — served back as JSON or Markdown.

Every route is scoped to the caller's own identity: there is no person ID anywhere in a URL or request body. The caller's Clerk user is derived from the verified JWT on every request, so /me/... always means "the signed-in user," never anyone else's data.

Authenticate with a Clerk session token, issued against the resume-api JWT template (audience https://api.peteshepley.com), sent as Authorization: Bearer <token>.

Profile

Singleton profile — one per person.

Get the caller's profile

404 until the first PUT /me/profile.

Authorizations:
clerkAuth

Responses

Response samples

Content type
application/json
{
  • "name": "string",
  • "headline": "string",
  • "summary": "string",
  • "location": "string",
  • "email": "string",
  • "links": {
    },
  • "goals_summary": "string",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Create or replace the caller's profile

Upsert — always succeeds, no 404.

Authorizations:
clerkAuth
Request Body schema: application/json
required
name
required
string
headline
string or null
summary
string or null
location
string or null
email
string or null
object

e.g. {"linkedin": "...", "github": "...", "site": "..."}

goals_summary
string or null

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "headline": "string",
  • "summary": "string",
  • "location": "string",
  • "email": "string",
  • "links": {
    },
  • "goals_summary": "string"
}

Response samples

Content type
application/json
{
  • "name": "string",
  • "headline": "string",
  • "summary": "string",
  • "location": "string",
  • "email": "string",
  • "links": {
    },
  • "goals_summary": "string",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Experience

Work experience, sorted most-recent-first.

List experience entries (most recent first)

Authorizations:
clerkAuth

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Create an experience entry

Authorizations:
clerkAuth
Request Body schema: application/json
required
organization
required
string
title
required
string
location
string or null
employment_type
string (EmploymentType)
Enum: "full-time" "part-time" "contract" "internship" "self-employed"
start_date
required
string <date>
end_date
string or null <date>

Omit/null for the current role.

responsibilities
Array of strings
accomplishments
Array of strings

Responses

Request samples

Content type
application/json
{
  • "organization": "string",
  • "title": "string",
  • "location": "string",
  • "employment_type": "full-time",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "responsibilities": [
    ],
  • "accomplishments": [
    ]
}

Response samples

Content type
application/json
{
  • "organization": "string",
  • "title": "string",
  • "location": "string",
  • "employment_type": "full-time",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "responsibilities": [
    ],
  • "accomplishments": [
    ],
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Get one experience entry

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "organization": "string",
  • "title": "string",
  • "location": "string",
  • "employment_type": "full-time",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "responsibilities": [
    ],
  • "accomplishments": [
    ],
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Replace one experience entry

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Request Body schema: application/json
required
organization
required
string
title
required
string
location
string or null
employment_type
string (EmploymentType)
Enum: "full-time" "part-time" "contract" "internship" "self-employed"
start_date
required
string <date>
end_date
string or null <date>

Omit/null for the current role.

responsibilities
Array of strings
accomplishments
Array of strings

Responses

Request samples

Content type
application/json
{
  • "organization": "string",
  • "title": "string",
  • "location": "string",
  • "employment_type": "full-time",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "responsibilities": [
    ],
  • "accomplishments": [
    ]
}

Response samples

Content type
application/json
{
  • "organization": "string",
  • "title": "string",
  • "location": "string",
  • "employment_type": "full-time",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "responsibilities": [
    ],
  • "accomplishments": [
    ],
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete one experience entry

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "statusCode": 0,
  • "message": "string"
}

Education

Education history, sorted most-recent-first.

List education entries (most recent first)

Authorizations:
clerkAuth

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Create an education entry

Authorizations:
clerkAuth
Request Body schema: application/json
required
institution
required
string
degree
required
string
field_of_study
string or null
location
string or null
start_date
required
string <date>
end_date
string or null <date>
gpa
string or null
honors
string or null
activities
string or null

Responses

Request samples

Content type
application/json
{
  • "institution": "string",
  • "degree": "string",
  • "field_of_study": "string",
  • "location": "string",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "gpa": "string",
  • "honors": "string",
  • "activities": "string"
}

Response samples

Content type
application/json
{
  • "institution": "string",
  • "degree": "string",
  • "field_of_study": "string",
  • "location": "string",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "gpa": "string",
  • "honors": "string",
  • "activities": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Get one education entry

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "institution": "string",
  • "degree": "string",
  • "field_of_study": "string",
  • "location": "string",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "gpa": "string",
  • "honors": "string",
  • "activities": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Replace one education entry

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Request Body schema: application/json
required
institution
required
string
degree
required
string
field_of_study
string or null
location
string or null
start_date
required
string <date>
end_date
string or null <date>
gpa
string or null
honors
string or null
activities
string or null

Responses

Request samples

Content type
application/json
{
  • "institution": "string",
  • "degree": "string",
  • "field_of_study": "string",
  • "location": "string",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "gpa": "string",
  • "honors": "string",
  • "activities": "string"
}

Response samples

Content type
application/json
{
  • "institution": "string",
  • "degree": "string",
  • "field_of_study": "string",
  • "location": "string",
  • "start_date": "2019-08-24",
  • "end_date": "2019-08-24",
  • "gpa": "string",
  • "honors": "string",
  • "activities": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete one education entry

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "statusCode": 0,
  • "message": "string"
}

Skills

Skills, in insertion order.

List skills (insertion order)

Authorizations:
clerkAuth

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Create a skill

Authorizations:
clerkAuth
Request Body schema: application/json
required
name
required
string
category
required
string (SkillCategory)
Enum: "language" "framework" "tool" "soft-skill"
proficiency
string (Proficiency)
Enum: "beginner" "intermediate" "advanced" "expert"
years_experience
number or null

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "category": "language",
  • "proficiency": "beginner",
  • "years_experience": 0
}

Response samples

Content type
application/json
{
  • "name": "string",
  • "category": "language",
  • "proficiency": "beginner",
  • "years_experience": 0,
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Get one skill

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "name": "string",
  • "category": "language",
  • "proficiency": "beginner",
  • "years_experience": 0,
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Replace one skill

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Request Body schema: application/json
required
name
required
string
category
required
string (SkillCategory)
Enum: "language" "framework" "tool" "soft-skill"
proficiency
string (Proficiency)
Enum: "beginner" "intermediate" "advanced" "expert"
years_experience
number or null

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "category": "language",
  • "proficiency": "beginner",
  • "years_experience": 0
}

Response samples

Content type
application/json
{
  • "name": "string",
  • "category": "language",
  • "proficiency": "beginner",
  • "years_experience": 0,
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete one skill

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "statusCode": 0,
  • "message": "string"
}

Certifications

Certifications, in insertion order.

List certifications (insertion order)

Authorizations:
clerkAuth

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Create a certification

Authorizations:
clerkAuth
Request Body schema: application/json
required
name
required
string
issuing_organization
required
string
issue_date
required
string <date>
expiration_date
string or null <date>
credential_id
string or null
credential_url
string or null
type
string (CertificationType)
Enum: "professional" "personal"

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "issuing_organization": "string",
  • "issue_date": "2019-08-24",
  • "expiration_date": "2019-08-24",
  • "credential_id": "string",
  • "credential_url": "string",
  • "type": "professional"
}

Response samples

Content type
application/json
{
  • "name": "string",
  • "issuing_organization": "string",
  • "issue_date": "2019-08-24",
  • "expiration_date": "2019-08-24",
  • "credential_id": "string",
  • "credential_url": "string",
  • "type": "professional",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Get one certification

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "name": "string",
  • "issuing_organization": "string",
  • "issue_date": "2019-08-24",
  • "expiration_date": "2019-08-24",
  • "credential_id": "string",
  • "credential_url": "string",
  • "type": "professional",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Replace one certification

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Request Body schema: application/json
required
name
required
string
issuing_organization
required
string
issue_date
required
string <date>
expiration_date
string or null <date>
credential_id
string or null
credential_url
string or null
type
string (CertificationType)
Enum: "professional" "personal"

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "issuing_organization": "string",
  • "issue_date": "2019-08-24",
  • "expiration_date": "2019-08-24",
  • "credential_id": "string",
  • "credential_url": "string",
  • "type": "professional"
}

Response samples

Content type
application/json
{
  • "name": "string",
  • "issuing_organization": "string",
  • "issue_date": "2019-08-24",
  • "expiration_date": "2019-08-24",
  • "credential_id": "string",
  • "credential_url": "string",
  • "type": "professional",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete one certification

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "statusCode": 0,
  • "message": "string"
}

Hobbies

Hobbies, in insertion order.

List hobbies (insertion order)

Authorizations:
clerkAuth

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Create a hobby

Authorizations:
clerkAuth
Request Body schema: application/json
required
name
required
string
description
string or null

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string"
}

Response samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Get one hobby

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Replace one hobby

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Request Body schema: application/json
required
name
required
string
description
string or null

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "description": "string"
}

Response samples

Content type
application/json
{
  • "name": "string",
  • "description": "string",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete one hobby

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "statusCode": 0,
  • "message": "string"
}

Goals

Career/personal/learning goals, in insertion order.

List goals (insertion order)

Authorizations:
clerkAuth

Responses

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Create a goal

Authorizations:
clerkAuth
Request Body schema: application/json
required
description
required
string
category
required
string (GoalCategory)
Enum: "career" "personal" "learning"
target_date
string or null <date>
status
string (GoalStatus)
Enum: "active" "achieved" "abandoned"

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "category": "career",
  • "target_date": "2019-08-24",
  • "status": "active"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "category": "career",
  • "target_date": "2019-08-24",
  • "status": "active",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Get one goal

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "description": "string",
  • "category": "career",
  • "target_date": "2019-08-24",
  • "status": "active",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Replace one goal

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Request Body schema: application/json
required
description
required
string
category
required
string (GoalCategory)
Enum: "career" "personal" "learning"
target_date
string or null <date>
status
string (GoalStatus)
Enum: "active" "achieved" "abandoned"

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "category": "career",
  • "target_date": "2019-08-24",
  • "status": "active"
}

Response samples

Content type
application/json
{
  • "description": "string",
  • "category": "career",
  • "target_date": "2019-08-24",
  • "status": "active",
  • "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  • "entity_type": "string",
  • "pk": "string",
  • "sk": "string",
  • "created_at": "2019-08-24T14:15:22Z",
  • "updated_at": "2019-08-24T14:15:22Z"
}

Delete one goal

Authorizations:
clerkAuth
path Parameters
id
required
string <uuid>

The entry's id (uuid4), as returned by list/create.

Responses

Response samples

Content type
application/json
{
  • "statusCode": 0,
  • "message": "string"
}

Resume

The whole resume assembled in one call.

Get the whole resume in one call

Assembles the profile plus all six collections in a single query. format=markdown returns a rendered Markdown resume instead of JSON.

Authorizations:
clerkAuth
query Parameters
format
string
Default: "json"
Enum: "json" "markdown"

Responses

Response samples

Content type
{
  • "profile": {
    },
  • "experience": [
    ],
  • "education": [
    ],
  • "skills": [
    ],
  • "certifications": [
    ],
  • "hobbies": [
    ],
  • "goals": [
    ]
}