National Health AuthorityNHA Docs

Command Palette

Search for a command to run...

ABHA Address

Create an ABHA address, link it to an ABHA number, log in to a PHR app, and manage the profile.

Use an ABHA address as the patient handle for HIE-CM. Use an ABHA number as the KYC verified identity.

A PHR app can create an ABHA address by mobile number or by ABHA number. The mobile flow creates a self-declared profile. The ABHA number flow uses KYC data from the ABHA system.

OCR source caveat

The source includes OCR from screenshots for some JSON blocks. The examples below use the official Swagger paths where available. Verify the final schema in the sandbox Swagger.

ABHA address rules

RuleRequirement
Allowed charactersUse letters, digits, and dot (.).
Minimum lengthUse at least 4 characters before the domain.
First characterDo not start with a number.
Dot positionDo not start or end with dot (.).
Mobile numberDo not create 10digit@abdm.
ABHA number formUse all numeric 14digit@abdm only for an ABHA number.
PasswordUse at least 8 characters, upper case, lower case, number, and symbol.

Create by mobile number

Use this flow when the patient does not use KYC. Create the profile from self-declared details.

sequenceDiagram
  participant User as Patient
  participant App as PHR app
  participant ABHA as ABHA service
  User->>App: Enter mobile number
  App->>ABHA: POST enrollment/request/otp
  ABHA-->>App: txnId
  User->>App: Enter OTP
  App->>ABHA: POST enrollment/verify
  ABHA-->>App: verified transaction
  App->>ABHA: POST enrollment/suggestion
  ABHA-->>App: ABHA address suggestions
  User->>App: Choose ABHA address and password
  App->>ABHA: POST enrollment/enrol
  ABHA-->>App: ABHA address profile

Request the mobile OTP

Send an encrypted mobile number. Use abha-address-enrol scope for a self-declared profile.

Request mobile OTP
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/enrollment/request/otp" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <your-access-token>" \
  -d '{
    "scope": ["abha-address-enrol", "mobile-verify"],
    "loginHint": "mobile",
    "loginId": "<encrypted-mobile-number>",
    "otpSystem": "abdm"
  }'
Response
{
  "txnId": "8c3f3d24-3e63-4d9b-8c36-4fa7b4d72e84",
  "message": "OTP sent successfully"
}

Check scope values

The archived DOCX names the OTP endpoint. Its screenshot does not show the mobile scope clearly. Use the current Swagger scope values for your environment.

Verify the OTP

Send the encrypted OTP with the txnId.

Verify OTP
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/enrollment/verify" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <your-access-token>" \
  -d '{
    "authData": {
      "authMethods": ["otp"],
      "otp": {
        "txnId": "8c3f3d24-3e63-4d9b-8c36-4fa7b4d72e84",
        "otpValue": "<encrypted-otp>"
      }
    },
    "scope": ["abha-address-enrol", "mobile-verify"]
  }'
Response
{
  "txnId": "8c3f3d24-3e63-4d9b-8c36-4fa7b4d72e84",
  "authResult": "success"
}

Get ABHA address suggestions

Show suggestions from the patient's name and birth details.

Get suggestions
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/enrollment/suggestion" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <your-access-token>" \
  -d '{
    "txnId": "8c3f3d24-3e63-4d9b-8c36-4fa7b4d72e84",
    "firstName": "John",
    "lastName": "Doe",
    "dayOfBirth": "14",
    "monthOfBirth": "11",
    "yearOfBirth": "1998"
  }'
Response
{
  "abhaAddressList": ["john.doe@sbx", "johndoe1998@sbx"]
}

Create the ABHA address

Create the self-declared profile. Ask the patient to accept the user information agreement first.

Create ABHA address
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/enrollment/enrol" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <your-access-token>" \
  -d '{
    "txnId": "8c3f3d24-3e63-4d9b-8c36-4fa7b4d72e84",
    "phrDetails": {
      "abhaAddress": "john.doe@sbx",
      "firstName": "John",
      "middleName": "",
      "lastName": "Doe",
      "dayOfBirth": "14",
      "monthOfBirth": "11",
      "yearOfBirth": "1998",
      "gender": "M",
      "mobile": "<encrypted-mobile-number>",
      "email": "<encrypted-email>",
      "address": "Street number 5",
      "stateCode": "27",
      "stateName": "Maharashtra",
      "districtCode": "123",
      "districtName": "Nashik",
      "pinCode": "422003",
      "password": "<encrypted-password>",
      "profilePhoto": "<base64-profile-photo>"
    }
  }'
Response
{
  "abhaAddress": "john.doe@sbx",
  "profile": {
    "firstName": "John",
    "lastName": "Doe",
    "kycStatus": "SELF_DECLARED"
  }
}

Create by ABHA number

Use this flow when the patient has a 14-digit ABHA number. Fetch profile details from the ABHA system after OTP verification.

Request an ABHA number OTP

Send the encrypted ABHA number. Choose Aadhaar OTP or mobile OTP as the otpSystem.

Request ABHA number OTP
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/enrollment/request/otp" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <your-access-token>" \
  -d '{
    "scope": ["abha-login", "aadhaar-verify"],
    "loginHint": "abha-number",
    "loginId": "<encrypted-abha-number>",
    "otpSystem": "aadhaar"
  }'
Response
{
  "txnId": "7f879c1d-8f1d-4de4-81c4-1f9b2d1a6f10",
  "message": "OTP sent successfully"
}

Verify and create

Use the same verify and enrol endpoints. Show KYC fields from the ABHA system. Then let the patient choose a new ABHA address and password.

Verify ABHA number OTP
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/enrollment/verify" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <your-access-token>" \
  -d '{
    "authData": {
      "authMethods": ["otp"],
      "otp": {
        "txnId": "7f879c1d-8f1d-4de4-81c4-1f9b2d1a6f10",
        "otpValue": "<encrypted-otp>"
      }
    },
    "scope": ["abha-login", "aadhaar-verify"]
  }'
Response
{
  "txnId": "7f879c1d-8f1d-4de4-81c4-1f9b2d1a6f10",
  "authResult": "success",
  "accounts": [
    {
      "abhaNumber": "91-7507-6821-7770",
      "name": "John Doe",
      "gender": "M",
      "yearOfBirth": "1998"
    }
  ]
}

Creation test checks

CheckMobile flowABHA number flow
Registration optionShow mobile number option.Show ABHA number option.
OTP resendEnable after 60 seconds.Enable after 60 seconds.
Existing address listShow linked ABHA addresses.Show linked ABHA addresses.
Profile dataAsk for self-declared data.Auto-fill KYC data.
ConsentAsk for the user information agreement.Ask for the user information agreement.
PasswordEnforce the password rule.Enforce the password rule.
SuccessShow a created message.Show a created message and login action.

Link the self-declared ABHA address when the patient needs KYC verified status. After a successful link, show the ABHA number on the profile. Change the status from Self Declared to KYC Verified.

Link ABHA address
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/login/profile/link" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <phr-login-token>" \
  -d '{
    "action": "LINK",
    "transactionId": "7f879c1d-8f1d-4de4-81c4-1f9b2d1a6f10"
  }'
Response
{
  "message": "ABHA number is securely linked to ABHA address",
  "authResult": "success"
}

End the current session

The source says the service invalidates the current session after a successful link. Redirect the patient to login again.

Log in to the PHR app

Support login by mobile number, ABHA address, default ABHA address, and ABHA number. Allow password, mobile OTP, or Aadhaar OTP where the auth method applies. Store the refresh token securely if your app extends a session.

Search auth methods

Search login methods
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/login/search" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <your-access-token>" \
  -d '{
    "abhaAddress": "john.doe@sbx"
  }'
Response
{
  "authMethods": ["MOBILE_OTP", "PASSWORD"],
  "abhaAddress": "john.doe@sbx"
}

Request the login OTP

Request login OTP
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/login/request/otp" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <your-access-token>" \
  -d '{
    "loginHint": "abha-address-login",
    "loginId": "<encrypted-abha-address>",
    "otpSystem": "abdm",
    "scope": ["abha-address-login", "mobile-verify"]
  }'
Response
{
  "txnId": "376b4812-74b2-4ad8-b8aa-2872d85c67e1",
  "message": "OTP sent successfully"
}

Verify login

Verify login
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/login/verify" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <your-access-token>" \
  -d '{
    "authData": {
      "authMethods": ["otp"],
      "otp": {
        "txnId": "376b4812-74b2-4ad8-b8aa-2872d85c67e1",
        "otpValue": "<encrypted-otp>"
      }
    },
    "scope": ["abha-address-login", "mobile-verify"]
  }'
Response
{
  "token": "<phr-login-token>",
  "refreshToken": "<phr-refresh-token>",
  "abhaAddress": "john.doe@sbx"
}

Manage the profile

Show the profile after login. Show the QR code and ABHA address card. Allow password change and profile photo upload.

Profile typeShowAllow updates
KYC VerifiedABHA number, ABHA address, KYC status, QR code, and demographics.Mobile number and address.
Self DeclaredABHA address, self-declared status, QR code, and demographics.Photo, name, gender, DOB, mobile number, and address.
Get profile
curl -X GET "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/login/profile" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <phr-login-token>"
Response
{
  "abhaAddress": "john.doe@sbx",
  "abhaNumber": "91-7507-6821-7770",
  "firstName": "John",
  "lastName": "Doe",
  "gender": "M",
  "yearOfBirth": "1998",
  "kycStatus": "KYC_VERIFIED"
}
Update profile
curl -X POST "https://abhasbx.abdm.gov.in/abha/api/v3/phr/app/login/profile/updateProfile" \
  -H "Content-Type: application/json" \
  -H "REQUEST-ID: $(uuidgen | tr 'A-Z' 'a-z')" \
  -H "TIMESTAMP: $(date -u +%Y-%m-%dT%H:%M:%S.000Z)" \
  -H "Authorization: Bearer <phr-login-token>" \
  -d '{
    "address": "Street number 5",
    "dayOfBirth": "14",
    "districtCode": "123",
    "districtName": "Nashik",
    "email": "",
    "firstName": "John",
    "gender": "M",
    "lastName": "Doe",
    "middleName": "",
    "mobile": "XXXXXX1234",
    "monthOfBirth": "11",
    "pinCode": "422003",
    "profilePhoto": "<base64-profile-photo>",
    "stateCode": "27",
    "stateName": "Maharashtra",
    "yearOfBirth": "1998"
  }'
Response
{
  "message": "Profile updated successfully"
}

Sources

  • ABDM PHR app documentation (DOCX→MD, 2026-08)