Back to top

FileVirtuelle Public API

FileVirtuelle is a web application that remove the need to wait in a line. It gives a digital ticket (by sending a text or an email) and call the customer back when his/her turn is close. The FileVirtuelle API gives you access to the core functionalities, so that you can easily develop new clients.

General

Forewords

To get access to the API, you should get in touch with us. You find the email address in www.filevirtuelle.com.

We also provide a Git repository with an example of how to use the API (it’s in Javascript for Node.js). You can access the repo here.

Security and Authentication

When your account is created, you receive an API key and an API secret (standard procedure). The security of the API is based on a HMAC-SHA1 signature and the use of a timestamp to avoid man in the middle attack to replay a previous request.

To do so, we ask our users to use two different headers:

  • Authorization header composed of api_key:signature.

  • X-FV-TIMESTAMP header composed of the current unix timestamp in milliseconds.

How do I compute the signature

Follow this simple procedure:

  1. Concatenate the HTTP verb, the URI and the timestamp into a single string.

  2. Sign the previous string with your API secret using HMAC-SHA1.

  3. Produce a hexadecimal digest.

  4. You have your signature.

Let’s take an example: you are requesting /prequalification/5693afe606c3c0b5bc68eaf0. This a GET request and the current unix timestamp in ms is 1471254540335.

Your concatenation is therefore:

var concat = "GET" + "/api/public/v2/prequalification/5693afe606c3c0b5bc68eaf0" + "1471254540335";

Now the full example in Javascript (Node.JS):

const crypto = require('crypto');
var concat = "GET" + "/api/public/v2/prequalification/5693afe606c3c0b5bc68eaf0" + "1471254540335";
var api_secret = "7632da295ad6d11a44a75390a0b8fb12ffd24"
var sign = crypto.createHmac('sha1', api_secret).update(concat).digest('hex');
//sign will be 5542b8b446f2203978b7d0549140cbf168de81f5 

Now the full example in PHP:

$concat = 'GET' . '/api/public/v2/prequalification/5693afe606c3c0b5bc68eaf0' . '1471254540335';
$api_secret = '7632da295ad6d11a44a75390a0b8fb12ffd24';
$sign = hash_hmac('sha1', $concat, $api_secret);

How do I make a real request

Providing that you have computed the signature and that you have the timestamp, this is fairly easy. Let’s say, your API key is bfa3e803-217e-4f00 and your API secret is 7632da295ad6d11a44a75390a0b8fb12ffd24.

A cURL request could be issued like this:

curl -XGET --header "Authorization: bfa3e803-217e-4f00:5542b8b446f2203978b7d0549140cbf168de81f5" --header "X-FV-TIMESTAMP: 1471254540335" "https://fv.filevirtuelle.com/api/public/v2/prequalification/5693afe606c3c0b5bc68eaf0"

Using superagent in Node.JS:

const request = require('superagent');
request
   .get('https://fv.filevirtuelle.com/api/public/v2/prequalification/5693afe606c3c0b5bc68eaf0')
   .set('X-FV-TIMESTAMP', '1471254540335')
   .set('Authorization', 'bfa3e803-217e-4f00:5542b8b446f2203978b7d0549140cbf168de81f5')
   .set('Accept', 'application/json')
   .end(function(err, res){
     if (err || !res.ok) {
       alert('Oh no! error');
     } else {
       alert('yay got ' + JSON.stringify(res.body));
     }
   });

Which errors may I receive

For each endpoint, you get the complete list of possible errors (including authentication errors). See the endpoints for more details.

Restrictions

Headers

When you are sending requests to the API, you need to provide the header Content-Type and set it to application/json.

SMS restrictions

Depending on which alphabet you are using, this leads to the maximum individual short message sizes of 160 7-bit characters, 140 8-bit characters, or 70 16-bit characters. More characters mean more texts.

As FileVirtuelle does not have unlimited text messages (we are charged for it) nor emails, when you are in testing phases, you have a fair use of 10 text messages and 50 emails. When both fair uses reache 0, you will be able to use registration by name but not by phone number nor by email address (see “Add customer to the queue” in the Queue section for more details).

Right management

When you have an API key and an API secret, you have access to the API. However, some routes may be restricted as well as some organizations (see organizations for more details) and some suborganizations (see suborganizations for more details).

We distinguish four types of access:

  1. Create access (POST): you have access to create a given entity (e.g. devices, suborganizations, prequalifications, …).
  2. Read access (GET): you have access to read a given entity (e.g. devices, suborganizations, prequalifications, …).
  3. Update access (PUT): you have access to update a given entity (e.g. devices, suborganizations, prequalifications, …).
  4. Delete access (DELETE): you have access to delete a given entity (e.g. devices, suborganizations, prequalifications, …).

Furthermore, you may have restrictions on which entitiesyou have access to.

Finally, if you are using the API too much (many requests per seconds) you can get locked out.

To get all your API rights, you can use the following request.

Limited number of requests per minute

You can send at most max_hits requests per minute, then you get a 429 error called RateLimitExceeded. You need to wait until the next minute to be able to continue working with the API. If you send too many requests for too many minutes, you might get banned for an unlimited amount of time. BE AWARE!

For more details on max_hits, see the /api_info route below.

Get API information

Get API information
GET/api_info

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/api_info
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "access": {
    "rights": {
      "device": {
        "c": true,
        "r": true,
        "u": false,
        "d": false
      },
      "organization": {
        "c": true,
        "r": true
      }
    },
    "filter": {
      "organizations": {
        "whitelist": [],
        "blacklist": []
      },
      "suborganizations": {
        "whitelist": [],
        "blacklist": []
      }
    }
  },
  "name": "FileVirtuelle",
  "key": "bfa3e803217e97ed5f64174",
  "testing": false,
  "fairuse": {
    "email": 45,
    "sms": 7,
    "max_hits": 420
  },
  "urls": {
    "next": "https://myorg.com/notify/next_customer",
    "processed": ""
  }
}
Response Parameters
name
string (optional) 

Name of the API holder.

key
string (optional) 

API key.

testing
boolean (optional) 

API in testing mode.

fairuse
object (optional) 
sms
number (optional) 

SMS Fair Use (see SMS restrictions for details).

email
number (optional) 

Email Fair Use (see SMS restrictions for details).

max_hits
number (optional) 

Max number of requests per minute.

access
object (optional) 
rights
string (optional) 
filter
string (optional) 
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Search Engine

Search Engine

Each GET request comes with a search engine that you can use to restrict search to specific entities and properties inside those entities.

Forging queries

To make a query, you use the querystring with the parameter search: organizations?search=QUERY (QUERY should be replaced by your query).

Boolean logic

Queries are composed of a list of key, operator, value:

  • key represents the field in the json response. For instance, for organizations a field can be name, colorone or colortwo.

  • value represents the value that needs to be matched. For instance, for organizations the value of name can be Darty.

  • operator represents an operator.

Operator Signification URI encoding
= Check for equality %3D
< Check for less than %3C
> Check for greater than %3E
<= Check for less than or equal %3C%3D
>= Check for greater than or equal %3E%3D
!= Check for inequality !%3D

Each element in the list can be composed with two types of boolean operator:

  1. & meaning AND, escaped as %26
  2. | meaning OR, escaped as %7C

Let’s take an example, I looking for organizations running by the name Darty or Nikon:

The query will be:

  • name=Darty|name=Nikon

And the path will be (with the correct escaping): /organizations?search=name%3DDarty%7Cname%3DNikon

Projection

Every GET routes come with the ability to restrict the response to certain fields, which is called a projection.

NB: We advise you to ALWAYS restrict your GET requests to the fields you want.

Let’s take an example using the list of organizations. By default, you access organizations through the subpath /organizations. If you want to restrict the fields you want, just add the list of fields, like this /organizations/name,colorone. Same goes when accessing certain entities: organization/592e9ab3ed982e4f91c535a2.

NB: You can also filter out the fields you do not want using the - sign such as /organizations/-name,-colortwo which will not display the name of the organization and the secondary color.

To restrict to nested objects only, you need to use the dot notation something.inner_object.

WARNING: Be careful, MongoDB does NOT support mixing inclusion and exclusion (e.g -name,colorone), so you need to choose what you want, or you get an error right away.

The responses will be:

Get Organizations with a projection

Get Organizations with a projection
GET/organizations/name,colorone

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/organizations/name,colorone
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "_id": "592e9ab3ed982e4f91c535a2",
    "colorone": "#E60019",
    "name": "Darty"
  },
  {
    "_id": "5a6ee589b3bde31910651710",
    "colorone": "#FFDE00",
    "name": "Nikon"
  }
]
Response Parameters
_id
string (required) 

Unique ID of the organization.

name
object (required) 

Name of the organization.

colorone
string (required) 

Hexadecimal representation of the main color used in the graphic charter of the organization.

Get an Organization with a projection

Get an Organization with a projection
GET/organization/592e9ab3ed982e4f91c535a2/name,colorone

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/organization/592e9ab3ed982e4f91c535a2/name,colorone
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "_id": "592e9ab3ed982e4f91c535a2",
  "colorone": "#E60019",
  "name": "Darty"
}
Response Parameters
_id
string (required) 

Unique ID of the organization.

name
object (required) 

Name of the organization.

colorone
string (required) 

Hexadecimal representation of the main color used in the graphic charter of the organization.

Organizations

Organization

An organization is a group of suborganizations. For a company with multiple stores an organization is the company itself. The organization does not hold a lot of information, because, for flexibility, all the information are kept on the suborganization side.

Get Organization

Get Organization
GET/organization/{oid}

Get information about an organization with a given ID.

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/organization/oid
URI Parameters
HideShow
oid
hexadecimal (required) 

Unique ID of the organization.

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "_id": "5693bcd506c3c0b5bc68eaf1",
  "name": "Apple",
  "logo": "/img/customers/img.png",
  "colorone": "#000000",
  "colortwo": "#FFFFFF"
}
Response Parameters
_id
string (required) 

Unique ID of the organization.

name
object (required) 

Name of the organization.

logo
string (required) 

Relative URL to organization’s logo.

colorone
string (required) 

Hexadecimal representation of the main color used in the graphic charter of the organization.

colortwo
string (required) 

Hexadecimal representation of the second color used in the graphic charter of the organization.

Response  422
HideShow

When the organization does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidOrganization",
  "message": "Invalid organization. Check the ID."
}
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Get all organizations

Get all organizations
GET/organizations

Get all organizations you have access to.

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/organizations
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "_id": "5693bcd506c3c0b5bc68eaf1",
    "name": "Apple",
    "logo": "/img/customers/img.png",
    "colorone": "#000000",
    "colortwo": "#FFFFFF"
  }
]
Response Parameters
_id
string (required) 

Unique ID of the organization.

name
object (required) 

Name of the organization.

logo
string (required) 

Relative URL to organization’s logo.

colorone
string (required) 

Hexadecimal representation of the main color used in the graphic charter of the organization.

colortwo
string (required) 

Hexadecimal representation of the second color used in the graphic charter of the organization.

Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Suborganizations

Suborganization

A suborganization can be viewed as a part of an organization. For an organization such as Apple, a suborganization will be an Apple Store. A suborganization defines a number of useful parameters such as SMS texts, email texts, time before calling a customer back, and so on.

Get Suborganization

Get Suborganization
GET/suborganization/{sid}

Get information about a suborganization with a given ID.

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/suborganization/sid
URI Parameters
HideShow
sid
hexadecimal (required) 

Unique ID of the suborganization.

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "_id": "57be88e6da119ee36dcd0084",
  "name": "Apple Hausmann",
  "organization": "592e9ab3ed982e4f91d535b2",
  "email": {
    "activated": false,
    "subject_wait": {
      "FR": ""
    },
    "subject_go": {
      "FR": ""
    },
    "subject_comeback": {
      "FR": ""
    },
    "subject_screen": {
      "FR": ""
    },
    "subject_meeting": {
      "FR": ""
    },
    "wait": {
      "FR": ""
    },
    "go": {
      "FR": ""
    },
    "comeback": {
      "FR": ""
    },
    "screen": {
      "FR": ""
    },
    "meeting": {
      "FR": ""
    },
    "provider": "",
    "sender": "",
    "prefix": "",
    "suffix": ""
  },
  "sms": {
    "activated": true,
    "default_code": "FR",
    "provider": "nexmo",
    "sender": "Darty",
    "extras": [],
    "wait": {
      "FR": "Vous avez le numéro {customer.ticket}. Nous vous enverrons un SMS dès que votre tour approchera. Explorez le magasin en attendant d'etre averti."
    },
    "go": {
      "FR": "Bienvenue, votre numéro est le {customer.ticket} ! Restez à proximité de l'Espace Services, nous allons nous occuper de vous."
    },
    "comeback": {
      "FR": "C'est bientot votre tour. Rejoignez l'Espace Services et consultez l'écran d'attente."
    },
    "screen": {
      "FR": ""
    },
    "meeting": {
      "FR": "Bonjour, votre rendez-vous est prévu à {customer.mt_str} et votre numéro de passage dans la file est le {customer.ticket}."
    },
    "prefix": "",
    "suffix": ""
  },
  "store_code": "907029",
  "langs": [
    "FR"
  ],
  "floating_desks": true,
  "screen_sms": false,
  "meeting_sms": false,
  "undigital": true,
  "redirect_desks": true,
  "tz": "Europe/Paris",
  "call_by_people": true,
  "tbm": 10,
  "ptc": 2,
  "ttc": 10,
  "css_template": "apple",
  "meeting": {
    "meeting_on_machine": true,
    "block": 10,
    "expired": 10,
    "activated": true,
    "provider": "affluences",
    "pull": false,
    "pull_interval": 0
  },
  "alerts": {},
  "vibrator": {
    "provider": "syscall",
    "activated": true
  },
  "extra_codes": {
    "codeX": {}
  },
  "block_desks": {
    "activated": false
  },
  "display": {}
}
Response Parameters
_id
string (required) 

Identifier assigned by MongoDB

name
string (required) 

Name of the suborganization

organization
string (required) 

Organization’s id

email
object (required) 
activated
boolean (optional) 

Activate emails

subject_wait
object (optional) 
FR
string (optional) 

Subject of the email when a customer needs to wait (may be in multiple languages)

subject_go
object (optional) 
FR
string (optional) 

Subject of the email sent when a customer should not wait (may be in multiple languages)

subject_comeback
object (optional) 
FR
string (optional) 

Subject of the email sent when a customer needs to come back (may be in multiple languages)

subject_screen
object (optional) 
FR
string (optional) 

Subject of the email sent when a customer is called by a desk (may be in multiple languages)

subject_meeting
object (optional) 
FR
string (optional) 

Subject of the email sent when a customer checks in and has an appointment (may be in multiple languages)

wait
object (optional) 
FR
string (optional) 

Body of the email sent when a customer should wait (may be in multiple languages)

go
object (required) 
FR
string (optional) 

Boyd of the email sent when a customer should not wait (may be in multiple languages)

comeback
object (optional) 
FR
string (optional) 

Body of the email sent when a customer should come back (may be in multiple languages)

screen
object (optional) 
FR
string (optional) 

Body of the email sent when a customer is called by a desk (may be in multiple languages)

meeting
object (required) 
FR
string (optional) 

Body of the email sent when a customer has an appointment and checks in (may be in multiple languages)

provider
string (optional) Default: sendgrid

Email’s provider

sender
string (optional) 

Email’s sender

prefix
string (optional) 

Automatically added string prefix when customer enters her email address

suffix
string (optional) 

Automatically added suffix when customer enters her email address

sms
object (required) 
activated
boolean (optional) 

Activate texts

default_code
string (optional) 

Default country code to automatically derived country calling codes

provider
string (optional) 

Texts’ provider

sender
string (optional) 

Sender

extras
array (optional) 
wait
object (optional) 
FR
string (optional) 

Text sent when a customer needs to wait (may be in multiple languages)

go
object (optional) 
FR
string (optional) 

Text sent when a customer should not wait (may be in multiple languages)

comeback
object (optional) 
FR
string (optional) 

Text sent when a customer needs to come back (may be in multiple languages)

screen
object (optional) 
FR
string (optional) 

Text sent when a customer is called by a desk (may be in multiple languages)

meeting
object (required) 
FR
string (optional) 

Text sent when a customer has an appointment and checks in

prefix
string (optional) 

Automatically added prefix when customer enters her phone number

suffix
string (optional) 

Automatically added suffix when a customer enters her phone number

store_code
string (optional) 

External suborganization ID (may be needed by some external API)

langs
array (required) 
floating_desks
boolean (optional) 

Allow desk to be closed

screen_sms
boolean (optional) 

Send a text (or email) when a customer is called by a desk

meeting_sms
boolean (optional) 

Send a text (or email) when a customer has an appointment and checks in

undigital
boolean (optional) 

Allow customers to register with their (first)name

redirect_desks
boolean (optional) 

Allow prequalifications to be redirected when a desk is closed

tz
string (required) 

Timezone of the suborganization

call_by_people
boolean (optional) Default: true

Prefer to based comeback text (or email) on number of people instead of remaining time to wait

tbm
integer (required) 

A customer has an appointment at 4:00pm. He checks in at 3:30pm. If nobody is waiting, a desk can call this customer X minutes before the due time

ptc
integer (required) Default: 2

Number of remaining people before the current customer to call him/her back

ttc
integer (required) Default: 10

Remaining number of minutes before calling the current customer back

css_template
string (required) 

CSS Template for ticket machine, desk and screen

meeting
object (required) 
meeting_on_machine
boolean (optional) 

Allow customer to make a new appointment directly on the ticket machine

block
integer (optional) 

TBA

expired
integer (optional) 

Delay (in minutes) after which the appointment is considered expired

activated
boolean (optional) 

Activate appointment integration

provider
string (optional) 

Appointment provider

pull
boolean (optional) 

Pull appointments from provider at regular interval

pull_interval
integer (optional) 

Number of milliseconds between which we pull appointments from the provider servers

alerts
object (optional) 
vibrator
object (required) 
provider
string (optional) 

Provider of vibrating pagers

activated
boolean (optional) 

Activate pager integration

extra_codes
object (optional) 
codeX
object (optional) 
block_desks
object (optional) 
activated
boolean (optional) 
display
object (optional) 
Response  422
HideShow

When the suborganization does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidSuborganization",
  "message": "Invalid suborganization. Check the ID."
}
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Get all suborganizations

Get all suborganizations
GET/suborganizations

Get all suborganizations.

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/suborganizations
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "_id": "57be88e6da119ee36dcd0084",
    "name": "Apple Hausmann",
    "organization": "592e9ab3ed982e4f91d535b2",
    "email": {
      "activated": false,
      "subject_wait": {
        "FR": ""
      },
      "subject_go": {
        "FR": ""
      },
      "subject_comeback": {
        "FR": ""
      },
      "subject_screen": {
        "FR": ""
      },
      "subject_meeting": {
        "FR": ""
      },
      "wait": {
        "FR": ""
      },
      "go": {
        "FR": ""
      },
      "comeback": {
        "FR": ""
      },
      "screen": {
        "FR": ""
      },
      "meeting": {
        "FR": ""
      },
      "provider": "",
      "sender": "",
      "prefix": "",
      "suffix": ""
    },
    "sms": {
      "activated": true,
      "default_code": "FR",
      "provider": "nexmo",
      "sender": "Darty",
      "extras": [],
      "wait": {
        "FR": "Vous avez le numéro {customer.ticket}. Nous vous enverrons un SMS dès que votre tour approchera. Explorez le magasin en attendant d'etre averti."
      },
      "go": {
        "FR": "Bienvenue, votre numéro est le {customer.ticket} ! Restez à proximité de l'Espace Services, nous allons nous occuper de vous."
      },
      "comeback": {
        "FR": "C'est bientot votre tour. Rejoignez l'Espace Services et consultez l'écran d'attente."
      },
      "screen": {
        "FR": ""
      },
      "meeting": {
        "FR": "Bonjour, votre rendez-vous est prévu à {customer.mt_str} et votre numéro de passage dans la file est le {customer.ticket}."
      },
      "prefix": "",
      "suffix": ""
    },
    "store_code": "907029",
    "langs": [
      "FR"
    ],
    "floating_desks": true,
    "screen_sms": false,
    "meeting_sms": false,
    "undigital": true,
    "redirect_desks": true,
    "tz": "Europe/Paris",
    "call_by_people": true,
    "tbm": 10,
    "ptc": 2,
    "ttc": 10,
    "css_template": "apple",
    "meeting": {
      "meeting_on_machine": true,
      "block": 10,
      "expired": 10,
      "activated": true,
      "provider": "affluences",
      "pull": false,
      "pull_interval": 0
    },
    "alerts": {},
    "vibrator": {
      "provider": "syscall",
      "activated": true
    },
    "extra_codes": {
      "codeX": {}
    },
    "block_desks": {
      "activated": false
    },
    "display": {}
  }
]
Response Parameters
_id
string (required) 

Identifier assigned by MongoDB

name
string (required) 

Name of the suborganization

organization
string (required) 

Organization’s id

email
object (required) 
activated
boolean (optional) 

Activate emails

subject_wait
object (optional) 
FR
string (optional) 

Subject of the email when a customer needs to wait (may be in multiple languages)

subject_go
object (optional) 
FR
string (optional) 

Subject of the email sent when a customer should not wait (may be in multiple languages)

subject_comeback
object (optional) 
FR
string (optional) 

Subject of the email sent when a customer needs to come back (may be in multiple languages)

subject_screen
object (optional) 
FR
string (optional) 

Subject of the email sent when a customer is called by a desk (may be in multiple languages)

subject_meeting
object (optional) 
FR
string (optional) 

Subject of the email sent when a customer checks in and has an appointment (may be in multiple languages)

wait
object (optional) 
FR
string (optional) 

Body of the email sent when a customer should wait (may be in multiple languages)

go
object (required) 
FR
string (optional) 

Boyd of the email sent when a customer should not wait (may be in multiple languages)

comeback
object (optional) 
FR
string (optional) 

Body of the email sent when a customer should come back (may be in multiple languages)

screen
object (optional) 
FR
string (optional) 

Body of the email sent when a customer is called by a desk (may be in multiple languages)

meeting
object (required) 
FR
string (optional) 

Body of the email sent when a customer has an appointment and checks in (may be in multiple languages)

provider
string (optional) Default: sendgrid

Email’s provider

sender
string (optional) 

Email’s sender

prefix
string (optional) 

Automatically added string prefix when customer enters her email address

suffix
string (optional) 

Automatically added suffix when customer enters her email address

sms
object (required) 
activated
boolean (optional) 

Activate texts

default_code
string (optional) 

Default country code to automatically derived country calling codes

provider
string (optional) 

Texts’ provider

sender
string (optional) 

Sender

extras
array (optional) 
wait
object (optional) 
FR
string (optional) 

Text sent when a customer needs to wait (may be in multiple languages)

go
object (optional) 
FR
string (optional) 

Text sent when a customer should not wait (may be in multiple languages)

comeback
object (optional) 
FR
string (optional) 

Text sent when a customer needs to come back (may be in multiple languages)

screen
object (optional) 
FR
string (optional) 

Text sent when a customer is called by a desk (may be in multiple languages)

meeting
object (required) 
FR
string (optional) 

Text sent when a customer has an appointment and checks in

prefix
string (optional) 

Automatically added prefix when customer enters her phone number

suffix
string (optional) 

Automatically added suffix when a customer enters her phone number

store_code
string (optional) 

External suborganization ID (may be needed by some external API)

langs
array (required) 
floating_desks
boolean (optional) 

Allow desk to be closed

screen_sms
boolean (optional) 

Send a text (or email) when a customer is called by a desk

meeting_sms
boolean (optional) 

Send a text (or email) when a customer has an appointment and checks in

undigital
boolean (optional) 

Allow customers to register with their (first)name

redirect_desks
boolean (optional) 

Allow prequalifications to be redirected when a desk is closed

tz
string (required) 

Timezone of the suborganization

call_by_people
boolean (optional) Default: true

Prefer to based comeback text (or email) on number of people instead of remaining time to wait

tbm
integer (required) 

A customer has an appointment at 4:00pm. He checks in at 3:30pm. If nobody is waiting, a desk can call this customer X minutes before the due time

ptc
integer (required) Default: 2

Number of remaining people before the current customer to call him/her back

ttc
integer (required) Default: 10

Remaining number of minutes before calling the current customer back

css_template
string (required) 

CSS Template for ticket machine, desk and screen

meeting
object (required) 
meeting_on_machine
boolean (optional) 

Allow customer to make a new appointment directly on the ticket machine

block
integer (optional) 

TBA

expired
integer (optional) 

Delay (in minutes) after which the appointment is considered expired

activated
boolean (optional) 

Activate appointment integration

provider
string (optional) 

Appointment provider

pull
boolean (optional) 

Pull appointments from provider at regular interval

pull_interval
integer (optional) 

Number of milliseconds between which we pull appointments from the provider servers

alerts
object (optional) 
vibrator
object (required) 
provider
string (optional) 

Provider of vibrating pagers

activated
boolean (optional) 

Activate pager integration

extra_codes
object (optional) 
codeX
object (optional) 
block_desks
object (optional) 
activated
boolean (optional) 
display
object (optional) 
Response  422
HideShow

When the organization does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidOrganization",
  "message": "Invalid organization. Check the ID."
}
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Devices

Device

A device is of three types:

  1. Ticket machine where a customer can register him/herself.
  2. Desk where a shop assistant can call the next registered customer.
  3. Screen where the ticket number is displayed along with the desk number.

This reflects the real devices that can exist in a store. Ticket machines can register customers whereas desks can only call the next customer. With this in mind, when you are using the /register or /next endpoints you need to give the right type of device in order for the system to accept the request.

A device is also tied to the prequalifications (see Prequalification section for more details). A ticket machine may display only certain prequalifications and some desk may handle only certain types of requests (= certain prequalifications).

A desk may also be opened or closed. It exists several types of closing reasons:

  1. Long-term closing.
  2. Small pause during the day.
  3. Long-term closing with customers’ redirection (= a desk is closed but every requests he is handling is redirected to other desks).

These parameters help the system accurately predict the waiting time for each customer. As a matter of fact, when only two desks are opened, the queue will be dequeued less frequently than when four desks are.

Get Device

Get Device
GET/device/{did}

Get information about a device with a given ID.

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/device/did
URI Parameters
HideShow
did
hexadecimal (required) 

Unique ID of the device.

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "_id": "597394dfd51ec3d9149455bf",
  "organization": "592e9ab3ed982e4f91c645b2",
  "suborganization": "",
  "name": "Conseiller 1",
  "hostname": "D2D2",
  "mac": "AC:AF:B9:37:CB:46",
  "type": "desk",
  "template": "5969349f2c867a1ce23d661c",
  "autosink": false,
  "html_name": {
    "FR": "Conseiller 1"
  },
  "orientation": {
    "FR": ""
  },
  "html_orientation": {
    "FR": ""
  },
  "pause": {
    "timestamp": "2018-06-01T05:59:21.371Z",
    "duration": 0
  },
  "status": {
    "pre_close": false,
    "redirect": false,
    "pause": false,
    "open": true
  },
  "system": {
    "ask_before_closing": false
  },
  "notifications": {
    "text": {
      "activated": false
    }
  }
}
Response Parameters
_id
string (required) 

Identifier assigned by MongoDB

organization
string (required) 

Organization this device is linked to

suborganization
string (required) 

Suborganization this device is linked to

name
string (required) 

Name of the device

hostname
string (required) 

Hostname to identify the device inside an organization

mac
string (required) 

MAC address of the device

type
string (required) 

Type of the device

template
string (required) 

UI Template of the device

autosink
boolean (optional) 

Only when type is ‘desk’. Set to ‘true’, desk acts as a robot able to call customers automatically. This is used for statistic purposes when using informational prequalifications

html_name
object (required) 
FR
string (optional) 

HTML name of the device (to be displayed on the frontend. May be in multiple languages)

orientation
object (optional) 
FR
string (optional) 

Plain-text position of the device in-store (e.g. first floor, on the basement, …)

html_orientation
object (optional) 
FR
string (optional) 

HTML position of the device in-store (e.g. first floor, on the basement, …)

pause
object (required) 
timestamp
string (optional) 

Beginning of the pause (ISO 8601 UTC time)

duration
integer (optional) 

Pause duration (in minutes)

status
object (optional) 
pre_close
boolean (optional) 

Close the desk, but do not prevent the desk for calling customers. If all desks are in pre-close mode, the ticket machines displayed a message saying that the store is going to close soon

redirect
boolean (optional) 

Close the desk and redirect every prequalifications that it handles to other desks

pause
boolean (required) 

Close the desk for a small pause

open
boolean (optional) 

Set to true if desk is opened

system
object (optional) 
ask_before_closing
boolean (optional) 

Force the desk to display a message before closing the window

notifications
object (optional) 
text
object (optional) 
activated
boolean (optional) 

Display a notification when a new customer registers (if activated)

Response  422
HideShow

When the device does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidDevice",
  "message": "Invalid device. Check the ID"
}
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Get all devices

Get all devices
GET/devices

Get all devices

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/devices
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "_id": "597394dfd51ec3d9149455bf",
    "organization": "592e9ab3ed982e4f91c645b2",
    "suborganization": "",
    "name": "Conseiller 1",
    "hostname": "D2D2",
    "mac": "AC:AF:B9:37:CB:46",
    "type": "desk",
    "template": "5969349f2c867a1ce23d661c",
    "autosink": false,
    "html_name": {
      "FR": "Conseiller 1"
    },
    "orientation": {
      "FR": ""
    },
    "html_orientation": {
      "FR": ""
    },
    "pause": {
      "timestamp": "2018-06-01T05:59:21.371Z",
      "duration": 0
    },
    "status": {
      "pre_close": false,
      "redirect": false,
      "pause": false,
      "open": true
    },
    "system": {
      "ask_before_closing": false
    },
    "notifications": {
      "text": {
        "activated": false
      }
    }
  }
]
Response Parameters
_id
string (required) 

Identifier assigned by MongoDB

organization
string (required) 

Organization this device is linked to

suborganization
string (required) 

Suborganization this device is linked to

name
string (required) 

Name of the device

hostname
string (required) 

Hostname to identify the device inside an organization

mac
string (required) 

MAC address of the device

type
string (required) 

Type of the device

template
string (required) 

UI Template of the device

autosink
boolean (optional) 

Only when type is ‘desk’. Set to ‘true’, desk acts as a robot able to call customers automatically. This is used for statistic purposes when using informational prequalifications

html_name
object (required) 
FR
string (optional) 

HTML name of the device (to be displayed on the frontend. May be in multiple languages)

orientation
object (optional) 
FR
string (optional) 

Plain-text position of the device in-store (e.g. first floor, on the basement, …)

html_orientation
object (optional) 
FR
string (optional) 

HTML position of the device in-store (e.g. first floor, on the basement, …)

pause
object (required) 
timestamp
string (optional) 

Beginning of the pause (ISO 8601 UTC time)

duration
integer (optional) 

Pause duration (in minutes)

status
object (optional) 
pre_close
boolean (optional) 

Close the desk, but do not prevent the desk for calling customers. If all desks are in pre-close mode, the ticket machines displayed a message saying that the store is going to close soon

redirect
boolean (optional) 

Close the desk and redirect every prequalifications that it handles to other desks

pause
boolean (required) 

Close the desk for a small pause

open
boolean (optional) 

Set to true if desk is opened

system
object (optional) 
ask_before_closing
boolean (optional) 

Force the desk to display a message before closing the window

notifications
object (optional) 
text
object (optional) 
activated
boolean (optional) 

Display a notification when a new customer registers (if activated)

Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Prequalifications

Prequalification

A prequalification is something a given store (= a suborganization) is providing to its customers. For instance, customer services or product repair, and so on. A prequalification allows the customer to choose why s/he wants to get into the waiting line. A prequalification comes with an average time (in minutes) of processing, so that FileVirtuelle can compute the overall waiting time for a customer. A prequalification is available in multiple languages, depending on the settings of the suborganization.

Get Prequalification

Get Prequalification
GET/prequalification/{prid}

Get information about a prequalification with a given ID.

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/prequalification/prid
URI Parameters
HideShow
prid
hexadecimal (required) 

Unique ID of the prequalification.

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "_id": "59629f5a3a6c9973b2185c21",
  "suborganization": "57be88e6da119ee36dcd0084",
  "subtitle": {
    "FR": ""
  },
  "header": {
    "EN": "Welcome!"
  },
  "orientation": {
    "EN": ""
  },
  "html_name": {
    "EN": "I have<br />an appointment"
  },
  "name": {
    "EN": "No Appointment"
  },
  "subheader": {
    "EN": "Do you have an appointment?"
  },
  "machines": [],
  "desks": [],
  "screens": [],
  "prequalifications": [],
  "prioritize": false,
  "notify": false,
  "default": false,
  "root": true,
  "prm": false,
  "meeting": false,
  "waiting": 0,
  "machine_order": 1,
  "desk_order": 3,
  "trigger": ""
}
Response Parameters
_id
string (optional) 

Identifier assigned by MongoDB

suborganization
string (required) 

ID of the suborganization this prequalification is linked to

subtitle
object (optional) 
EN
string (optional) 

Small text displayed below the HTML name of the prequalification (used on the ticket machines only in multiple languages)

header
object (required) 
EN
string (optional) 

Header displayed on the screen showing this prequalification (used on the ticket machines only in multiple languages)

orientation
object (optional) 
EN
string (optional) 

Deprecated for now

html_name
object (required) 
EN
string (optional) 

HTML name of the prequalification (used on the frontend only in multiple languages)

name
object (required) 
EN
string (optional) 

Plain-text name of the prequalification (in multiple languages)

subheader
object (optional) 
EN
string (optional) 

Header displayed below the current header (used on the ticket machines only in multiple languages)

machines
array (required) 
desks
array (required) 
screens
array (required) 
prequalifications
array (required) 
prioritize
boolean (optional) 

Prioritize this prequalification

notify
boolean (optional) 

Notify desks when customers choose the prequalification

default
boolean (optional) 

Default prequalification (internal stuff, at least one prequalification for each suborganization needs to be the default)

root
boolean (optional) 

Root prequalification in the hierarchy (first level)

prm
boolean (optional) 

Person with reduced mobility prequalification (needs to be displayed a certain way to conform with law)

meeting
boolean (optional) 

Prequalification linked to appointments

waiting
integer (required) 

Estimated number of minutes it takes to handle this prequalification

machine_order
integer (required) 

Display order in ticket machine

desk_order
integer (required) 

Display order on desk

trigger
string (optional) 

Part of the templating system (internal stuff)

Response  422
HideShow

When the prequalification does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidPrequalification",
  "message": "Invalid prequalification. Check the ID."
}
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Get all prequalifications

Get all prequalifications
GET/prequalifications

Get all prequalifications

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/prequalifications
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "_id": "59629f5a3a6c9973b2185c21",
    "suborganization": "57be88e6da119ee36dcd0084",
    "subtitle": {
      "FR": ""
    },
    "header": {
      "EN": "Welcome!"
    },
    "orientation": {
      "EN": ""
    },
    "html_name": {
      "EN": "I have<br />an appointment"
    },
    "name": {
      "EN": "No Appointment"
    },
    "subheader": {
      "EN": "Do you have an appointment?"
    },
    "machines": [],
    "desks": [],
    "screens": [],
    "prequalifications": [],
    "prioritize": false,
    "notify": false,
    "default": false,
    "root": true,
    "prm": false,
    "meeting": false,
    "waiting": 0,
    "machine_order": 1,
    "desk_order": 3,
    "trigger": ""
  }
]
Response Parameters
_id
string (optional) 

Identifier assigned by MongoDB

suborganization
string (required) 

ID of the suborganization this prequalification is linked to

subtitle
object (optional) 
EN
string (optional) 

Small text displayed below the HTML name of the prequalification (used on the ticket machines only in multiple languages)

header
object (required) 
EN
string (optional) 

Header displayed on the screen showing this prequalification (used on the ticket machines only in multiple languages)

orientation
object (optional) 
EN
string (optional) 

Deprecated for now

html_name
object (required) 
EN
string (optional) 

HTML name of the prequalification (used on the frontend only in multiple languages)

name
object (required) 
EN
string (optional) 

Plain-text name of the prequalification (in multiple languages)

subheader
object (optional) 
EN
string (optional) 

Header displayed below the current header (used on the ticket machines only in multiple languages)

machines
array (required) 
desks
array (required) 
screens
array (required) 
prequalifications
array (required) 
prioritize
boolean (optional) 

Prioritize this prequalification

notify
boolean (optional) 

Notify desks when customers choose the prequalification

default
boolean (optional) 

Default prequalification (internal stuff, at least one prequalification for each suborganization needs to be the default)

root
boolean (optional) 

Root prequalification in the hierarchy (first level)

prm
boolean (optional) 

Person with reduced mobility prequalification (needs to be displayed a certain way to conform with law)

meeting
boolean (optional) 

Prequalification linked to appointments

waiting
integer (required) 

Estimated number of minutes it takes to handle this prequalification

machine_order
integer (required) 

Display order in ticket machine

desk_order
integer (required) 

Display order on desk

trigger
string (optional) 

Part of the templating system (internal stuff)

Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Customers

Customer

A customer is a person that is going to wait in a queue. S/he can have an appointment, be fast-tracked because s/he is a prioritized prequalification, and so on.

A customer needs to register using a ticket machine and is handled by desks.

You can register a customer using the register route et call a customer using the next route (more details below).

As any other GET routes, you can use the search engine and the projections to filter out content you do not want to see.

Get Customer

Get Customer
GET/customer/{cid}

Get information about a customer with a given ID.

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/customer/cid
URI Parameters
HideShow
cid
hexadecimal (required) 

Unique ID of the customer.

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "_id": "5b5c2394145bec468791489e",
  "name": "John Smith",
  "machine": "5962930a3737b80434b5008a",
  "suborganization": "57be88e6da119ee36dbc0083",
  "prequalification": "599340cba4d52e429cbc44b3",
  "lang": "FR",
  "registered_by": "bfa3e803-217e-4f00-97ed-5f64146N1a",
  "wait": false,
  "name_removed": false,
  "visits": 0,
  "expired": false,
  "rsvp": true,
  "prioritized": false,
  "finalized": true,
  "digital": false,
  "notified": false,
  "processed": false,
  "called": false,
  "meeting": false,
  "pbc": 0,
  "ttp": 0,
  "ttw": 0,
  "utimestamp": "2018-07-28T08:04:36.870Z",
  "rsvptimestamp": "2018-07-28T08:04:36.811Z",
  "mtimestamp": "2018-07-28T08:04:36.811Z",
  "stimestamp": "2018-07-28T08:04:36.811Z",
  "rtimestamp": "2018-07-28T08:04:36.811Z",
  "prequalifications_path": [
    "59730cbc8543a51c99b6c388",
    "599340cba4d52e429cbc44b3"
  ],
  "type": "name",
  "ticket": "1",
  "vibrate": false,
  "title": "",
  "desk": "5a107df0a36532433598220a",
  "display": "John Smith",
  "display_desk": "John Smith"
}
Response Parameters
phone
string (optional) 

Phone number if given

email
string (optional) 

Email address if given

name
string (optional) 

Name (firstname / lastname) if given

machine
string (required) 

Id of the chosen ticket machine

suborganization
string (required) 

Id of the suborganization

prequalification
string (required) 

ID of the chosen prequalification

lang
string (required) 

Language of the customer

registered_by
string (required) 

API key of registering device (machine or through an API access)

_id
string (required) 

Identifier assigned by MongoDB

external_meeting_id
string (optional) 

External meeting ID when specified (for appointment only)

wait
boolean (optional) 

Based on the suborganization’s configuration, there are too many people before this customer, so s/he needs to wait

visits
integer (optional) 

Number of visits based on alerts in suborganization’s configuration

expired
boolean (optional) 

If the customer has an appointment and checks in late, the appointment can be considered as expired

rsvp
boolean (optional) 

The customer checks in on the ticket machine (for a customer with an appointment, this means that s/he entered the store and said: “Ok I’m here now”)

prioritized
boolean (optional) 

This customer will be served in priority

finalized
boolean (optional) 

Not used anymore

digital
boolean (optional) 

Set to true, this means that the customer can be contacted through digital channels (email / phone…)

notified
boolean (optional) 

The text (or email) has been (or not) sent to the customer

processed
boolean (optional) 

The customer is already processed (a desk has called her and now it’s done)

called
boolean (optional) 

The customer has been called by a desk and it’s in progress

meeting
boolean (optional) 

The customer has an appointment

pbc
integer (optional) 

Number of people before this customer at the time of registration

ttp
integer (optional) 

Number of minutes to processed the customer (from the time s/he was called to the time it was done)

ttw
integer (optional) 

Number of minutes the customer waited on the line

utimestamp
string (required) 

Last time we updated something regarding this customer

rsvptimestamp
string (required) 

Time when the customer checks-in (useful for appointment)

mtimestamp
string (required) 

Time of the appointment

stimestamp
string (required) 

Time used to sort the customer in the line

rtimestamp
string (required) 

Time of registration

prequalifications_path
array (required) 
type
string (required) 

Type of registration chosen by the customer (phone, email, vibration, name, …)

ticket
string (required) 

Ticket assigned to this customer

vibrate
boolean (optional) 

Does the customer use a vibrating pager?

title
string (optional) 

Title of the customer (Mr / Mrs / Ms, for instance)

desk
string (required) 

Desk that called the customer

display
string (optional) 

What to show of the waiting / calling screen (based on suborganization’s configuration)

display_desk
string (required) 

What to show on desk (based on suborganization’s configuration

Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Get all customers

Get all customers
GET/customers

Get all customers

Example URI

GET https://fv.filevirtuelle.com/api/public/v2/customers
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "_id": "5b5c2394145bec468791489e",
    "name": "John Smith",
    "machine": "5962930a3737b80434b5008a",
    "suborganization": "57be88e6da119ee36dbc0083",
    "prequalification": "599340cba4d52e429cbc44b3",
    "lang": "FR",
    "registered_by": "bfa3e803-217e-4f00-97ed-5f64146N1a",
    "wait": false,
    "name_removed": false,
    "visits": 0,
    "expired": false,
    "rsvp": true,
    "prioritized": false,
    "finalized": true,
    "digital": false,
    "notified": false,
    "processed": false,
    "called": false,
    "meeting": false,
    "pbc": 0,
    "ttp": 0,
    "ttw": 0,
    "utimestamp": "2018-07-28T08:04:36.870Z",
    "rsvptimestamp": "2018-07-28T08:04:36.811Z",
    "mtimestamp": "2018-07-28T08:04:36.811Z",
    "stimestamp": "2018-07-28T08:04:36.811Z",
    "rtimestamp": "2018-07-28T08:04:36.811Z",
    "prequalifications_path": [
      "59730cbc8543a51c99b6c388",
      "599340cba4d52e429cbc44b3"
    ],
    "type": "name",
    "ticket": "1",
    "vibrate": false,
    "title": "",
    "desk": "5a107df0a36532433598220a",
    "display": "John Smith",
    "display_desk": "John Smith"
  }
]
Response Parameters
phone
string (optional) 

Phone number if given

email
string (optional) 

Email address if given

name
string (optional) 

Name (firstname / lastname) if given

machine
string (required) 

Id of the chosen ticket machine

suborganization
string (required) 

Id of the suborganization

prequalification
string (required) 

ID of the chosen prequalification

lang
string (required) 

Language of the customer

registered_by
string (required) 

API key of registering device (machine or through an API access)

_id
string (required) 

Identifier assigned by MongoDB

external_meeting_id
string (optional) 

External meeting ID when specified (for appointment only)

wait
boolean (optional) 

Based on the suborganization’s configuration, there are too many people before this customer, so s/he needs to wait

visits
integer (optional) 

Number of visits based on alerts in suborganization’s configuration

expired
boolean (optional) 

If the customer has an appointment and checks in late, the appointment can be considered as expired

rsvp
boolean (optional) 

The customer checks in on the ticket machine (for a customer with an appointment, this means that s/he entered the store and said: “Ok I’m here now”)

prioritized
boolean (optional) 

This customer will be served in priority

finalized
boolean (optional) 

Not used anymore

digital
boolean (optional) 

Set to true, this means that the customer can be contacted through digital channels (email / phone…)

notified
boolean (optional) 

The text (or email) has been (or not) sent to the customer

processed
boolean (optional) 

The customer is already processed (a desk has called her and now it’s done)

called
boolean (optional) 

The customer has been called by a desk and it’s in progress

meeting
boolean (optional) 

The customer has an appointment

pbc
integer (optional) 

Number of people before this customer at the time of registration

ttp
integer (optional) 

Number of minutes to processed the customer (from the time s/he was called to the time it was done)

ttw
integer (optional) 

Number of minutes the customer waited on the line

utimestamp
string (required) 

Last time we updated something regarding this customer

rsvptimestamp
string (required) 

Time when the customer checks-in (useful for appointment)

mtimestamp
string (required) 

Time of the appointment

stimestamp
string (required) 

Time used to sort the customer in the line

rtimestamp
string (required) 

Time of registration

prequalifications_path
array (required) 
type
string (required) 

Type of registration chosen by the customer (phone, email, vibration, name, …)

ticket
string (required) 

Ticket assigned to this customer

vibrate
boolean (optional) 

Does the customer use a vibrating pager?

title
string (optional) 

Title of the customer (Mr / Mrs / Ms, for instance)

desk
string (required) 

Desk that called the customer

display
string (optional) 

What to show of the waiting / calling screen (based on suborganization’s configuration)

display_desk
string (required) 

What to show on desk (based on suborganization’s configuration

Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Add standard customer to the queue

Add standard customer to the queue
POST/register

This explains how to register a customer that just arrives in the store.

N.B.: In testing phase (see Get API information for details), you can only send up to 10 text messages and 50 emails. After you reach this limit, you should only register people by their name.

N.B: When you register a user, you need to ensure that the chosen mode is activated in the suborganization configuration. If the undigital mode is not activated you cannot use the name information, if the texting mode is not activated you cannot use the phone number, and so on.

Example URI

POST https://fv.filevirtuelle.com/api/public/v2/register
URI Parameters
HideShow
lang
string (required) 

ISO 639-1 two characters codename (e.g. EN or FR or DE).

phone
string (required) 

Phone number of the customer (undefined if not provided).

email
string (required) 

Email address of the customer (undefined if not provided).

name
string (required) 

Name of the customer (undefined if not provided).

prequalification
hexadecimal (required) 

Unique ID of the chosen prequalification.

suborganization
hexadecimal (required) 

Unique ID of the suborganization.

prequalifications_path
array (required) 

Array of prequalifications (In case the prequalifications are arranged in a hiearchy, this reflects the path chosen by a given customer)

machine
hexadecimal (required) 

Unique ID of the ticket machine used for registration.

Request
HideShow
Headers
Content-Type: application/json
Body
{
  "lang": "FR",
  "phone": "0689091314",
  "prequalification": "507f1f77bcf86cd799439011",
  "prequalifications_path": [
    "507f1f77bcf86cd799439011"
  ],
  "machine": "508f1f79bcf97cd799439018"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "message": "Customer is successfully added",
  "change": "POST_customer",
  "entity": {
    "_id": "5b5c2394145bec468791489e",
    "name": "John Smith",
    "machine": "5962930a3737b80434b5008a",
    "suborganization": "57be88e6da119ee36dbc0083",
    "prequalification": "599340cba4d52e429cbc44b3",
    "lang": "FR",
    "registered_by": "bfa3e803-217e-4f00-97ed-5f64146N1a",
    "wait": false,
    "name_removed": false,
    "visits": 0,
    "expired": false,
    "rsvp": true,
    "prioritized": false,
    "finalized": true,
    "digital": false,
    "notified": false,
    "processed": false,
    "called": false,
    "meeting": false,
    "pbc": 0,
    "ttp": 0,
    "ttw": 0,
    "utimestamp": "2018-07-28T08:04:36.870Z",
    "rsvptimestamp": "2018-07-28T08:04:36.811Z",
    "mtimestamp": "2018-07-28T08:04:36.811Z",
    "stimestamp": "2018-07-28T08:04:36.811Z",
    "rtimestamp": "2018-07-28T08:04:36.811Z",
    "prequalifications_path": [
      "59730cbc8543a51c99b6c388",
      "599340cba4d52e429cbc44b3"
    ],
    "type": "name",
    "ticket": "1",
    "vibrate": false,
    "title": "",
    "desk": "5a107df0a36532433598220a",
    "display": "John Smith",
    "display_desk": "John Smith"
  }
}
Response Parameters
message
string (required) 

Success message

change
string (required) 

Change value (internal use only)

entity
object (required) 
phone
string (optional) 

Phone number if given

email
string (optional) 

Email address if given

name
string (optional) 

Name (firstname / lastname) if given

machine
string (optional) 

Id of the chosen ticket machine

suborganization
string (optional) 

Id of the suborganization

prequalification
string (optional) 

ID of the chosen prequalification

lang
string (optional) 

Language of the customer

registered_by
string (optional) 

API key of registering device (machine or through an API access)

_id
string (optional) 

Identifier assigned by MongoDB

external_meeting_id
string (optional) 

External meeting ID when specified (for appointment only)

wait
boolean (optional) 

Based on the suborganization’s configuration, there are too many people before this customer, so s/he needs to wait

visits
integer (optional) 

Number of visits based on alerts in suborganization’s configuration

expired
boolean (optional) 

If the customer has an appointment and checks in late, the appointment can be considered as expired

rsvp
boolean (optional) 

The customer checks in on the ticket machine (for a customer with an appointment, this means that s/he entered the store and said: “Ok I’m here now”)

prioritized
boolean (optional) 

This customer will be served in priority

finalized
boolean (optional) 

Not used anymore

digital
boolean (optional) 

Set to true, this means that the customer can be contacted through digital channels (email / phone…)

notified
boolean (optional) 

The text (or email) has been (or not) sent to the customer

processed
boolean (optional) 

The customer is already processed (a desk has called her and now it’s done)

called
boolean (optional) 

The customer has been called by a desk and it’s in progress

meeting
boolean (optional) 

The customer has an appointment

pbc
integer (optional) 

Number of people before this customer at the time of registration

ttp
integer (optional) 

Number of minutes to processed the customer (from the time s/he was called to the time it was done)

ttw
integer (optional) 

Number of minutes the customer waited on the line

utimestamp
string (optional) 

Last time we updated something regarding this customer

rsvptimestamp
string (optional) 

Time when the customer checks-in (useful for appointment)

mtimestamp
string (optional) 

Time of the appointment

stimestamp
string (optional) 

Time used to sort the customer in the line

rtimestamp
string (optional) 

Time of registration

prequalifications_path
array (optional) 
type
string (optional) 

Type of registration chosen by the customer (phone, email, vibration, name, …)

ticket
string (optional) 

Ticket assigned to this customer

vibrate
boolean (optional) 

Does the customer use a vibrating pager?

title
string (optional) 

Title of the customer (Mr / Mrs / Ms, for instance)

desk
string (optional) 

Desk that called the customer

display
string (optional) 

What to show of the waiting / calling screen (based on suborganization’s configuration)

display_desk
string (optional) 

What to show on desk (based on suborganization’s configuration

Response  422
HideShow

When the prequalification does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidPrequalification",
  "message": "Invalid prequalification. Check the ID."
}
Response  422
HideShow

When the device does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidDevice",
  "message": "Invalid device. Check the ID"
}
Response  422
HideShow

When the desk does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidDesk",
  "message": "Invalid desk. Check the ID"
}
Response  422
HideShow

When the device type is invalid (see devices for more details).

Body
{
  "code": 422,
  "error": "InvalidDeviceType",
  "message": "Type of the device is invalid for this action"
}
Response  422
HideShow

When the code for the language is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidLang",
  "message": "Invalid lang. Use ISO 639-1 two characters codename"
}
Response  422
HideShow

When the date is not in ISO 8601 format, you get this error.

Body
{
  "code": 422,
  "error": "InvalidIso8601",
  "message": "The date is not formatted following the ISO 8601 format"
}
Response  422
HideShow

When the phone number and/or the name and/or the email address are invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidContactInformation",
  "message": "Invalid contact information. You should provide a phone number, an email address or a name."
}
Response  403
HideShow

When you try to register a customer using a mode (phone, email or name) that is not activated at the suborganization level, you get this error.

Body
{
  "code": 403,
  "error": "ContactModeUnavailable",
  "message": "Your mode of registration is not activated. Check the suborganization configuration for more details."
}
Response  403
HideShow

When you are in testing mode (see Get API information for more details) and you have exceeded your SMS fair use, you get this error.

Body
{
  "code": 403,
  "error": "FairUseExceeded",
  "message": "You are in testing phase and you have exceeded your fair use. Now you should only register people by name."
}
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Add customer with an appointment to the queue

Add customer with an appointment to the queue
POST/register

This explains how to register a customer that has an appointment later in the day or another day.

Example URI

POST https://fv.filevirtuelle.com/api/public/v2/register
URI Parameters
HideShow
lang
string (required) 

ISO 639-1 two characters codename (e.g. EN or FR or DE).

phone
string (required) 

Phone number of the customer (undefined if not provided).

email
string (required) 

Email address of the customer (undefined if not provided).

name
string (required) 

Name of the customer (undefined if not provided).

prequalification
hexadecimal (required) 

Unique ID of the chosen prequalification.

suborganization
hexadecimal (required) 

Unique ID of the suborganization.

prequalifications_path
array (required) 

Array of prequalifications (In case the prequalifications are arranged in a hiearchy, this reflects the path chosen by a given customer)

machine
hexadecimal (required) 

Unique ID of the ticket machine used for registration.

mtimestamp
string (required) 

Appointment date (ISO 8601 format). The timezone NEEDS to be UTC, be careful.

meeting
boolean (required) 

Set to true for an appointment

external_meeting_id
string (optional) 

External ID that can be used when integrating third-party systems.

Request
HideShow
Headers
Content-Type: application/json
Body
{
  "lang": "FR",
  "phone": "0689091314",
  "name": "John Smith",
  "prequalification": "507f1f77bcf86cd799439011",
  "prequalifications_path": [
    "507f1f77bcf86cd799439011"
  ],
  "machine": "508f1f79bcf97cd799439018",
  "mtimestamp": "2018-06-25T15:15:00.000Z",
  "meeting": true,
  "external_meeting_id": "john_smith_201806251515"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "message": "Customer is successfully added",
  "change": "POST_customer",
  "entity": {
    "_id": "5b5c1da8a36c49261173142e",
    "phone": "0033688912727",
    "name": "Corentin Ribeyre",
    "machine": "59aeca503b0ff90f7889b061",
    "suborganization": "57be88e6da119ee36dbc0083",
    "prequalification": "59730cbc8543a51c99b6c388",
    "lang": "FR",
    "registered_by": "bfa3e803-217e-4f00-97ed-5f6427564484N1a-FmKtW",
    "vibrator_configured": false,
    "external_meeting_id": "167839",
    "wait": false,
    "name_removed": false,
    "visits": 1,
    "expired": false,
    "rsvp": false,
    "prioritized": false,
    "finalized": true,
    "digital": true,
    "notified": false,
    "processed": false,
    "called": false,
    "meeting": true,
    "pbc": 0,
    "ttp": 0,
    "ttw": 0,
    "utimestamp": "2018-07-28T07:39:20.481Z",
    "rsvptimestamp": "2018-07-28T07:39:20.427Z",
    "mtimestamp": "2018-07-28T20:00:00.000Z",
    "stimestamp": "2018-07-28T20:00:00.000Z",
    "rtimestamp": "2018-07-28T20:00:00.000Z",
    "prequalifications_path": [
      "59730cbc8543a51c99b6c388"
    ],
    "type": "phone",
    "ticket": "5b5c1da8a36c49261173142e",
    "vibrate": false,
    "title": "",
    "desk": "5a107df0a36532433598220a",
    "display": "R*",
    "display_desk": "0033688912727"
  }
}
Response Parameters
message
string (required) 

Success message

change
string (required) 

Change value (internal use only)

entity
object (required) 
phone
string (optional) 

Phone number if given

email
string (optional) 

Email address if given

name
string (optional) 

Name (firstname / lastname) if given

machine
string (optional) 

Id of the chosen ticket machine

suborganization
string (optional) 

Id of the suborganization

prequalification
string (optional) 

ID of the chosen prequalification

lang
string (optional) 

Language of the customer

registered_by
string (optional) 

API key of registering device (machine or through an API access)

_id
string (optional) 

Identifier assigned by MongoDB

external_meeting_id
string (optional) 

External meeting ID when specified (for appointment only)

wait
boolean (optional) 

Based on the suborganization’s configuration, there are too many people before this customer, so s/he needs to wait

visits
integer (optional) 

Number of visits based on alerts in suborganization’s configuration

expired
boolean (optional) 

If the customer has an appointment and checks in late, the appointment can be considered as expired

rsvp
boolean (optional) 

The customer checks in on the ticket machine (for a customer with an appointment, this means that s/he entered the store and said: “Ok I’m here now”)

prioritized
boolean (optional) 

This customer will be served in priority

finalized
boolean (optional) 

Not used anymore

digital
boolean (optional) 

Set to true, this means that the customer can be contacted through digital channels (email / phone…)

notified
boolean (optional) 

The text (or email) has been (or not) sent to the customer

processed
boolean (optional) 

The customer is already processed (a desk has called her and now it’s done)

called
boolean (optional) 

The customer has been called by a desk and it’s in progress

meeting
boolean (optional) 

The customer has an appointment

pbc
integer (optional) 

Number of people before this customer at the time of registration

ttp
integer (optional) 

Number of minutes to processed the customer (from the time s/he was called to the time it was done)

ttw
integer (optional) 

Number of minutes the customer waited on the line

utimestamp
string (optional) 

Last time we updated something regarding this customer

rsvptimestamp
string (optional) 

Time when the customer checks-in (useful for appointment)

mtimestamp
string (optional) 

Time of the appointment

stimestamp
string (optional) 

Time used to sort the customer in the line

rtimestamp
string (optional) 

Time of registration

prequalifications_path
array (optional) 
type
string (optional) 

Type of registration chosen by the customer (phone, email, vibration, name, …)

ticket
string (optional) 

Ticket assigned to this customer

vibrate
boolean (optional) 

Does the customer use a vibrating pager?

title
string (optional) 

Title of the customer (Mr / Mrs / Ms, for instance)

desk
string (optional) 

Desk that called the customer

display
string (optional) 

What to show of the waiting / calling screen (based on suborganization’s configuration)

display_desk
string (optional) 

What to show on desk (based on suborganization’s configuration

Response  422
HideShow

When the prequalification does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidPrequalification",
  "message": "Invalid prequalification. Check the ID."
}
Response  422
HideShow

When the device does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidDevice",
  "message": "Invalid device. Check the ID"
}
Response  422
HideShow

When the desk does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidDesk",
  "message": "Invalid desk. Check the ID"
}
Response  422
HideShow

When the device type is invalid (see devices for more details).

Body
{
  "code": 422,
  "error": "InvalidDeviceType",
  "message": "Type of the device is invalid for this action"
}
Response  422
HideShow

When the code for the language is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidLang",
  "message": "Invalid lang. Use ISO 639-1 two characters codename"
}
Response  422
HideShow

When the date is not in ISO 8601 format, you get this error.

Body
{
  "code": 422,
  "error": "InvalidIso8601",
  "message": "The date is not formatted following the ISO 8601 format"
}
Response  422
HideShow

When the phone number and/or the name and/or the email address are invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidContactInformation",
  "message": "Invalid contact information. You should provide a phone number, an email address or a name."
}
Response  403
HideShow

When you try to register a customer using a mode (phone, email or name) that is not activated at the suborganization level, you get this error.

Body
{
  "code": 403,
  "error": "ContactModeUnavailable",
  "message": "Your mode of registration is not activated. Check the suborganization configuration for more details."
}
Response  403
HideShow

When you are in testing mode (see Get API information for more details) and you have exceeded your SMS fair use, you get this error.

Body
{
  "code": 403,
  "error": "FairUseExceeded",
  "message": "You are in testing phase and you have exceeded your fair use. Now you should only register people by name."
}
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Call the next customer

Call the next customer
POST/next

Example URI

POST https://fv.filevirtuelle.com/api/public/v2/next
URI Parameters
HideShow
desk
hexadecimal (required) 

Unique ID of the desk

suborganization
hexadecimal (required) 

Unique ID of the suborganization

Request
HideShow
Headers
Content-Type: application/json
Body
{
  "desk": "569145cf486d1db46fb02956",
  "suborganization": "57be88e6da119ee36dcd0084"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "message": "Customer is successfully added",
  "change": "POST_customer",
  "entity": {
    "_id": "5b5c2394145bec468791489e",
    "name": "John Smith",
    "machine": "5962930a3737b80434b5008a",
    "suborganization": "57be88e6da119ee36dbc0083",
    "prequalification": "599340cba4d52e429cbc44b3",
    "lang": "FR",
    "registered_by": "bfa3e803-217e-4f00-97ed-5f64146N1a",
    "wait": false,
    "name_removed": false,
    "visits": 0,
    "expired": false,
    "rsvp": true,
    "prioritized": false,
    "finalized": true,
    "digital": false,
    "notified": false,
    "processed": false,
    "called": true,
    "meeting": false,
    "pbc": 0,
    "ttp": 0,
    "ttw": 0,
    "utimestamp": "2018-07-28T08:15:36.870Z",
    "rsvptimestamp": "2018-07-28T08:04:36.811Z",
    "mtimestamp": "2018-07-28T08:04:36.811Z",
    "stimestamp": "2018-07-28T08:04:36.811Z",
    "rtimestamp": "2018-07-28T08:04:36.811Z",
    "ctimestamp": "2018-07-28T08:15:36.811Z",
    "prequalifications_path": [
      "59730cbc8543a51c99b6c388",
      "599340cba4d52e429cbc44b3"
    ],
    "type": "name",
    "ticket": "1",
    "vibrate": false,
    "title": "",
    "desk": "5a107df0a36532433598220a",
    "display": "John Smith",
    "display_desk": "John Smith"
  }
}
Response Parameters
message
string (required) 

Success message

change
string (required) 

Change value (internal use only)

entity
object (required) 
phone
string (optional) 

Phone number if given

email
string (optional) 

Email address if given

name
string (optional) 

Name (firstname / lastname) if given

machine
string (optional) 

Id of the chosen ticket machine

suborganization
string (optional) 

Id of the suborganization

prequalification
string (optional) 

ID of the chosen prequalification

lang
string (optional) 

Language of the customer

registered_by
string (optional) 

API key of registering device (machine or through an API access)

_id
string (optional) 

Identifier assigned by MongoDB

external_meeting_id
string (optional) 

External meeting ID when specified (for appointment only)

wait
boolean (optional) 

Based on the suborganization’s configuration, there are too many people before this customer, so s/he needs to wait

visits
integer (optional) 

Number of visits based on alerts in suborganization’s configuration

expired
boolean (optional) 

If the customer has an appointment and checks in late, the appointment can be considered as expired

rsvp
boolean (optional) 

The customer checks in on the ticket machine (for a customer with an appointment, this means that s/he entered the store and said: “Ok I’m here now”)

prioritized
boolean (optional) 

This customer will be served in priority

finalized
boolean (optional) 

Not used anymore

digital
boolean (optional) 

Set to true, this means that the customer can be contacted through digital channels (email / phone…)

notified
boolean (optional) 

The text (or email) has been (or not) sent to the customer

processed
boolean (optional) 

The customer is already processed (a desk has called her and now it’s done)

called
boolean (optional) 

The customer has been called by a desk and it’s in progress

meeting
boolean (optional) 

The customer has an appointment

pbc
integer (optional) 

Number of people before this customer at the time of registration

ttp
integer (optional) 

Number of minutes to processed the customer (from the time s/he was called to the time it was done)

ttw
integer (optional) 

Number of minutes the customer waited on the line

utimestamp
string (optional) 

Last time we updated something regarding this customer

rsvptimestamp
string (optional) 

Time when the customer checks-in (useful for appointment)

mtimestamp
string (optional) 

Time of the appointment

stimestamp
string (optional) 

Time used to sort the customer in the line

rtimestamp
string (optional) 

Time of registration

ctimestamp
string (optional) 

Time of calling

prequalifications_path
array (optional) 
type
string (optional) 

Type of registration chosen by the customer (phone, email, vibration, name, …)

ticket
string (optional) 

Ticket assigned to this customer

vibrate
boolean (optional) 

Does the customer use a vibrating pager?

title
string (optional) 

Title of the customer (Mr / Mrs / Ms, for instance)

desk
string (optional) 

Desk that called the customer

display
string (optional) 

What to show of the waiting / calling screen (based on suborganization’s configuration)

display_desk
string (optional) 

What to show on desk (based on suborganization’s configuration

Response  422
HideShow

When the prequalification does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidPrequalification",
  "message": "Invalid prequalification. Check the ID."
}
Response  422
HideShow

When the device does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidDevice",
  "message": "Invalid device. Check the ID"
}
Response  422
HideShow

When the desk does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidDesk",
  "message": "Invalid desk. Check the ID"
}
Response  422
HideShow

When the device type is invalid (see devices for more details).

Body
{
  "code": 422,
  "error": "InvalidDeviceType",
  "message": "Type of the device is invalid for this action"
}
Response  422
HideShow

When the code for the language is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidLang",
  "message": "Invalid lang. Use ISO 639-1 two characters codename"
}
Response  422
HideShow

When the date is not in ISO 8601 format, you get this error.

Body
{
  "code": 422,
  "error": "InvalidIso8601",
  "message": "The date is not formatted following the ISO 8601 format"
}
Response  422
HideShow

When the phone number and/or the name and/or the email address are invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidContactInformation",
  "message": "Invalid contact information. You should provide a phone number, an email address or a name."
}
Response  403
HideShow

When you try to register a customer using a mode (phone, email or name) that is not activated at the suborganization level, you get this error.

Body
{
  "code": 403,
  "error": "ContactModeUnavailable",
  "message": "Your mode of registration is not activated. Check the suborganization configuration for more details."
}
Response  403
HideShow

When you are in testing mode (see Get API information for more details) and you have exceeded your SMS fair use, you get this error.

Body
{
  "code": 403,
  "error": "FairUseExceeded",
  "message": "You are in testing phase and you have exceeded your fair use. Now you should only register people by name."
}
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Update a customer

Update a customer
PUT/customer

Update a customer with a given _id (required). The request may then include any field from the customer that you’d like to change. See the description of a customer above (in this section).

Please keep in mind that the fields are typed (a boolean should stay as a boolean, a string as a string, and so on).

Some fields are always validated through the validation process and may raise an error if they are incorrectly set.

Example URI

PUT https://fv.filevirtuelle.com/api/public/v2/customer
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "_id": "569145cf486d1db46fb02956",
  "mtimestamp": "2018-07-30T15:00:00.000Z",
  "expired": false,
  "name": "New Name of the Customer"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "success": "[Customer object]",
  "message": "Customer is successfully modified"
}
Response  422
HideShow

When an entity (whatever it is) does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidEntity",
  "message": "This entity is invalid. Check the ID"
}
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Delete a customer

Delete a customer
DELETE/customer/{cid}

Delete a customer with a given ID (the response includes the deleted customer).

Example URI

DELETE https://fv.filevirtuelle.com/api/public/v2/customer/cid
URI Parameters
HideShow
cid
hexadecimal (required) 

Unique ID of the customer (given by MongoDB)

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "success": "[Customer object]",
  "message": "Customer is successfully removed"
}
Response  422
HideShow

When an entity (whatever it is) does not exist or is invalid, you get this error.

Body
{
  "code": 422,
  "error": "InvalidEntity",
  "message": "This entity is invalid. Check the ID"
}
Response  417
HideShow

When you don’t provide an Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoAuthorizationHeaderError",
  "message": "No authorization header found. You should provide an Authorization header with Authorization: api_key:signature."
}
Response  417
HideShow

When you don’t provide a two-part (api_key:signature) Authorization header, you get this error.

Body
{
  "code": 417,
  "error": "NoTwoPartAuthorizationError",
  "message": "Authorization header should be of two parts: api_key:signature."
}
Response  403
HideShow

When your API key is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidAPIKey",
  "message": "API Key does not exist."
}
Response  403
HideShow

When your signature is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidSignature",
  "message": "The signature does not match."
}
Response  403
HideShow

When the timestamp is invalid, you get this error.

Body
{
  "code": 403,
  "error": "InvalidTimestamp",
  "message": "Invalid timestamp."
}
Response  403
HideShow

When your account is locked (term violation, for instance), you get this error.

Body
{
  "code": 403,
  "error": "AccountIsLocked",
  "message": "Your account is locked. Please contact an administrator."
}
Response  403
HideShow

When you try to access a route that is restricted. Some routes are inaccessible because it depends on your API rights.

Body
{
  "code": 403,
  "error": "InvalidRoute",
  "message": "You don't have access to this route."
}
Response  429
HideShow

When you send more than the limited number of requests per minute, you get this error.

Body
{
  "code": 429,
  "error": "RateLimitExceeded",
  "message": "You have exceeded the max number of requests per minutes."
}

Generated by aglio on 22 Oct 2024