Users

Following, we have all information related to users management, like creating or editing an user, and many others operations.

Login / Logout

First, we describe how to login an user into your instance

method: POST
URL: /sessions.json

PARAMETERS:
If Regular User:
{
  "session": {
    "login": "EMAIL",
    "password": "PASSWORD"
  }
}
If Facebook User:
{
  "session": {
    "access_token": "FACEBOOK TOKEN | FIREBASE TOKEN"
    "provider": "facebook|google"
  }
}
RETURN:
{
  "status": true/false, # status_code 200/401
  "message": "ERROR MESSAGE" # If "status" = false
}

Logout

method: POST
URL: /signout.json

JWT authentication flow

You should always have valid JWT refresh and access tokens. You should store the tokens and their expiration times, e.g., in the browser localStorage.

1. Access token

Example of an access token value:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInR5cCI6ImFjYyIsInZlciI6NCwiZXhwIjoxNjQ1MjgyNDI0fQ.9C9gPWiV4qQks7fa4wPs6gCkaOi4qJPzcol2j9nFWEs

1.1. If you don’t have an access token or the access token has expired

You need to generate an access token. See Item 1.3.

1.2. If you already have an access token

Use the access_token in the Authorization header in every request that needs authorization.

Example of a Bearer token authorization header:

headers['Authorization'] = 'Bearer {access_token}'

If you get status code 401, you need to update the access token. See Item 1.3.

Below is an example of a response for an unauthorized request:

– Status code: 401
– Body:

RESPONSE:
{
  "error": "Not Authorized"
}

1.3. Generating an access token

1.3.1. If you don’t have a refresh token or the refresh token has expired

You need to generate a refresh token. See Item 2.1.

1.3.2. If you already have an refresh token

method: POST
URL: /api_update_token.json
Headers:
‘Authorization’: ‘Bearer {refresh_token}’

If the refresh token is valid, the response should be:

– Status code: 200
– Body:

RESPONSE:
{
  "access_token": "{access_token}",
  "access_token_expiration": "YYYY-MM-ddTHH:mm:ss.SSSZ",
  "user": "{user_id}-{user_name}"
}

In case of failure:

– Status code: 401
– Body:

RESPONSE:
{
  "error": true
}

You need to update the refresh token. See Item 2.1.

2. Refresh token

Example of a refresh token value:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInR5cCI6InJlZiIsInZlciI6NCwiZXhwIjoxNjYwODM0NDI0fQ.8myc8tz0gUU-gRg8fx6gmvjWFydi1T_MzYt1pq-aQe4

2.1. Generating/updating the refresh token

method: POST
URL: /api_authenticate.json

– Parameters:
‘email={email}&password={password}’
or
‘key={KEY}&hardware_id={hardware_id}&device_type={device_type}’

Valid device types: [“androidbox”, “androidtv”, “appletv”, “firetv”, “lgtv”, “roku”, “samsungtv”]

In case of success:
– Status code: 200
– Body:

RESPONSE:
{
  "refresh_token": "{refresh_token}",
  "refresh_token_expiration": "YYYY-MM-ddTHH:mm:ss.SSSZ",
  "access_token": "{access_token}",
  "access_token_expiration": "YYYY-MM-ddTHH:mm:ss.SSSZ",
  "user": "{user_id}-{user_name}"
}

In case of failure:
– Status code: 401
– Body:

RESPONSE:
{
  "error": true
}

3. Logout

The app should manage the device logout. For example, it can delete the current refresh and access tokens. This way, if the tokens don’t exist, the user should not be considered logged in.

If you need to destroy other sessions (i.e., invalidate the tokens of everyone that is using the same user account regardless of the tokens being used) or if you need to deactivate the previously enabled device:

method: POST
URL: /api_signout.json
Headers:
‘Authorization’: ‘Bearer {refresh_token}’

Parameters:
– [optional] ‘revoke_token=1’ to invalidate all the current user tokens
– [optional] ‘hardware_id={hardware_id}&device_type={device_type}’ to deactivate the device
– [optional] ‘update_token=1’ to obtain new valid tokens

In case of success:

– Status code: 200
– Body:

RESPONSE:
{
  "user": "{user_id}-{user_name}",
  "refresh_token": "{refresh_token}",
  "refresh_token_expiration": "YYYY-MM-ddTHH:mm:ss.SSSZ",
  "access_token": "{access_token}",
  "access_token_expiration": "YYYY-MM-ddTHH:mm:ss.SSSZ"
}

In case of failure:

– Status code: 401
– Body:

RESPONSE:
{
  "error": true
}
New Regular User

Next, you can follow 3 steps to create a new user:

1) Request Form (with possible Custom Fields)

method: GET
URL: /management/users/new.json

PARAMETERS:
RETURN:
{
  "user": {
    "id": null,
    "name": null,
    "email": null,
    "language": "LANGUAGE", # "en","pt","es"
    "properties": [ # If exist custom fields
      {
        "id": null,
        "custom_field_id": ID,
        "value": null
      }
    ]
  },
  "custom_fields": [ # If exist custom fields
    {
      "id": ID,
      "name": "NAME",
      "field_name": {
        "en": "FIELD NAME IN ENGLISH",
        "pt": "FIELD NAME IN PORTUGUESE"
      },
      "field_type": "FIELD TYPE", # "text_box","date_picker","check_box","radio_button","combo_box"
      "field_values": [ # If "field_type" = "check_box","radio_button","combo_box"
        {
          "en": "OPTION VALUE IN ENGLISH",
          "pt": "OPTION VALUE IN PORTUGUESE",
          “parent_value”: “PARENT'S VALUE POSITION”
        }
      ],
      "required": true/false,
      "model_name": "User",
      “parent_id”: ID # Parent's ID
    }
  ]
}

2) Submit Form (with possible Custom Fields) # Show terms

method: POST
URL: /management/users.json

PARAMETERS:
{
  "user": {
    "name": "NAME",
    "email": "EMAIL",
    "email_confirmation": "EMAIL",
    "password": "PASSWORD",
    "password_confirmation": "PASSWORD",
    "permission": "user",
    "language": "LANGUAGE", # "en","pt","es"
    "user_file": "IMAGE",
    "properties_attributes": { # If exist custom fields
      "INDEX": { # 0,1,2,...
        "custom_field_id": "ID"
        "value": "POSITION", # "check_box" = “” or “|1|” or "|1||2|" or ..., "radio_button","combo_box" = "1" or "2" or ..., "date_picker" = "yyyy-mm-dd"
      }
    }
  }
}
RETURN:
{
  "status": true/false, # status_code 200/400
  "errors": { # caso "status" = false
    "user": {
      "FIELD": [ # "name","email","password","properties.value"
        "ERROR MESSAGE"
      ],
      "properties": [ # If exist custom fields
        {
          "custom_field_id": ID,
          "errors": {
            "value": [
              "ERROR MESSAGE"
            ]
          }
        }
      ]
    }
  }
}

3) Email verification

method: PUT
URL: /email_verifies/ID.json # ID = 4 digit code sent by email

PARAMETERS:
{
  "user": {
    "password": "PASSWORD",
  }
}
RETURN:
{
  "status": true/false, # status_code 200/400,401
  "error": "ERROR MESSAGE" # If "status" = false
}
Facebook User

EITV CLoud allows using Facebook as a source for user information sharing, like name and email. Using this feature a instance can create and login users using their Facebook credentials, with no password need for EiTV Cloud.

Following, we have all documentation for integration.

First, we check if there are an user with a given Facebook Token and check if Custom Fields are enabled

method: GET
URL: /sessions/new.json

PARAMETERS:
{
  "access_token": "FACEBOOK TOKEN | FIREBASE TOKEN"
  "provider": "facebook|google"
}
RETURN:
{
  "user":true/false,
  "custom_fields":true/false
}

Create New User if Custom Fields are disabled

method: POST
URL: /sessions.json

PARAMETERS:
{
  "session": {
    "access_token": "FACEBOOK TOKEN | FIREBASE TOKEN"
    "provider": "facebook|google"
  }
}
RETURN:
{
  "status": true/false, # status_code 200/401
  "message": "ERROR MESSAGE" # If "status" = false
}
New Facebook User with Custom Fields

1) Request a form with Custom Fields

method: GET
URL: /management/users/new.json

PARAMETERS:
RETURN:
{
  "user": {
    "id": null,
    "name": null,
    "email": null,
    "language": "LANGUAGE", # "en","pt","es"
    "properties": [ # Custom Fileds
        {
          "id": null,
          "custom_field_id": ID,
          "value": null
        }
    ]
  },
  "custom_fields": [ # Custom Fileds
    {
      "id": ID,
      "name": "NOME",
      "field_name": {
        "en": "FIELD NAME IN ENGLISH",
        "pt": "FIELD NAME IN PORTUGUESE"
      },
      "field_type": "FIELD TYPE", # "text_box","date_picker","check_box","radio_button","combo_box"
      "field_values": [ # If "field_type" = "check_box","radio_button","combo_box"
        {
          "en": "OPTION VALUE IN ENGLISH",
          "pt": "OPTION VALUE IN PORTUGUESE",
          “parent_value”: “PARENT'S VALUE POSITION”
        }
      ],
      "required": true/false,
      "model_name": "User",
      “parent_id”: ID # Parent's ID
    }
  ]
}

2) Submit a form with Custom Fields

method: POST
URL: /management/users.json

PARAMETERS:
{
  "user": { # não enviar "name","email","email_confirmation","password","password_confirmation"
    "access_token": "FACEBOOK TOKEN | FIREBASE TOKEN"
    "provider": "facebook|google"
    "permission": "user",
    "language": "LANGUAGE", # "en","pt","es"
    "properties_attributes": { # Custom fields
      "INDEX": { # 0,1,2,...
        "custom_field_id": "ID"
        "value": "POSITION", # "check_box" = “” or “|1|” or "|1||2|" or ..., "radio_button","combo_box" = "1" or "2" or ..., "date_picker" = "yyyy-mm-dd"
      }
    }
  }
}
RETURN:
{
  "status": true/false, # status_code 200/400
  # if "status" = true
  "screen": true/false,
  "message": "HTML MESSAGE",
  # if "status" = false
  "errors": { 
    "user": {
      "FIELD": [ # "name","properties.value"
        "ERROR MESSAGE"
      ],
      "properties": [ # Custom fields
        {
          "custom_field_id": ID,
          "errors": {
            "value": [
              "ERROR MESSAGE"
            ]
          }
        }
      ]
    }
  }
}
User Info

Getting User information:

method: GET
URL: /management/users/info.json

PARAMETERS:
RETURN:
{
  "page": "user",
  "user": {
    "id": ”ID", # Format: NUMBER-TEXT
    "name": "NAME",
    "email": "EMAIL",
    "language": "LANGUAGE", # "en","pt","es"
    "thumb_url": "URL",
    "facebook": true/false,
    "permission": "PERMISSION", # "admin", "publisher", "contributor", "user"
    "payment_card_last_4_digits": "NUMBER",
    "email_unsubscribed": true/false,
    "properties":[ # Custom fields
      {
        "id": ID,
        "custom_field_id": ID,
        "value": "POSITION"
      }
    ]
  },
  “channels” : [ # Subscribed channels 
    {
      “CHANNEL ID”
    }
  ],
  # if achievement_enabled (info.json)
  "achievements": [
    {
      "id": ”ID", # Format: NUMBER-TEXT
      "name": "NAME",
      "description": "DESCRIPTION",
      "html_description": "HTML ADDITIONAL DESCRIPTION",
      "points": NUMBER,
      "certificate": true/false,
      "type": "achievement",
      "properties":[ # Custom fields
        {
          "id": ID,
          "custom_field_id": ID,
          "value": "POSITION"
        }
      ]
    }
  ],
  achievements_blocked: [
    ACHIEVEMENT_INFO
  ]
  "achievement_points": NUMBER,
  "achievement_rank": NUMBER
}

Following, we show how to get the user image:

URL: /users/[ID]/retrieve?format=thumb
ID: format NUMBER-TEXT

the achievement thumbnail:

URL: /achievements/[ID]/retrieve?format=thumb
ID: format NUMBER-TEXT

and the user achievement certificate:

URL: /users/[USER_ID]/achievements/[ACHIEVEMENT_ID].pdf
USER_ID: format NUMBER-TEXT
ACHIEVEMENT_ID: format NUMBER-TEXT

Edit User

1) Request Form (with possible custom fields)

method: GET
URL: /management/users/ID/edit.json # User ID on /management/users/info.json

PARAMETERS:
RETURN:
{
  "user": {
    "id": "ID",
    "name": "NAME",
    "email": "EMAIL",
    "language": "LANGUAGE", # "en","pt","es"
    "user_file": "IMAGE", 
    "email_unsubscribed": true/false,
    "properties": [ # If exist custom fields
      {
        "id": "ID", # ID = null, if new custom field
        "custom_field_id": ID,
        "value": "VALUE"
      }
    ]
  },
  "custom_fields": [ # If exist custom fields
    {
      "id": ID,
      "name": "NAME",
      "field_name": {
        "en": "FIELD NAME IN ENGLISH",
        "pt": "FIELD NAME IN PORTUGUESE"
      },
      "field_type": "FIELD TYPE", # "text_box","date_picker","check_box","radio_button","combo_box"
      "field_values": [ # If "field_type" = "check_box","radio_button","combo_box"
        {
          "en": "OPTION VALUE IN ENGLISH",
          "pt": "OPTION VALUE IN PORTUGUESE",
          “parent_value”: “PARENT'S VALUE POSITION”
        }
      ],
      "required": true/false,
      "model_name": "User",
      “parent_id”: ID # PARENT'S ID
    }
  ]
}

2) Submit Form (with possible custom fields)

method: PUT
URL: /management/users/ID.json

PARAMETERS:
{
  "user": {
    "name": "NAME",
    "email": "EMAIL", # If regular user
    "email_confirmation": "EMAIL", # If regular user
    "password": "PASSWORD", # If regular user and changing password
    "password_confirmation": "PASSWORD", # If regular user and changing password
    "permission": "user",
    "language": "LANGUAGE", # "en","pt","es"
    "properties_attributes": { # If exist custom fields
      "INDEX": { # 0,1,2,...
        "id": "ID" # If NOT a new custom field
        "custom_field_id": "ID"
        "value": "POSITION", # "check_box" = “” or “|1|” or "|1||2|" or ..., "radio_button","combo_box" = "1" or "2" or ..., "date_picker" = "yyyy-mm-dd"
      }
    }
  }
}
RETURN:
{
  "status": true/false, # status_code 200/400
  "errors": { # If "status" = false
    "user": {
      "FIELD": [ # "name","email","password","properties.value"
        "ERROR MESSAGE"
      ],
      "properties": [ # If exist custom fields
        {
          "custom_field_id": ID,
          "errors": {
            "value": [
              "ERROR MESSAGE"
            ]
          }
        }
      ]
    }
  }
}
Remove User

method: POST
URL: /management/users/ID/remove.json

PARAMETERS:
{
  "user": {
    "password": "PASSWORD", # If regular user (not Facebook user)
  }
}
RETURN:
{
  "status": true/false, # status_code 200/401
  "message": "ERROR MESSAGE" # If "status" = false
}
Reset Password

To reset an user password, you need to perform the following call:

method: POST
URL: /password_resets.json

PARAMETERS:
{
  “password_reset”: {
    “email”:  "EMAIL"
  }
}
RETURN:
{
  "status": TRUE
}
Resend Verification Code

To resend the verification code, you need to perform the following call:

method: POST
URL: /email_verifies.json

PARAMETERS:
{
  “email_verify”: {
    “email”:  "EMAIL"
  }
}
RETURN:
{
  "status": TRUE
}
Subscriptions

Showing all subscriptions for an User:

method: GET
URL: /management/users/ID/subscriptions.json  # User ID on /management/users/info.json

PARAMETERS:
{
  “subscription_page”: “NUMBER” # Pagination, starting on 1
}
RETURN:
{
  "page": "subscriptions",
  "subscriptions": [
    {
      "SUBSCRIPTION INFORMATION"
    }
  ],
  "pagination": {
    "current": “NUMBER”, # Current page
    "last": true/false # Last page
  }
}

Showing a subscription for an User with Subscription ID:

method: GET
URL: /management/users/ID/subscriptions/ID/edit.json  # User ID on /management/users/info.json and Subscription ID on /management/users/ID/subscriptions.json

PARAMETERS:
RETURN:
{
  "page": "subscription",
  "subscription": [
    {
      "id": "ID", # NUMBER-TEXT
      "user_group_id": "SUBSCRIPTION PLAN ID", # NUMBER-TEXT (deprecated)
      "subscriptable_id": "SUBSCRIPTION PLAN ID", # NUMBER-TEXT
      "subscriptable_type": "UserGroup",
      "name": "NAME",
      "duration": "DURATION", # ["monthly"|"quarterly"|"triannually"|"semiannual"|"annual"|"biennial"|"perpetual"]
      "recurrent": true/false,
      "payment_method": "PAYMENT METHOD", # [“card”|”boleto”]
      "status": "PAYMENT STATUS", # [“trial”|“paid”|”pending”|”canceled”|”expired”]
      "current_period_start": “PAYMENT CYCLE START”, # yyyy-mm-dd
      "current_period_end": “PAYMENT CYCLE END”, # yyyy-mm-dd
      "suspended": true/false
      "price": “PRICE”, # In cents
      "installments": NUMBER, 
      "card_last_digits": “CARD LAST 4 DIGITS”, # If payment_method = “card”
      "invoice_url": "INVOICE URL", # If payment_method = “boleto”
      "invoice_expires_at": "INVOICE EXPIRES" # yyyy-mm-dd, if payment_method = “boleto”,
      "invoices": [
        {
          "date": "DATE", # yyyy-mm-dd
          "value": "VALUE", # In cents          
          "status": "STATUS", # [“paid”|”pending”|”expired”]
          "errors": {
            "code": "CODE",
            "date": "DATE",
            "text": "TEXT"
          }
        }
      ],
      "coupon": "COUPON INFO",
      "trial_days": NUMBER
    }
  ],
}

Next you have the request to change a credit card used on a subscription using the User ID

method: PUT
URL: /management/users/ID/subscriptions/ID.json  # User ID on /management/users/info.json

PARAMETERS:
{
  “card_token”: “TOKEN” 
}
RETURN:
{
  "status": true/false, # status_code 200/400
}

Here you can see how to cancel a subscription using the User ID

method: DELETE
URL: /management/users/ID/subscriptions/ID.json # User ID on /management/users/info.json

PARAMETERS:
{
  "subscription": {
    "password": "PASSWORD",
  }
}
RETURN:
{
  "status": true/false, # status_code 200/400
  "error": "ERROR MESSAGE" # If "status" = false
}

To reactivate a subscription before the expiration date:

method: POST
URL: /management/users/ID/subscriptions/ID/reactivate.json # User ID on /management/users/info.json

RETURN:
{
  "status": true/false, # status_code 200/400
}
TVODs

Showing all TVODs for an User:

method: GET
URL: /management/users/ID/tvods.json  # User ID on /management/users/info.json

PARAMETERS:
{
  “tvod_page”: “NUMBER” # Pagination, starting on 1
}
RETURN:
{
  "page": "tvods",
  "tvods": [
    {
      "TVOD INFORMATION"
    }
  ],
  "pagination": {
    "current": “NUMBER”, # Current page
    "last": true/false # Last page
  }
}

Showing a TVOD for an User with TVOD ID:

method: GET
URL: /management/users/ID/tvods/ID.json  # User ID on /management/users/info.json and TVOD ID on /management/users/ID/tvods.json

PARAMETERS:
RETURN:
{
  "page": "tvod",
  "tvod": [
    {
      "id": "ID", # NUMBER-TEXT
      "subscriptable_id": "TVOD ID", # NUMBER-TEXT
      "subscriptable_type": "Video|Audio",
      "name": "NAME",
      "duration": "DURATION", # ["purchase"|"rental"]
      "recurrent": true/false,
      "payment_method": "PAYMENT METHOD", # [“card”|”boleto”]
      "status": "PAYMENT STATUS", # [“paid”|”pending”|”expired”]
      "current_period_start": “PAYMENT CYCLE START”, # yyyy-mm-dd
      "current_period_end": “PAYMENT CYCLE END”, # yyyy-mm-dd
      "price": “PRICE”, # In cents
      "installments": NUMBER, 
      "card_last_digits": “CARD LAST 4 DIGITS”, # If payment_method = “card”
      "invoice_url": "INVOICE URL", # If payment_method = “boleto”
      "invoice_expires_at": "INVOICE EXPIRES" # yyyy-mm-dd, if payment_method = “boleto”,
      "invoices": [
        {
          "date": "DATE", # yyyy-mm-dd
          "value": "VALUE", # In cents
          "status": "STATUS", # [“paid”|”pending”|”expired”]
        }
      ]
    }
  ],
}
Leaderboards

method: GET
URL: /achievements/leaderboards.json

PARAMETERS:
{
  “user_rank_page”: “NUMBER” # Pagination, starting on 1
}
RETURN:
{
  "page": "leaderboards",
  "user_ranks": [
    {
      "position": NUMBER,
      "name": "NAME",
      "points": NUMBER
    }
  ],
  "pagination": {
    "current": “NUMBER”, # Current page
    "last": true/false # Last page
  }
}

<< Previous topic Next topic >>