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

# Identifier Formats

> The accepted formats for email, LinkedIn URL, and phone, and what happens to a value that doesn't match.

## Overview

A contact is identified by an email address, a LinkedIn URL, or a phone number. Each one has a format RevyOps checks before saving it. Below are the accepted formats with examples, and what happens when a value doesn't match, whether it comes in through a CSV import, the public API, or an edit made directly on a contact's record page.

## Email

RevyOps lowercases and trims an email address before saving it. The public API and the record page run no other format check. On CSV import, a value is accepted only if it contains an `@` and at least one `.` after it.

| Value           | Accepted?                                                                                     |
| --------------- | --------------------------------------------------------------------------------------------- |
| `jane@acme.com` | Yes                                                                                           |
| `Jane@Acme.com` | Yes, saved as `jane@acme.com`                                                                 |
| `jane@acme`     | No on CSV import (no `.` after the `@`). Accepted as-is on the public API and the record page |
| `not-an-email`  | No on CSV import. Accepted as-is on the public API and the record page                        |

## LinkedIn URL

A LinkedIn URL is accepted if it contains `linkedin.<tld>/in/<slug>`, with nothing but a scheme, `www.`, or a subdomain in front of `linkedin`, all lowercase. The scheme, any trailing slash, and anything after the slug (query parameters, for example) are stripped, and the URL is saved as `linkedin.com/in/<slug>`.

| Value                                   | Accepted?                                                                              | Saved as                   |
| --------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------- |
| `linkedin.com/in/jane-doe`              | Yes                                                                                    | `linkedin.com/in/jane-doe` |
| `www.linkedin.com/in/jane-doe`          | Yes                                                                                    | `linkedin.com/in/jane-doe` |
| `https://www.linkedin.com/in/jane-doe/` | Yes                                                                                    | `linkedin.com/in/jane-doe` |
| `linkedin.com/in/jane-doe?trk=public`   | Yes                                                                                    | `linkedin.com/in/jane-doe` |
| `https://linkedin.com/in/jane-doe`      | No (`www.` or a subdomain is required in front of `linkedin` when a scheme is present) |                            |
| `https://www.LinkedIn.com/in/jane-doe`  | No (the host must be lowercase)                                                        |                            |
| `linkedin.com/company/acme`             | No (not a `/in/` profile URL)                                                          |                            |

## Phone

A phone number must include a country code, written with a leading `+`. RevyOps parses and validates it, then saves it in E.164 format. A number with no country code is rejected, since there's no default country to assume it belongs to.

| Value               | Accepted?                  | Saved as        |
| ------------------- | -------------------------- | --------------- |
| `+1 (212) 555-1234` | Yes                        | `+12125551234`  |
| `+44 20 7946 0958`  | Yes                        | `+442079460958` |
| `2125551234`        | No (missing country code)  |                 |
| `0044 20 7946 0958` | No (missing a leading `+`) |                 |

## What Happens To A Value That Doesn't Match

What happens next depends on where the value came in:

* **CSV import**: an identifier that doesn't match its format is skipped, and the row still imports using whatever other valid identifiers it has. If none of a row's identifiers are valid, the whole row is skipped.
* **Public API** (`POST` or `PATCH` on `/public/v2/contacts` or `/public/contacts`): a LinkedIn URL or phone that doesn't match is rejected, and the request fails with an error naming the field. An email isn't format-checked on write, so it's saved as given.
* **Record page**: editing an identifier directly on a contact's page follows the same rules as the public API. A LinkedIn URL or phone that doesn't match is rejected and the edit doesn't save.

See [IDs and Lookups](/data-model/ids-and-lookups) for how these identifiers are used to look up a contact, and [Contacts](/data-model/contacts) for the full attribute list.
