Documentation Base URL: https://mobapi.signme.it/api/v2/SignMeAPI

SignMe Egyptian ID OCR API Documentation

Integrate in 5 minutes. If you can't — we help you, free.

Quick Start


5-minute integration

Two API calls. That's it.

Upload an ID image → get back structured JSON with the full name, national ID number, date of birth, address, and more — in Arabic and English.

1Upload image → get id
2Call Read with id → get data
cURL — full flow
# Step 1 — Upload the ID image
# ID_type: 0 = National ID front / Driver / Car License  |  1 = National ID back  |  2 = Passport
curl -X POST 'https://mobapi.signme.it/api/v2/SignMeAPI/uploadImage?ID_type=0' \
  -H 'APIKEY: YOUR_API_KEY' \
  -F 'file=@national_id.jpg'

# → { "code": 200, "status": "success", "message": "Successful.", "id": "896702" }

# Step 2 — Read the result (wait 1–2s first)
curl 'https://mobapi.signme.it/api/v2/SignMeAPI/ReadImage?id=896702&isBlocked=false' \
  -H 'APIKEY: YOUR_API_KEY'

Authentication


Add your API key to every request as the APIKEY header. Get yours on the API Keys page — it's free.

APIKEY: YOUR_API_KEY

Step 1 — Upload Image


POST /uploadImage?ID_type=0

Send the ID image as multipart/form-data with the field named file. You'll get back a numeric id — save it for the next step.

Use the ID_type query parameter to tell the engine which side or document type you are uploading:

ID_typeDocument
0 (default) Egyptian National ID — front side · Driver License · Car License
1 Egyptian National ID — back side
2 Passport · Resident Permit
Request
# ID_type: 0 = National ID front / Driver / Car License  |  1 = National ID back  |  2 = Passport
curl -X POST 'https://mobapi.signme.it/api/v2/SignMeAPI/uploadImage?ID_type=0' \
  -H 'APIKEY: YOUR_API_KEY' \
  -F 'file=@/path/to/national_id.jpg'
Response
{
  "code":    200,
  "status":  "success",
  "id":      "896702"
}
Save the id value (e.g. "896702") — you need it in the next step. It is not the filename.

Step 2 — Read Result


GET /ReadImage?id=896702&isBlocked=false

Pass the id from Step 1. The OCR engine typically processes in 2–5 seconds — each API call returns in under 400ms, and the OCR engine processes asynchronously. If data comes back empty, wait a second and retry. See the for a ready-to-paste polling loop.

Request
curl 'https://mobapi.signme.it/api/v2/SignMeAPI/ReadImage?id=896702&isBlocked=false' \
  -H 'APIKEY: YOUR_API_KEY'
Response
{
  "code":    200,
  "status":  "success",
  "message": "Successful.",
  "data": {
    "firstname":   "محمود",
    "lastname":    "عماد حسنين حسين احمد",
    "national_ID": "29612160101819",
    "birthday":    "16/12/1996",
    "gender":      "ذكر",
    "city":        "القاهرة",
    "address1":    "ق 5217 هضبه وسطي المقطم القاهره",
    "address2":    "",
    "religion":    "",
    "status":      "",
    "job":         "",
    "issueDate":   "",
    "expiry":      "",
    "releseCity":  "",
    "platenumber": "",
    "passportType":"",
    "gender_2":    "",
    "proccesstime":"29/04/2026 23:49:26:4926",
    "imageName":   "490131.png",
    "savedImage":  "290426\\2349264926.jpg",
    "urlImage":    null
  }
}

Full Integration Example


Copy and paste. Handles the full flow — upload, wait, retry, done.

const BASE = 'https://mobapi.signme.it/api/v2/SignMeAPI';

// ID_type: 0 = National ID front / Driver / Car License (default)
//          1 = National ID back
//          2 = Passport / Resident Permit
async function extractId(apiKey, imageFile, idType = 0) {
  // 1. Upload
  const form = new FormData();
  form.append('file', imageFile);
  const { id } = await fetch(`${BASE}/uploadImage?ID_type=${idType}`, {
    method: 'POST',
    headers: { 'APIKEY': apiKey },
    body: form,
  }).then(r => r.json());

  // 2. Poll until data is ready (max 12 attempts)
  await delay(2000);
  for (let i = 0; i < 12; i++) {
    const { data } = await fetch(
      `${BASE}/ReadImage?id=${id}&isBlocked=false`,
      { headers: { 'APIKEY': apiKey } }
    ).then(r => r.json());

    if (data && Object.keys(data).length) return data;
    await delay(1500);
  }
  throw new Error('Timeout — please try again.');
}

const delay = ms => new Promise(r => setTimeout(r, ms));

// Usage:
const data = await extractId('YOUR_API_KEY', fileInput.files[0], 0);
console.log(data.firstname, data.national_ID);

Still stuck after 5 minutes?

Our team will integrate it for you — free of charge. Just send us a message.

Response Fields


All fields returned inside the data object.

FieldTypeDescription
firstname string First name in Arabic.
lastname string Last name / full remaining name in Arabic.
national_ID string 14-digit national ID number.
birthday string Date of birth — DD/MM/YYYY.
gender string Gender in Arabic (ذكر / أنثى).
city string City of residence in Arabic.
address1 string Primary address line in Arabic.
address2 string Secondary address line (may be empty).
religion string Religion as printed on the ID (may be empty).
status string Marital status (may be empty).
job string Occupation (may be empty).
issueDate string Document issue date (may be empty).
expiry string Document expiry date (may be empty).
releseCity string City of document release (may be empty).
platenumber string Plate number — populated for vehicle licenses.
passportType string Passport type — populated for passports.
gender_2 string Secondary gender field (may be empty).
proccesstime string Server-side processing timestamp.
imageName string Filename assigned to the uploaded image.
savedImage string Relative path of the saved image on the server.
urlImage string? Public URL of the image, or null.

Errors


HTTP CodeMeaning
200 Success. Check data — if empty, image still processing; retry after 1–2s.
400 Bad request — missing file or wrong field name (must be "file").
401 Unauthorized — APIKEY header missing or invalid.
403 ID not found — check the id value from the upload response.
413 File too large — maximum 10 MB.
500 Server error — retry once, then contact support if it persists.
Error response shape
{ "code": 401, "message": "Unauthorized" }