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

# Create a contact

> Creates a contact in your team. Any keys beyond the standard fields are stored as custom contact properties. If `campaignId` is provided, the new contact is also enrolled into that campaign on a best-effort basis — enrollment failures are logged but do not fail this request, so verify enrollment separately for critical flows. (`POST /api/campaigns/contact-enrollments` also creates the contact and attempts enrollment in one call; enrollment there is likewise best-effort.) The target campaign must be active.

Duplicate contacts (same identifying fields within the team) are rejected with `400 Contact existed`.



## OpenAPI

````yaml /api-reference/openapi.json post /api/contacts
openapi: 3.1.0
info:
  title: Revve AI API
  description: >-
    Endpoints for integrating your own systems with Revve — enrolling contacts
    into campaigns from your CRM, core banking system, or any external source.
  version: 1.0.0
servers:
  - url: https://app.revve.ai
security:
  - bearerApiKey: []
paths:
  /api/contacts:
    post:
      summary: Create a contact
      description: >-
        Creates a contact in your team. Any keys beyond the standard fields are
        stored as custom contact properties. If `campaignId` is provided, the
        new contact is also enrolled into that campaign on a best-effort basis —
        enrollment failures are logged but do not fail this request, so verify
        enrollment separately for critical flows. (`POST
        /api/campaigns/contact-enrollments` also creates the contact and
        attempts enrollment in one call; enrollment there is likewise
        best-effort.) The target campaign must be active.


        Duplicate contacts (same identifying fields within the team) are
        rejected with `400 Contact existed`.
      operationId: createContact
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - phoneNumber
                - teamId
              properties:
                phoneNumber:
                  type: string
                  description: The contact's phone number. Required.
                  example: '+84775352590'
                teamId:
                  type: string
                  format: uuid
                  description: Your team ID. Must match the team the API key belongs to.
                name:
                  type: string
                  description: Full name.
                  example: Jane Doe
                email:
                  type: string
                  format: email
                companyName:
                  type: string
                campaignId:
                  type: string
                  format: uuid
                  description: >-
                    Optional. Enrolls the created contact into this active
                    campaign (best-effort — a failed enrollment does not fail
                    the request).
              additionalProperties:
                description: Any additional keys are stored as custom contact properties.
      responses:
        '200':
          description: Contact created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: >-
                      Contact 123e4567-e89b-12d3-a456-426614174000 created
                      successfully
                  contactId:
                    type: string
                    format: uuid
        '400':
          description: >-
            Missing required fields, or the contact already exists (`Contact
            existed`).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Contact existed
        '401':
          description: Missing authorization header or invalid API key.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Invalid API key
        '500':
          description: >-
            Contact insert failed (`Failed to create contact`) or an unexpected
            error occurred (`Internal server error`).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Internal server error
components:
  securitySchemes:
    bearerApiKey:
      type: http
      scheme: bearer
      description: >-
        Pass your team's API key as a Bearer token: `Authorization: Bearer
        YOUR_API_KEY`. Find your API key in the dashboard under Settings. The
        key must belong to the same team as the `teamId` in the request body.

````