# Register a client (RFC 7591 dynamic client registration)

POST`/oauth/register`

Request

**curl**


```bash
curl -X POST "https://api.taskadence.com/oauth/register" \
  -H "Content-Type: application/json" \
  -d '{"client_name":"<client_name>","redirect_uris":"<redirect_uris>"}'
```

Response 201

```json
{
  "client_id": "tkdc_Q2x9eLr0v2Zk5n8WcHt1YpUo",
  "client_id_issued_at": 1790500000,
  "client_name": "Claude Code",
  "grant_types": [
    "authorization_code",
    "refresh_token"
  ],
  "redirect_uris": [
    "http://localhost:53682/callback"
  ],
  "response_types": [
    "code"
  ],
  "scope": "tasks:read tasks:write projects:read teams:read members:read",
  "token_endpoint_auth_method": "none"
}
```

Register a client (RFC 7591) - how MCP clients connect without a developer account. The client is public: no secret, PKCE on every authorization. No authentication; limited per address.

## Request Bodyrequired

application/json

_ClientRegistrationRequest_

The metadata a client sends to register itself. Unknown fields are ignored (RFC 7591 §2).

object

**client\_name**

required

_Client Name_

Shown on the consent screen

string

\>= 1 characters <= 100 characters

**redirect\_uris**

required

_Redirect Uris_

Exact strings: https, http on a loopback host (localhost, any port), or a desktop client’s scheme (cursor, vscode, vscode-insiders, claude)

Array<string>

\>= 1 items <= 10 items

**token\_endpoint\_auth\_method**

_Token Endpoint Auth Method_

Must be `none`: a registered client is public and proves itself with PKCE; it never gets a secret

string

default: none

Allowed value: none

**grant\_types**

Any of:

**Array<string>**


Array<string>

Allowed values: authorization\_code refresh\_token

**null**


null

**response\_types**

Any of:

**Array<string>**


Array<string>

**null**


null

**scope**

Any of:

**string**


string

**null**


null

**client\_uri**

Any of:

**string**


string

<= 2000 characters

**null**


null

**logo\_uri**

Any of:

**string**


string

<= 2000 characters

**null**


null

**policy\_uri**

Any of:

**string**


string

<= 2000 characters

**null**


null

## Responses

### 201

Successful Response

application/json

_ClientRegistrationResponse_

Returned by `oauth.register`.

object

**client\_id**

required

_Client Id_

Public identifier (`tkdc_…`). There is no client secret.

string

**client\_id\_issued\_at**

required

_Client Id Issued At_

Unix seconds

integer

**client\_name**

required

_Client Name_

string

**redirect\_uris**

required

_Redirect Uris_

Array<string>

**grant\_types**

required

_Grant Types_

Array<string>

**response\_types**

required

_Response Types_

Array<string>

**token\_endpoint\_auth\_method**

_Token Endpoint Auth Method_

string

default: none

Allowed value: none

**scope**

required

_Scope_

The scopes the client may ask for, space-separated

string

**client\_uri**

Any of:

**string**


string

**null**


null

**logo\_uri**

Any of:

**string**


string

**null**


null

**policy\_uri**

Any of:

**string**


string

**null**


null

Example

```json
{
  "client_id": "tkdc_Q2x9eLr0v2Zk5n8WcHt1YpUo",
  "client_id_issued_at": 1790500000,
  "client_name": "Claude Code",
  "grant_types": [
    "authorization_code",
    "refresh_token"
  ],
  "redirect_uris": [
    "http://localhost:53682/callback"
  ],
  "response_types": [
    "code"
  ],
  "scope": "tasks:read tasks:write projects:read teams:read members:read",
  "token_endpoint_auth_method": "none"
}
```

### 400

The metadata is refused: `invalid_client_metadata` or `invalid_redirect_uri` (RFC 7591)

application/json

_RegistrationErrorBody_

A `RegistrationErrorBody` object.

object

**error**

required

_Error_

string

Allowed values: invalid\_client\_metadata invalid\_redirect\_uri

**error\_description**

Any of:

**string**


string

**null**


null

Example

```json
{
  "error": "invalid_client_metadata",
  "error_description": "string"
}
```

### 429

Too many registrations from this address; wait `Retry-After` seconds

application/problem+json

_Problem_

An RFC 9457 problem details object - the body of every error response. `detail` is the human-readable explanation; `request_id` identifies the request for support.

object

**type**

required

`about:blank` or a `urn:taskadence:problem:*` identifier

string

Allowed values: about:blank urn:taskadence:problem:validation urn:taskadence:problem:invalid-parameter urn:taskadence:problem:precondition-failed urn:taskadence:problem:idempotency-key-reused urn:taskadence:problem:idempotency-key-in-flight urn:taskadence:problem:idempotency-key-invalid urn:taskadence:problem:rate-limit urn:taskadence:problem:internal urn:taskadence:problem:token-invalid urn:taskadence:problem:token-expired urn:taskadence:problem:token-revoked urn:taskadence:problem:insufficient-scope urn:taskadence:problem:test-token-read-only urn:taskadence:problem:token-policy urn:taskadence:problem:url-refused urn:taskadence:problem:mfa-required urn:taskadence:problem:email-unverified urn:taskadence:problem:upload-too-large urn:taskadence:problem:upload-type-not-allowed urn:taskadence:problem:upload-type-mismatch urn:taskadence:problem:upload-rejected

**title**

required

string

**status**

required

integer

**detail**

required

Human-readable explanation (a string; for a 422, the list of validation errors)

**instance**

required

string

**request\_id**

required

string

**errors**

Structured failures: validation errors, or `{loc, msg, allowed}` for a bad parameter

Array<object>

object

**mfa**

On an `mfa-required` problem only: `enrolled` (does the person have an authenticator app set up), `required_for` (`all` or `admins`) and `reason` (`org_policy`: the organization’s requirement; `step_up`: this action needs a second step)

object

**enrolled**

boolean

**required\_for**

string

Allowed values: all admins

**reason**

string

Allowed values: org\_policy step\_up

Example

```json
{
  "type": "about:blank",
  "title": "Forbidden",
  "status": 403,
  "detail": "This task is restricted to other users",
  "instance": "/v1/tasks/T123",
  "request_id": "9b2f1c1e-8c1a-4a53-9f9e-0f5f1f2d7c11",
  "errors": [
    {}
  ],
  "mfa": {
    "enrolled": false,
    "required_for": "all",
    "reason": "org_policy"
  }
}
```

### 503

Registration is closed for now (too many registered clients)

application/problem+json

_Problem_

An RFC 9457 problem details object - the body of every error response. `detail` is the human-readable explanation; `request_id` identifies the request for support.

object

**type**

required

`about:blank` or a `urn:taskadence:problem:*` identifier

string

Allowed values: about:blank urn:taskadence:problem:validation urn:taskadence:problem:invalid-parameter urn:taskadence:problem:precondition-failed urn:taskadence:problem:idempotency-key-reused urn:taskadence:problem:idempotency-key-in-flight urn:taskadence:problem:idempotency-key-invalid urn:taskadence:problem:rate-limit urn:taskadence:problem:internal urn:taskadence:problem:token-invalid urn:taskadence:problem:token-expired urn:taskadence:problem:token-revoked urn:taskadence:problem:insufficient-scope urn:taskadence:problem:test-token-read-only urn:taskadence:problem:token-policy urn:taskadence:problem:url-refused urn:taskadence:problem:mfa-required urn:taskadence:problem:email-unverified urn:taskadence:problem:upload-too-large urn:taskadence:problem:upload-type-not-allowed urn:taskadence:problem:upload-type-mismatch urn:taskadence:problem:upload-rejected

**title**

required

string

**status**

required

integer

**detail**

required

Human-readable explanation (a string; for a 422, the list of validation errors)

**instance**

required

string

**request\_id**

required

string

**errors**

Structured failures: validation errors, or `{loc, msg, allowed}` for a bad parameter

Array<object>

object

**mfa**

On an `mfa-required` problem only: `enrolled` (does the person have an authenticator app set up), `required_for` (`all` or `admins`) and `reason` (`org_policy`: the organization’s requirement; `step_up`: this action needs a second step)

object

**enrolled**

boolean

**required\_for**

string

Allowed values: all admins

**reason**

string

Allowed values: org\_policy step\_up

Example

```json
{
  "type": "about:blank",
  "title": "Forbidden",
  "status": 403,
  "detail": "This task is restricted to other users",
  "instance": "/v1/tasks/T123",
  "request_id": "9b2f1c1e-8c1a-4a53-9f9e-0f5f1f2d7c11",
  "errors": [
    {}
  ],
  "mfa": {
    "enrolled": false,
    "required_for": "all",
    "reason": "org_policy"
  }
}
```

---
Source: https://docs.taskadence.com/reference/operations/oauthregister/
