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

# Personalized entry requirements

> Returns the most specific entry requirement applicable to a traveler with `fromCountryId` passport visiting `toCountryId`. Falls back from country-specific to general rules. The response wraps the requirement with an `applicabilityContext` describing why it matched.



## OpenAPI

````yaml GET /entry-requirements/personalized
openapi: 3.1.0
info:
  title: Ceibo API
  description: >-
    Travel platform data API: countries, cities, points of interest, walking
    tours, and entry requirements.
  version: 1.0.0
  contact:
    name: Ceibo Support
    email: support@ceibo.me
    url: https://developer.ceibo.me
servers:
  - url: https://api.ceibo.me/v1
    description: Production
security:
  - apiKey: []
paths:
  /entry-requirements/personalized:
    get:
      summary: Get personalized entry requirements
      description: >-
        Returns the most specific entry requirement applicable to a traveler
        with `fromCountryId` passport visiting `toCountryId`. Falls back from
        country-specific to general rules. The response wraps the requirement
        with an `applicabilityContext` describing why it matched.
      parameters:
        - name: fromCountryId
          in: query
          required: true
          description: Traveler's passport country.
          schema:
            type: integer
        - name: toCountryId
          in: query
          required: true
          description: Destination country.
          schema:
            type: integer
        - name: cityId
          in: query
          required: false
          description: >-
            Destination city — narrows to city-specific requirements when
            present.
          schema:
            type: integer
        - name: languageId
          in: query
          required: false
          schema:
            type: integer
        - name: locale
          in: query
          required: false
          schema:
            type: string
      responses:
        '200':
          description: Applicable requirement plus context.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonalizedEntryRequirements'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    PersonalizedEntryRequirements:
      type: object
      required:
        - applicabilityContext
      properties:
        requirement:
          anyOf:
            - $ref: '#/components/schemas/EntryRequirement'
            - type: 'null'
        applicabilityContext:
          type: object
          required:
            - isFromMercosur
            - countryGroups
          properties:
            isFromMercosur:
              type: boolean
            countryGroups:
              type: array
              items:
                type: object
                required:
                  - code
                  - name
                properties:
                  code:
                    type: string
                    example: mercosur
                  name:
                    type: string
                    example: MERCOSUR
        translationMeta:
          anyOf:
            - type: object
              required:
                - languageId
                - isFallback
              properties:
                languageId:
                  type: integer
                isFallback:
                  type: boolean
            - type: 'null'
    EntryRequirement:
      type: object
      required:
        - id
        - priority
        - customsDeclarationRequired
        - createdAt
        - updatedAt
      properties:
        id:
          type: integer
          example: 1
        fromCountryId:
          type:
            - integer
            - 'null'
          description: >-
            Origin country. `null` means the rule applies to all travelers
            (general).
        fromCountryGroupId:
          type:
            - integer
            - 'null'
        toCountryId:
          type:
            - integer
            - 'null'
        toCountryGroupId:
          type:
            - integer
            - 'null'
        priority:
          type: integer
          minimum: 0
          description: Higher = more specific. Used to resolve overlapping rules.
        documentValidity:
          anyOf:
            - $ref: '#/components/schemas/DocumentValidity'
            - type: 'null'
        proofOfFunds:
          anyOf:
            - $ref: '#/components/schemas/EnforcementLevel'
            - type: 'null'
        proofOfFundsDetails:
          type:
            - string
            - 'null'
        proofOfFundsAmountUsd:
          type:
            - number
            - 'null'
        proofOfFundsSourceUrl:
          type:
            - string
            - 'null'
        proofOfFundsAmountLocal:
          type:
            - number
            - 'null'
        proofOfFundsCurrencyId:
          type:
            - integer
            - 'null'
        returnTicket:
          anyOf:
            - $ref: '#/components/schemas/EnforcementLevel'
            - type: 'null'
        returnTicketDetails:
          type:
            - string
            - 'null'
        returnTicketSourceUrl:
          type:
            - string
            - 'null'
        healthInsurance:
          anyOf:
            - $ref: '#/components/schemas/EnforcementLevel'
            - type: 'null'
        healthInsuranceDetails:
          type:
            - string
            - 'null'
        healthInsuranceCoverageUsd:
          type:
            - number
            - 'null'
        healthInsuranceSourceUrl:
          type:
            - string
            - 'null'
        customsDeclarationRequired:
          type: boolean
        customsDeclarationDetails:
          type:
            - string
            - 'null'
        customsDeclarationUrl:
          type:
            - string
            - 'null'
        proofOfAccommodation:
          anyOf:
            - $ref: '#/components/schemas/EnforcementLevel'
            - type: 'null'
        proofOfAccommodationDetails:
          type:
            - string
            - 'null'
        proofOfAccommodationSourceUrl:
          type:
            - string
            - 'null'
        visaRequirementType:
          anyOf:
            - $ref: '#/components/schemas/VisaRequirementType'
            - type: 'null'
        maxStayDays:
          type:
            - integer
            - 'null'
          example: 90
        generalNotes:
          type:
            - string
            - 'null'
        sourceUrl:
          type:
            - string
            - 'null'
        officialWebsiteUrl:
          type:
            - string
            - 'null'
        visaApplicationUrl:
          type:
            - string
            - 'null'
        visaProcessingDays:
          type:
            - integer
            - 'null'
          minimum: 1
          maximum: 365
        lastVerifiedAt:
          type:
            - string
            - 'null'
          format: date-time
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    Error:
      type: object
      required:
        - statusCode
        - code
        - message
        - timestamp
        - path
      properties:
        statusCode:
          type: integer
          example: 404
        code:
          type: string
          example: NOT_FOUND
        message:
          type: string
          example: Country with id 9999 not found
        timestamp:
          type: string
          format: date-time
          example: '2026-04-30T10:00:00.000Z'
        path:
          type: string
          example: /v1/countries/9999
    DocumentValidity:
      type: object
      properties:
        minimumDays:
          type: integer
          example: 180
    EnforcementLevel:
      type: string
      enum:
        - required
        - recommended
        - may_be_asked
        - not_required
      description: >-
        Captures both whether a requirement exists and how strictly it is
        enforced at the border.
    VisaRequirementType:
      type: string
      enum:
        - visa_free
        - visa_on_arrival
        - e_visa
        - visa_required
        - eta
        - not_allowed
  responses:
    BadRequest:
      description: Validation failed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Missing, malformed, revoked, or unknown API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Resource does not exist.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: API key minted at developer.ceibo.me. Send on every request.

````