> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fastcac.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Creating a registration

> The details CAC needs for a Business Name, and how to send them.

A registration starts as a `draft`. Create it with whatever you have, add the rest with `PATCH`,
and submit once `missing_fields` is empty.

```bash theme={null}
curl https://api.fastcac.com/v1/registrations \
  -H "Authorization: Bearer $FASTCAC_KEY" -H "Content-Type: application/json" \
  -d '{"external_id": "order-1181", "proposed_names": ["Ada Foods Ventures"]}'
```

```json Response (201, abridged) theme={null}
{
  "object": "registration",
  "id": "reg_1xYmXxZctd5KQitWBzUCW0",
  "status": "draft",
  "proposed_names": ["ADA FOODS VENTURES"],
  "missing_fields": ["line_of_business", "business.email", "business.address.street_number", "business.address.street", "business.address.city", "business.address.state", "proprietors"],
  ...
}
```

## Fields

**proposed\_names** `string[]` *required*

One or two names, in order of preference, at most 100 characters each. CAC registers the first it
can. Check them first with [name checks](https://docs.fastcac.com/guides/name-checks.md).

**line\_of\_business** `string` *required*

One of [`GET /v1/lines-of-business`](https://docs.fastcac.com/guides/name-checks#line-of-business), exactly as written.

**business** `object` *required*

The business's contact details and principal place of business.

**properties**

**email** `string` *required*

Business email address.

**phone** `string`

Business phone number.

**address** `object` *required*

`street_number`, `street`, `city` and `state` are required; `lga` and `postcode` are optional.

**proprietors** `object[]` *required*

The owners, one to 20. A Business Name with more than one proprietor is a partnership.

**properties**

**first\_name** `string` *required*

**last\_name** `string` *required*

**other\_names** `string`

**gender** `string` *required*

`male` or `female`.

**date\_of\_birth** `string` *required*

`YYYY-MM-DD`. Proprietors must be 18 or older.

**nationality** `string` (default: Nigerian)

Business Name proprietors must be Nigerian.

**nin** `string` *required*

National Identification Number, 11 digits. Checked against the proprietor's name and date of birth after payment.

**email** `string` *required*

**phone** `string` *required*

Digits only (an optional leading `+`), 10 to 15 of them.

**address** `object` *required*

`street_number`, `street`, `city`, `lga`, `state` and a 6-digit `postcode`, all required.

**external\_id** `string`

Your own reference (an order or customer id), up to 255 characters. Filter by it with
`GET /v1/registrations?external_id=…`.

## missing\_fields and validation

While a registration is a `draft`, `missing_fields` lists every required field still empty, as a
path such as `proprietors[0].address.postcode`. Use it to drive your form. Documents aren't in
`missing_fields`; submit tells you about those.

Values are checked when you submit. The error's `param` names the first problem:

```json 400 theme={null}
{
  "error": {
    "type": "invalid_request_error",
    "code": "registration_incomplete",
    "message": "Still needed: proprietors[0].documents.means_of_id, proprietors[0].documents.passport, proprietors[0].documents.signature.",
    "param": "proprietors[0].documents.means_of_id",
    "request_id": "req_g1Kn8cvq7Z4LPBiA0s1rnp2x"
  }
}
```

| Rule | `param` example |
| - | - |
| Business and proprietor emails look like email addresses | `business.email` |
| NIN is 11 digits | `proprietors[0].nin` |
| Phone is 10 to 15 digits | `proprietors[0].phone` |
| Gender is `male` or `female` | `proprietors[0].gender` |
| Date of birth is a real date and the proprietor is 18+ | `proprietors[0].date_of_birth` |
| Postcode is 6 digits | `proprietors[0].address.postcode` |
| Line of business is on CAC's list | `line_of_business` |
| Proprietors are Nigerian | `proprietors[0].nationality` |

## Changing a registration

`PATCH` replaces the fields you send. `business` and `proprietors` are replaced whole, so send the
complete object or list.

```bash theme={null}
curl -X PATCH https://api.fastcac.com/v1/registrations/$REG_ID \
  -H "Authorization: Bearer $FASTCAC_KEY" -H "Content-Type: application/json" \
  -d '{"business": {"email": "hello@adafoods.ng", "phone": "08039876543", "address": {"street_number": "12", "street": "Admiralty Way", "city": "Lekki", "lga": "Eti-Osa", "state": "Lagos", "postcode": "105102"}}}'
```

After submit, the details are locked:

```json 409 theme={null}
{
  "error": {
    "type": "invalid_request_error",
    "code": "registration_locked",
    "message": "A registration can't be changed once it's pending_payment.",
    "param": null,
    "request_id": "req_J7h6lpVfO2cmts5ECBfcbyi0"
  }
}
```

See [editing rules](https://docs.fastcac.com/guides/lifecycle.md#editing-rules) for when changes are allowed again.

## Submitting

```bash theme={null}
curl -X POST https://api.fastcac.com/v1/registrations/$REG_ID/submit \
  -H "Authorization: Bearer $FASTCAC_KEY"
```

A complete draft moves to `pending_payment`. The same call resubmits a registration after
`verification_failed` or a query, with no second payment.

## Personal data

Registrations hold personal data (names, NINs, addresses). Only your organization's keys can read
them, webhook payloads never include it (they carry ids and statuses only), and test-mode data is
never sent to CAC or anywhere else.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.