---
title: "Upsert Profile"
method: POST
path: "/api/v1/auth/profile"
tags: ["grandline-auth"]
---

# Upsert Profile

`POST /api/v1/auth/profile`

## Request

- Base URL: `https://grandline.luzomi.com`
- URL: `https://grandline.luzomi.com/api/v1/auth/profile`
- Auth: none declared

Complete (or update) the user's profile.

Completion requires name, designation, company, country, city, at least one
interested sector, and acceptance of the Data Privacy Policy (GDPR). On the
first fully-valid call profile_completed_at is stamped — clearing the pre-
profile 5/day cap and lifting the account to 10/day + 300/month. The company
is resolved into the shared grandline.companies list (find-or-create).

## Request body

- ProfileIn
  - `name` string, required: Full name of the person using the key.
  - `designation` string, required: Job title / role (e.g. 'Freight Analyst').
  - `company_name` string, required: Company name (resolved into the shared company list).
  - `country` string, required
  - `city` string, required
  - `sectors` string[], required: One or more interested sectors from the fixed list.
  - `privacy_consent` boolean, required: Must be true to complete the profile (GDPR).
  - `marketing_consent` boolean: Opt-in to promotional emails. Default false.

## Response `200`

Successful Response

- ProfileOut
  - `email` string, required
  - `name` string, nullable, required
  - `designation` string, nullable, required
  - `company_name` string, nullable, required
  - `what_building` string, nullable, required
  - `country` string, nullable
  - `city` string, nullable
  - `sectors` string[]
  - `privacy_consent_at` string, date-time, nullable
  - `privacy_policy_version` string, nullable
  - `marketing_consent` boolean
  - `profile_completed_at` string, date-time, nullable
  - `total_authenticated_calls` integer
  - `verified_at` string, date-time, nullable
  - `last_seen_at` string, date-time, nullable
  - `status` string, nullable
  - `active_key_expires_at` string, date-time, nullable

## Other responses

- `401`: Authentication required
- `404`: Key not found / not owned by caller
- `422`: Validation Error

---

[API](https://skmtc.dev/luzomi/apis/grandline-api.md) · [All operations](https://skmtc.dev/luzomi/apis/grandline-api/llms.txt) · [OpenAPI document](https://skmtc.dev/luzomi/apis/grandline-api/revisions/4ce06aea012b?raw)
