Simple Scan - PDF Scanner App icon

Simple Scan (com.simplescan.scanner) Data API

Easy inc. · Identity

Simple Scan talks to its cloud backend over a small set of form-encoded calls, all tagged appType=7. Feature flags and byte quotas come from PUT /v1/config/features (fileSyncEnable, ggOcrUsable, cloudFileShareUsable, daily/monthly flow caps). Cloud vault access is minted at PUT /v1/sync/credentials, which returns cloud identityId, identityPoolId, storage bucketName and a short-lived token. After a scan is uploaded, POST /v1/shares/register records the bucketKey and fileSize. Premium is wired through POST /v1/billing/subscriptions and checked at GET /v1/billing/entitlements/lookup via the Play purchaseToken. Account teardown is PUT /v1/account/delete.

Simple Scan is Easy inc.'s camera-to-PDF scanner with a cloud backend for sync, sharing and premium storage. After a Firebase sign-in the client fetches feature flags (file sync, Google OCR, cloud file share), mints short-lived cloud credentials for the user's document vault, registers a scanned PDF as a shareable file, and posts Google Play purchase tokens so the server can unlock premium cloud quotas. Every call carries an appType=7 marker plus device and account identity headers.

Screenshots

  • Simple Scan - PDF Scanner App screenshot 1
  • Simple Scan - PDF Scanner App screenshot 2
  • Simple Scan - PDF Scanner App screenshot 3
  • Simple Scan - PDF Scanner App screenshot 4
  • Simple Scan - PDF Scanner App screenshot 5
  • Simple Scan - PDF Scanner App screenshot 6
  • Simple Scan - PDF Scanner App screenshot 7
  • Simple Scan - PDF Scanner App screenshot 8

API surface

  • Fetch scanner feature flags and sync quotas

    PUT /v1/config/features opendata

    Returns whether cloud sync, Google OCR and file-share are enabled for this device, plus the daily and monthly upload/download byte quotas that gate the scanner's cloud vault.

    Auth: Signed-in Firebase user. Every call sends custom app identity headers: app-version, appType=7, app-type=7, requestTime, systemVersion, phoneModel, uu-id (Firebase UID) and device-id.

    • status
    • message
    • fileSyncEnable
    • cloudFileShareUsable
    • deviceUsable
    • ggOcrUsable
    • dayDownSyncFlow
    • dayUploadSyncFlow
    • monthDownSyncFlow
    • monthUploadSyncFlow

    Illustrative example reconstructed from the app's interface — not a live capture.

    PUT /v1/config/features HTTP/1.1
    app-version: 295
    appType: 7
    app-type: 7
    requestTime: 1758902400000
    systemVersion: Android 14
    phoneModel: Pixel 8
    uu-id: K8f2c1e0AbCdEf123456
    device-id: 3a7c9e12f04b8d11
    {
      "status": 1,
      "message": "ok",
      "data": {
        "fileSyncEnable": 1,
        "cloudFileShareUsable": true,
        "deviceUsable": true,
        "ggOcrUsable": true,
        "dayDownSyncFlow": 5368709120,
        "dayUploadSyncFlow": 5368709120,
        "monthDownSyncFlow": 32212254720,
        "monthUploadSyncFlow": 32212254720
      }
    }

    Derived from the app's interface; endpoint details are illustrative, not a live capture.

    • Reconstructed from the app's cloud feature-toggle and quota flow
    • Matches the configuration payload the client caches before enabling sync, OCR and sharing
  • Mint AWS Cognito token for document sync

    PUT /v1/sync/credentials opendata

    Exchanges a Firebase ID token (and optional Play purchase token) for Cognito identity credentials and the S3 bucket/region used to upload and download scanned PDFs in the user's cloud vault.

    Auth: Firebase ID token posted as token, plus the standard app identity headers (uu-id, device-id, appType=7). Optional Play IAP fields purchaseToken, orderId (GPA order) and productId when the user is on a cloud plan.

    • status
    • message
    • currentTimeMillis
    • bucketName
    • bucketRegionName
    • identityId
    • identityPoolId
    • identityPoolRegionName
    • providerName
    • token
    • tokenExpireTimeMillis
    • dayDownSyncFlow
    • dayUploadSyncFlow
    • monthDownSyncFlow
    • monthUploadSyncFlow
    • appType
    • deviceId
    • purchaseToken
    • orderId
    • productId

    Illustrative example reconstructed from the app's interface — not a live capture.

    PUT /v1/sync/credentials HTTP/1.1
    app-version: 295
    appType: 7
    uu-id: K8f2c1e0AbCdEf123456
    device-id: 3a7c9e12f04b8d11
    Content-Type: application/x-www-form-urlencoded
    
    appType=7&token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...&deviceId=3a7c9e12f04b8d11&purchaseToken=GPA.1234-5678-9012-34567&orderId=GPA.3344-5566-7788-99000&productId=cloud100g_yearly
    {
      "status": 1,
      "message": "ok",
      "currentTimeMillis": 1758902400000,
      "data": {
        "bucketName": "scanner-cloud-vault",
        "bucketRegionName": "us-east-2",
        "identityId": "us-east-2:8f3c1d2e-7a9b-4c5e-9f0a-1b2c3d4e5f6a",
        "identityPoolId": "us-east-2:c0ffee00-1111-2222-3333-444455556666",
        "identityPoolRegionName": "us-east-2",
        "providerName": "cognito-identity.amazonaws.com",
        "token": "eyJraWQiOiJhd3MtY29nbml0by4uLiIsInR5cCI6IkpXVCJ9...",
        "tokenExpireTimeMillis": 1758906000000,
        "dayDownSyncFlow": 5368709120,
        "dayUploadSyncFlow": 5368709120,
        "monthDownSyncFlow": 32212254720,
        "monthUploadSyncFlow": 32212254720
      }
    }

    Derived from the app's interface; endpoint details are illustrative, not a live capture.

    • Reconstructed from the sign-in flow that provisions cloud storage credentials
    • Matches the token exchange the app performs before uploading scanned PDFs
  • Register a scanned PDF share link

    POST /v1/shares/register opendata

    Registers a scanned PDF (cloud storage key plus byte size) as a cloud share after the share-sheet upload, returning whether sharing is enabled and the free vs subscribed storage caps.

    Auth: Anonymous or signed-in Firebase user. Standard app identity headers; body carries userId, deviceId, appType=7.

    • status
    • message
    • currentTimeMillis
    • appType
    • deviceId
    • bucketKey
    • fileSize
    • userId
    • orderId
    • cloudFileShareUsable
    • deviceUsable
    • ggOcrUsable
    • freeStorageSpace
    • subscribeStorageSpace

    Illustrative example reconstructed from the app's interface — not a live capture.

    POST /v1/shares/register HTTP/1.1
    app-version: 295
    appType: 7
    uu-id: K8f2c1e0AbCdEf123456
    device-id: 3a7c9e12f04b8d11
    Content-Type: application/x-www-form-urlencoded
    
    appType=7&deviceId=3a7c9e12f04b8d11&bucketKey=A_K8f2c1e0AbCdEf123456/pdfs/invoice-2026-09-26.pdf&fileSize=842144&userId=K8f2c1e0AbCdEf123456&orderId=GPA.3344-5566-7788-99000
    {
      "status": 1,
      "message": "ok",
      "currentTimeMillis": 1758902400000,
      "data": {
        "cloudFileShareUsable": true,
        "deviceUsable": true,
        "ggOcrUsable": true,
        "cloudFileShareConfiguration": {
          "freeStorageSpace": 50,
          "subscribeStorageSpace": 500
        }
      }
    }

    Derived from the app's interface; endpoint details are illustrative, not a live capture.

    • Reconstructed from the share-sheet upload flow for scanned documents
  • Record a Google Play subscription purchase

    POST /v1/billing/subscriptions openfinance

    Uploads the Play Billing purchaseToken, GPA orderId and Firebase userId so the scanner backend can attach a premium/cloud-storage entitlement to the account.

    Auth: Signed-in Firebase user. Standard app identity headers; body posts userId (Firebase UID), deviceId, purchaseToken and orderId from Play Billing.

    • appType
    • userId
    • orderId
    • purchaseToken
    • accountId
    • deviceId
    • status
    • message

    Illustrative example reconstructed from the app's interface — not a live capture.

    POST /v1/billing/subscriptions HTTP/1.1
    app-version: 295
    appType: 7
    uu-id: K8f2c1e0AbCdEf123456
    device-id: 3a7c9e12f04b8d11
    Content-Type: application/x-www-form-urlencoded
    
    appType=7&userId=K8f2c1e0AbCdEf123456&orderId=GPA.3344-5566-7788-99000&purchaseToken=GPA.1234-5678-9012-34567&accountId=0&deviceId=3a7c9e12f04b8d11
    {
      "status": 1,
      "message": "ok"
    }

    Derived from the app's interface; endpoint details are illustrative, not a live capture.

    • Reconstructed from the premium upgrade flow after Google Play billing completes
  • Verify Play subscription entitlement

    GET /v1/billing/entitlements/lookup openfinance

    Looks up a Google Play subscription by purchase token and returns the SubscriptionPurchase blob (expiryTimeMillis and payment state) used to turn premium/cloud features on or off.

    Auth: Play purchase token as query param token, plus account_id. No Firebase session required on this call.

    • token
    • account_id
    • type
    • SubscriptionPurchase
    • expiryTimeMillis
    • paymentState
    • acknowledgementState
    • orderId
    • purchaseToken

    Illustrative example reconstructed from the app's interface — not a live capture.

    GET /v1/billing/entitlements/lookup?token=GPA.1234-5678-9012-34567&account_id=0 HTTP/1.1
    {
      "type": 1,
      "SubscriptionPurchase": {
        "expiryTimeMillis": "1761494400000",
        "paymentState": 1,
        "acknowledgementState": 1,
        "orderId": "GPA.3344-5566-7788-99000",
        "purchaseToken": "GPA.1234-5678-9012-34567"
      }
    }

    Derived from the app's interface; endpoint details are illustrative, not a live capture.

    • Reconstructed from the subscription status check that gates premium features
  • Delete scanner account

    PUT /v1/account/delete osint

    Deletes the scanner cloud account bound to this Firebase userId, deviceId and push token, wiping the identity used for sync and share-link history.

    Auth: Firebase userId plus deviceId and the stored push token as deviceToken. Standard app identity headers.

    • userId
    • appType
    • deviceToken
    • deviceId
    • status
    • message

    Illustrative example reconstructed from the app's interface — not a live capture.

    PUT /v1/account/delete HTTP/1.1
    app-version: 295
    appType: 7
    uu-id: K8f2c1e0AbCdEf123456
    device-id: 3a7c9e12f04b8d11
    Content-Type: application/x-www-form-urlencoded
    
    userId=K8f2c1e0AbCdEf123456&appType=7&deviceToken=fcm-e0AbCdEf123456&deviceId=3a7c9e12f04b8d11
    {
      "status": 1,
      "message": "ok"
    }

    Derived from the app's interface; endpoint details are illustrative, not a live capture.

    • Reconstructed from the in-app account deletion flow

Data categories

  • cloud-sync
  • document-share
  • entitlements
  • feature-flags
  • device-identity

Where teams use this data

  • Cloud vault credential broker

    A document-management connector calls PUT /v1/sync/credentials with the user's Firebase ID token, then uses the returned identityId, identityPoolId, bucketName and short-lived cloud token to list and pull scanned PDFs from the user's storage vault without opening the app.

  • Share-link intake for back-office OCR

    Intake bots watch POST /v1/shares/register for new bucketKey + fileSize registrations, then fetch the PDF from cloud storage and run downstream OCR or ID-document extraction using the same userId.

  • Premium entitlement audit

    Billing ops verify a device's cloud quota by pairing POST /v1/billing/subscriptions (purchaseToken, orderId, userId) with GET /v1/billing/entitlements/lookup, reading expiryTimeMillis and paymentState before granting 100 GB sync.

  • Account teardown / GDPR wipe

    Support tools call PUT /v1/account/delete with userId, deviceId and deviceToken to drop the cloud identity, then purge the synced vault so the user's stored scan volume is zeroed.

Frequently asked questions

How does Simple Scan authenticate its cloud calls?

Every cloud call sends custom app identity headers: app-version, appType=7, app-type=7, requestTime, systemVersion, phoneModel, uu-id (Firebase UID) and device-id. Sync additionally posts the Firebase ID token as token; the entitlement lookup uses the Play purchase token instead.

Where do scanned PDFs actually live?

PUT /v1/sync/credentials returns bucketName, bucketRegionName, identityPoolId and a short-lived cloud token. The app then uploads pages to cloud object storage; share-sheet files are also copied under a pdfs/ storage path before POST /v1/shares/register records the bucketKey.

Which fields control OCR and cloud-share?

PUT /v1/config/features returns ggOcrUsable, cloudFileShareUsable, deviceUsable and fileSyncEnable, plus dayDownSyncFlow / dayUploadSyncFlow / monthDownSyncFlow / monthUploadSyncFlow. The share-link response repeats those flags and adds freeStorageSpace vs subscribeStorageSpace.

How is a Play subscription turned into cloud quota?

After billing, POST /v1/billing/subscriptions sends purchaseToken, orderId, userId, accountId and deviceId. GET /v1/billing/entitlements/lookup?token=...&account_id=... then returns the expiryTimeMillis and paymentState used to unlock the 10 GB / 100 GB plans.

Topics

  • simple scan api
  • simplescan.scanner cloud sync api
  • simple scan pdf share api
  • simple scan subscription api
  • simple scan document cloud api

Need this app's data API integrated?

We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.

Get a quote