---
title: "Ask a client for access to their project"
method: POST
path: "/clients/access-requests"
tags: ["Agencies"]
---

# Ask a client for access to their project

`POST /clients/access-requests`

## Request

- Base URL: `https://api.hypamoon.com/api/v1`
- URL: `https://api.hypamoon.com/api/v1/clients/access-requests`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://app.hypamoon.com/oauth/authorize`, token URL `https://api.hypamoon.com/oauth/token`, scopes: `clients:write`)

Asks the owner of an existing project for access. The answer has confirm_url: a page in the portal where the owner sees what your agency can do, who pays and how to revoke, and accepts or declines. With payer agency your agency offers to pay the usage; the owner can still choose to pay himself. Nothing is emailed; give the link to the client. An open request is returned as it is (200).

## Request body

- object
  - `project_id` string, uuid, required
  - `message` string
  - `payer` 'client' | 'agency'

## Response `200`

The open request or active relation that already existed.

- object
  - `object` 'client_relation', required
  - `id` string, uuid, required
  - `agency` object, required
    - `project_id` string, uuid, required
    - `name` string, required
  - `client` object, required
    - `project_id` string, uuid, required
    - `name` string, required
  - `status` 'pending' | 'active' | 'declined' | 'ended', required
  - `stage` 'building' | 'client_owned', required
  - `role` 'viewer' | 'builder' | 'admin', required
  - `max_mode` 'test' | 'live', required
  - `four_eyes` boolean, required
  - `payer` 'client' | 'agency', required
  - `budget_eur` number, nullable, required
  - `payer_change` object, nullable, required
    - `to` 'client' | 'agency', required
    - `proposed_by` 'client' | 'agency', required
    - `proposed_at` string, nullable, required
  - `owner_invite` object, nullable, required
    - `email` string, required
    - `expires_at` string, nullable, required
    - `agency_keeps_access` boolean, required
  - `confirmed_at` string, nullable, required
  - `ended_at` string, nullable, required
  - `created_at` string, required
  - `transfer` object
    - `direction` 'incoming' | 'outgoing', required
    - `agency` object, required
      - `project_id` string, uuid, required
      - `name` string, required
    - `relation_id` string, uuid, required
    - `expires_at` string, nullable, required
  - `ended_via` 'client' | 'agency' | 'admin' | 'handover' | 'expired' | 'cleanup'
  - `cleanup` object
    - `phase` 'notified' | 'trash' | 'deleted', required
    - `trash_on` string, required
    - `delete_on` string, required
  - `confirm_url` string, uri, required

## Other responses

- `201`: The new request.
- `400`: Bad Request: invalid_json.
- `401`: Unauthorized: unauthorized, missing_api_key, invalid_api_key, api_key_revoked, project_deleted.
- `403`: Forbidden: project_not_enabled, key_mode_mismatch, missing_scope, verification_required, forbidden.
- `404`: Not Found: not_found.
- `409`: Conflict: conflict.
- `422`: Unprocessable Content: validation_failed.
- `429`: Too Many Requests: rate_limited.
- `500`: Internal Server Error: internal_error.
- `503`: Service Unavailable: service_unavailable.

---

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