# Identifiers Every item operation has an identifier in its URL. Although this identifier is usually a number, it can also be an `UUID`, a date, or the type of your choice. To help with your development experience, we introduced an identifier normalization process. ## Custom Identifier Normalizer > In the following chapter, we're assuming that `App\Uuid` is a project-owned class that manages a time-based UUID. Let's say you have the following class, which is identified by a `UUID` type. In this example, `UUID` is not a simple string but an object with many attributes. ```php getTimestamp() } /** * {@inheritdoc} */ public function supports(string $resourceClass, string $operationName = null, array $context = []): bool { return $resourceClass === Person::class; } } ``` To cover this use case, we need to `denormalize` the identifier to an instance of our `App\Uuid` class. This case is covered by an identifier denormalizer: ```php getMessage()); } } /** * {@inheritdoc} */ public function supportsDenormalization($data, $type, $format = null) { return is_a($type, Uuid::class, true); } } ``` Tag this service as an `api_platform.identifier.denormalizer`: ```xml ``` ```yaml services: App\Identifier\UuidNormalizer: tags: - { name: api_platform.identifier.denormalizer } ``` Your `PersonDataProvider` will now work as expected! ## Supported Identifiers API Platform supports the following identifier types: - `scalar` (string, integer) - `\DateTime` (uses the symfony `DateTimeNormalizer` internally, see [DateTimeIdentifierNormalizer](https://github.com/api-platform/core/blob/master/src/Identifier/Normalizer/DateTimeIdentifierDenormalizer.php)) - `\Ramsey\Uuid\Uuid` (see [UuidNormalizer](https://github.com/api-platform/core/blob/master/src/Bridge/RamseyUuid/Identifier/Normalizer/UuidNormalizer.php))