---
title: "Sign contract"
method: POST
path: "/api/v1/rentals/{rentalId}/contract/sign"
tags: ["Contracts"]
---

# Sign contract

`POST /api/v1/rentals/{rentalId}/contract/sign`

## Request

- Base URL: `http://localhost:3002`
- URL: `http://localhost:3002/api/v1/rentals/{rentalId}/contract/sign`
- Auth: none required

Records a customer's signature for the rental contract. On success, the server stamps the active `ContractTemplate` id plus the request's `userAgent` and `ipAddress` into `signatureData`. Public endpoint — no authentication required.

## Path parameters

- `rentalId` string, required

## Request body

- object
  - `signerName` string, required
  - `signerEmail` string, email, required
  - `signatureData` object, required
    - `typedName` string, required: Customer's typed name as their signature.
    - `agreedAt` string, date-time, required: ISO 8601 timestamp of when the customer agreed.

## Response `201`

Contract signed.

- object
  - `data` SignedContract
    - `id` string, required
    - `rentalId` string, required
    - `contractTemplateId` string, required
    - `contractTemplateVersion` integer, required
    - `signerName` string, required
    - `signerEmail` string, email, required
    - `signedAt` string, date-time, required
    - `signatureData` string, nullable

## Other responses

- `400`: Bad request — `VALIDATION_ERROR` if the request body is invalid, `ALREADY_SIGNED` if the rental contract has already been signed, or `NO_TEMPLATE` if the boat owner has no active contract template.
- `404`: Rental not found.

---

[API](https://skmtc.dev/chartercaptain/apis/charter-captain-api.md) · [All operations](https://skmtc.dev/chartercaptain/apis/charter-captain-api/llms.txt) · [OpenAPI document](https://skmtc.dev/chartercaptain/apis/charter-captain-api/revisions/1ffea1113adb?raw)
