# Permits API

# Pull API: Permit Stats

<p class="callout info"><span data-colorid="h5go72n8lk">The OPSCOM Controller provides a simple JSON based API to integrate with. Clients use this API to gather stats on permits pushed into OPSCOM.   
  
</span><span data-colorid="h5go72n8lk">API access is a paid feature and must be granted by OPSCOM. Email your Account Executive to negotiate access. </span></p>

### <span data-colorid="i26fk0nta5">Making API Requests </span>

<span data-colorid="i26fk0nta5">Make sure you set the HTTP Content-Type header to be application/json. </span>

##### <span style="text-decoration: underline;">Raw Request:</span>

<div class="line number1 index0 alt2" id="bkmrk-post-%2Fapi%2Foc-toma%2Fv1">`POST /api/OC-TOMA/v1/permits/stats HTTP/1.1`</div><div class="line number2 index1 alt1" id="bkmrk-host%3A-controller.ope">`Host: controller.operationscommander.io`</div><div class="line number3 index2 alt2" id="bkmrk-accept%3A-application%2F">`Accept: application/json`</div><div class="line number4 index3 alt1" id="bkmrk-content-type%3A-applic">`Content-Type: application/json`</div><div class="line number5 index4 alt2" id="bkmrk-cache-control%3A-no-ca">`Cache-Control: no-cache`</div><div class="line number6 index5 alt1" id="bkmrk-%C2%A0"> </div><div class="line number7 index6 alt2" id="bkmrk-%7B">`{`</div><div class="line number8 index7 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%22apitoken%22%3A-%22you">`    ``"apiToken": "YOUR-API-TOKEN",`</div><div class="line number9 index8 alt2" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%22zones%22%3A-%22not-re">`    ``"zones": "NOT-REQUIRED--LIST-OF-ZONES"`</div><div class="line number10 index9 alt1" id="bkmrk-%7D">`}`</div>##### <span style="text-decoration: underline;">JavaScript Request</span>

<div class="line number1 index0 alt2" id="bkmrk-var%C2%A0request-%3D%C2%A0new%C2%A0xm">`var` `request = ``new` `XMLHttpRequest();`</div><div class="line number2 index1 alt1" id="bkmrk-%C2%A0-1"> </div><div class="line number3 index2 alt2" id="bkmrk-request.open%28%27post%27%2C">`request.open(``'POST'``, ``'<a href="https://controller.operationscommander.io/api/OC-TOMA/v1/permits/stats'">https://controller.operationscommander.io/api/OC-TOMA/v1/permits/stats'</a>``);`</div><div class="line number4 index3 alt1" id="bkmrk-%C2%A0-2"> </div><div class="line number5 index4 alt2" id="bkmrk-request.setrequesthe">`request.setRequestHeader(``'Content-Type'``, ``'application/json'``);`</div><div class="line number6 index5 alt1" id="bkmrk-request.setrequesthe-1">`request.setRequestHeader(``'Accept'``, ``'application/json'``);`</div><div class="line number7 index6 alt2" id="bkmrk-%C2%A0-3"> </div><div class="line number8 index7 alt1" id="bkmrk-request.onreadystate">`request.onreadystatechange = ``function` `() {`</div><div class="line number9 index8 alt2" id="bkmrk-%C2%A0%C2%A0if%C2%A0%28this.readystat">`  ``if` `(``this``.readyState === 4) {`</div><div class="line number10 index9 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0console.log%28%27sta">`    ``console.log(``'Status:'``, ``this``.status);`</div><div class="line number11 index10 alt2" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0console.log%28%27hea">`    ``console.log(``'Headers:'``, ``this``.getAllResponseHeaders());`</div><div class="line number12 index11 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0console.log%28%27bod">`    ``console.log(``'Body:'``, ``this``.responseText);`</div><div class="line number13 index12 alt2" id="bkmrk-%C2%A0%C2%A0%7D">`  ``}`</div><div class="line number14 index13 alt1" id="bkmrk-%7D%3B">`};`</div><div class="line number15 index14 alt2" id="bkmrk-%C2%A0-4"> </div><div class="line number16 index15 alt1" id="bkmrk-%C2%A0-5"> </div><div class="line number17 index16 alt2" id="bkmrk-var%C2%A0body-%3D-%7B">`var` `body = {`</div><div class="line number18 index17 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%22apitoken%22%3A%C2%A0%22you">`    ``"apiToken"``: ``"YOUR-API-TOKEN"``,`</div><div class="line number19 index18 alt2" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%22zones%22%3A%C2%A0%22lot-01">`    ``"zones"``: ``"Lot 01,Lot 02"`</div><div class="line number20 index19 alt1" id="bkmrk-%7D-1">`}`</div><div class="line number21 index20 alt2" id="bkmrk-request.send%28json.st">`request.send(JSON.stringify(body));`</div>### <span data-colorid="e0bysrvbz1">Request Object Attributes</span>

<table class="wrapped confluenceTable tablesorter tablesorter-default" id="bkmrk-attribute-type-limit" role="grid"><tbody aria-live="polite" aria-relevant="all"><tr><td>**Attribute**  
</td><td>**Type**  
</td><td>**Limits**

</td><td>**Possible Names**  
</td><td>**Description**</td></tr><tr role="row"><td class="confluenceTd">apiToken</td><td class="confluenceTd">String</td><td class="confluenceTd">50-character alphanumeric including dashes

</td><td class="confluenceTd">apiToken</td><td class="confluenceTd">**(Required)** Your supplied API Token.</td></tr><tr role="row"><td class="confluenceTd">zones

</td><td class="confluenceTd">String</td><td class="confluenceTd">Listed zones match zone names in database</td><td class="confluenceTd">zones

</td><td class="confluenceTd">**(Not Required)** Comma delimited list of zones

e.g. zone1,zone2,Lot 03,Red Lot,Street parking

</td></tr></tbody></table>

### Successful Response

The response will be a json object. The same reference id will be returned.

*Content-Type: application/json*

<div class="line number1 index0 alt2" id="bkmrk-%7B-1">`{`</div><div class="line number2 index1 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%22data%22%3A-%5B">`    ``"data"``: [`</div><div class="line number3 index2 alt2" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%7B">`        ``{`</div><div class="line number4 index3 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%22type%22%3A%C2%A0">`            ``"type"``: ``"standard"``,`</div><div class="line number5 index4 alt2" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%22zone%22%3A%C2%A0">`            ``"zone"``: ``"zone1"``,`</div><div class="line number6 index5 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%22total%22%3A">`            ``"total"``: ``"4"`</div><div class="line number7 index6 alt2" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%7D%2C">`        ``},`</div><div class="line number8 index7 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%7B-1">`        ``{`</div><div class="line number9 index8 alt2" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%22type%22%3A%C2%A0-1">`            ``"type"``: ``"temp"``,`</div><div class="line number10 index9 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%22zone%22%3A%C2%A0-1">`            ``"zone"``: ``"zone1"``,`</div><div class="line number11 index10 alt2" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%22total%22%3A-1">`            ``"total"``: ``"35"`</div><div class="line number12 index11 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%7D%2C-1">`        ``},`</div><div class="line number13 index12 alt2" id="bkmrk-%C2%A0%C2%A0%C2%A0%3A">`   ``:`</div><div class="line number14 index13 alt1" id="bkmrk-%C2%A0%C2%A0%C2%A0%3A-1">`   ``:`</div><div class="line number15 index14 alt2" id="bkmrk-%7D-2">`}`</div><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="96c00eaa-6dd9-4f65-aa36-dc5913e60e77" data-macro-name="code" id="bkmrk-"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  js" id="bkmrk--1"></div></div></div></div><div class="line number10 index9 alt1" id="bkmrk--2"></div><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="1fc64da1-381f-48e3-b00f-50af12c700e2" data-macro-name="code" id="bkmrk--3"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  text" id="bkmrk--4"></div></div></div></div>

# Push API: Permit Delete

<p class="callout info"><span data-colorid="h5go72n8lk">API access is a paid feature and must be granted by OPSCOM. Email your Account Executive to negotiate access. </span></p>

<span data-colorid="h5go72n8lk">The OPSCOM Controller provides a simple JSON based API to integrate with. Clients use this API to directly feed details about existing paid permits and their changes into OPSCOM from other systems such as Parking apps. </span>

Make sure you set the HTTP Content-Type header to be application/json.

## <span data-colorid="ofvesqd1kh">Making API Requests</span>

### Raw Request:

<div class="columnMacro conf-macro output-block" data-hasbody="true" data-macro-id="d82683ac-7548-4419-a8f9-4dd2f5a2e52e" data-macro-name="column" id="bkmrk-post-%2Fapi%2Foc-toma%2Fv1"><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="1fc64da1-381f-48e3-b00f-50af12c700e2" data-macro-name="code"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  text" id="bkmrk-post-%2Fapi%2Foc-toma%2Fv1-1"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2">`POST /api/OC-TOMA/v1/permits/delete HTTP/1.1`</div><div class="line number2 index1 alt1">`Host: controller.operationscommander.io`</div><div class="line number3 index2 alt2">`Accept: application/json`</div><div class="line number4 index3 alt1">`Content-Type: application/json`</div><div class="line number5 index4 alt2">`Cache-Control: no-cache`</div><div class="line number6 index5 alt1"> </div><div class="line number7 index6 alt2">`{`</div><div class="line number8 index7 alt1">`    ``"apiToken": "YOUR-API-TOKEN",`</div><div class="line number9 index8 alt2">`    ``"referenceID": "PREVIOUS-REFERENCE-ID"`</div><div class="line number10 index9 alt1">`}`</div></div></td></tr></tbody></table>

</div></div></div></div></div>### JavaScript Request:

<div class="columnMacro conf-macro output-block" data-hasbody="true" data-macro-id="96733877-01a7-4c30-9e62-30b67dd186b6" data-macro-name="column" id="bkmrk-var%C2%A0request-%3D%C2%A0new%C2%A0xm"><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="7e14d279-ff31-4675-9b93-a0241dbe09e9" data-macro-name="code"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  js"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2">`var` `request = ``new` `XMLHttpRequest();`</div><div class="line number2 index1 alt1"> </div><div class="line number3 index2 alt2">`request.open(``'POST'``, ``'<a href="https://controller.operationscommander.io/api/OC-TOMA/v1/permits/delete'">https://controller.operationscommander.io/api/OC-TOMA/v1/permits/delete'</a>``);`</div><div class="line number4 index3 alt1"> </div><div class="line number5 index4 alt2">`request.setRequestHeader(``'Content-Type'``, ``'application/json'``);`</div><div class="line number6 index5 alt1">`request.setRequestHeader(``'Accept'``, ``'application/json'``);`</div><div class="line number7 index6 alt2"> </div><div class="line number8 index7 alt1">`request.onreadystatechange = ``function` `() {`</div><div class="line number9 index8 alt2">`  ``if` `(``this``.readyState === 4) {`</div><div class="line number10 index9 alt1">`    ``console.log(``'Status:'``, ``this``.status);`</div><div class="line number11 index10 alt2">`    ``console.log(``'Headers:'``, ``this``.getAllResponseHeaders());`</div><div class="line number12 index11 alt1">`    ``console.log(``'Body:'``, ``this``.responseText);`</div><div class="line number13 index12 alt2">`  ``}`</div><div class="line number14 index13 alt1">`};`</div><div class="line number15 index14 alt2"> </div><div class="line number16 index15 alt1"> </div><div class="line number17 index16 alt2">`var` `body = {`</div><div class="line number18 index17 alt1">`    ``"apiToken"``: ``"YOUR-API-TOKEN"``,`</div><div class="line number19 index18 alt2">`    ``"referenceID"``: ``"PREVIOUS-REFERENCE-ID"`</div><div class="line number20 index19 alt1">`}`</div><div class="line number21 index20 alt2">`request.send(JSON.stringify(body));`</div></div></td></tr></tbody></table>

</div></div></div></div></div>## <span data-colorid="myfydoxup9">Request Object Attributes</span>

<table class="wrapped confluenceTable tablesorter tablesorter-default" id="bkmrk-attribute-type-limit" role="grid" style="width: 104.524%;"><tbody aria-live="polite" aria-relevant="all"><tr><td style="width: 9.77354%;">**Attribute**</td><td style="width: 8.81633%;">**Type**  
</td><td style="width: 25.2719%;">**Limits**

</td><td style="width: 9.41597%;">**Possible Names**  
</td><td style="width: 46.7223%;">**Description**</td></tr><tr role="row"><td class="confluenceTd" style="width: 9.77354%;">apiToken</td><td class="confluenceTd" style="width: 8.81633%;">String</td><td class="confluenceTd" style="width: 25.2719%;">50-character alphanumeric including dashes

</td><td class="confluenceTd" style="width: 9.41597%;">apiToken</td><td class="confluenceTd" style="width: 46.7223%;">**(Required)** Your supplied API Token.</td></tr><tr role="row"><td class="confluenceTd" style="width: 9.77354%;">Reference ID

</td><td class="confluenceTd" style="width: 8.81633%;">String</td><td class="confluenceTd" style="width: 25.2719%;">50-character alphanumeric including dashes</td><td class="confluenceTd" style="width: 9.41597%;">referenceid

referenceID

reference\_id

</td><td class="confluenceTd" style="width: 46.7223%;">**(Required)** This value is supplied to when the permit push api is successful.

e.g. 1a9b5375-cb75-4c71-9939-eeae550b09ac

</td></tr></tbody></table>

## Successful Response

The response will be a json object. The same reference id will be returned.

*Content-Type: application/json*

<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="96c00eaa-6dd9-4f65-aa36-dc5913e60e77" data-macro-name="code" id="bkmrk-%7B-%C2%A0%C2%A0%C2%A0%C2%A0%22status%22%3A%C2%A0%22suc"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  js" id="bkmrk-%7B-%C2%A0%C2%A0%C2%A0%C2%A0%22status%22%3A%C2%A0%22suc-1"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2">`{`</div><div class="line number2 index1 alt1">`    ``"status"``: ``"success"``,`</div><div class="line number3 index2 alt2">`    ``"reference_id"``: ``"1a9b5375-cb75-4c71-9939-eeae550b09ac"``,`</div><div class="line number4 index3 alt1">`    ``"InternalReferenceID"``: ``"1a9b5375-cb75-4c71-9939-eeae550b09ac"`</div><div class="line number5 index4 alt2">`}`</div></div></td></tr></tbody></table>

</div></div></div></div><div class="columnMacro conf-macro output-block" data-hasbody="true" data-macro-id="96733877-01a7-4c30-9e62-30b67dd186b6" data-macro-name="column" id="bkmrk-"><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="7e14d279-ff31-4675-9b93-a0241dbe09e9" data-macro-name="code"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  js" id="bkmrk--1"></div></div></div></div></div>

# Push API: Permit Create

The **Push API: Permit Create** allows OPSCOM administrators to integrate external parking systems directly with the OPSCOM Controller. This RESTful integration automatically synchronizes paid or temporary permit details from third-party hardware and software, such as parking meters, pay stations, and mobile parking applications. By pushing active parking instances into the centralized database, administrators ensure real-time compliance tracking and seamless enforcement across all connected devices.

## Setup and Configuration

Before third-party systems can transmit transaction data into the system, specific environmental settings and authorization keys must be established.

<p class="callout warning">API access is a premium paid feature that requires licensing activation. Organizations must contact their OPSCOM Account Executive to negotiate access and enable the endpoint interface for their environment.</p>

### Admin Side Configuration

1. Secure an authenticated API token from your OPS-COM technical representative.
2. Confirm that all target parking zones match your external hardware naming conventions. Review configuration rules on the *Parking Zone Administration* page to avoid disconnected reporting errors.
3. Distribute the production endpoint URL and unique alphanumeric token to your third-party integration developers or vendors (e.g., HotSpot).

## Using this Feature

The integration relies on an external system triggering HTTP POST requests to the centralized server. The endpoint accepts a standard structured JSON payload containing authorization, vehicle identity, and time boundaries.

### Endpoint Address

`POST [https://controller.operationscommander.io/api/OC-TOMA/v1/permits/push](https://controller.operationscommander.io/api/OC-TOMA/v1/permits/push)`

### Request Header Requirements

External systems must supply the following exact headers within every network transmission:

- `Content-Type: application/json`
- `Accept: application/json`

### Request Payload Examples

#### Raw HTTP Request

<div _ngcontent-ng-c303920272="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c303920272-27 ng-star-inserted" id="bkmrk-http"><span class="ng-tns-c303920272-27">HTTP</span></div>```
POST /api/OC-TOMA/v1/permits/push HTTP/1.1
Host: controller.operationscommander.io
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache

{
    "apiToken": "YOUR-API-TOKEN",
    "Amount": "14.50",
    "CurrencyID": "CAD",
    "LicencePlate": "PL8RDR",
    "zone": "Lot 4",
    "permitNo": "L4-1138",
    "startTime": "2018-07-02T09:00:00",
    "endTime": "2018-07-02T09:30:00",
    "promoCode": "DISCOUNT20"
}
```

<div class="sectionMacroRow" id="bkmrk--1"><div class="columnMacro conf-macro output-block" data-hasbody="true" data-macro-id="d82683ac-7548-4419-a8f9-4dd2f5a2e52e" data-macro-name="column"><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="e0f00b72-fb34-406b-8191-44548c0c6a03" data-macro-name="code"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  text" id="bkmrk-post-%2Fapi%2Foc-toma%2Fv1-1"></div></div></div></div></div></div>### JavaScript XMLHttpRequest Example

<div _ngcontent-ng-c303920272="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c303920272-28 ng-star-inserted" id="bkmrk-javascript"><span class="ng-tns-c303920272-28">JavaScript</span></div>```
var request = new XMLHttpRequest();

request.open('POST', 'https://controller.operationscommander.io/api/OC-TOMA/v1/permits/push');

request.setRequestHeader('Content-Type', 'application/json');
request.setRequestHeader('Accept', 'application/json');

request.onreadystatechange = function () {
  if (this.readyState === 4) {
    console.log('Status:', this.status);
    console.log('Headers:', this.getAllResponseHeaders());
    console.log('Body:', this.responseText);
  }
};

var body = {
    "apiToken": "YOUR-API-TOKEN",
    "Amount": "14.50",
    "CurrencyID": "CAD",
    "LicencePlate": "PL8RDR",
    "zone": "Lot 4",
    "permitNo": "L4-1138",
    "startTime": "2018-07-02T09:00:00",
    "endTime": "2018-07-02T09:30:00",
    "promoCode": "DISCOUNT20"
};

request.send(JSON.stringify(body));
```

<div class="sectionMacroRow" id="bkmrk-var%C2%A0request-%3D%C2%A0new%C2%A0xm"><div class="columnMacro conf-macro output-block" data-hasbody="true" data-macro-id="96733877-01a7-4c30-9e62-30b67dd186b6" data-macro-name="column"><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="27c0aef3-a976-47d7-8822-ce06e320ad25" data-macro-name="code"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  js"></div></div></div></div></div></div>## <span data-colorid="gq5mbr2url">Request Object Attributes</span>

<span data-colorid="gq5mbr2url">The endpoint processes incoming data objects using strict key names. Use the definitions below to map external database variables correctly.</span>

<div class="table-wrap" id="bkmrk-attribute-type-limit"><table class="wrapped confluenceTable tablesorter tablesorter-default" role="grid" style="width: 100%;"><colgroup><col style="width: 13.826%;"></col><col style="width: 8.34185%;"></col><col style="width: 14.6617%;"></col><col style="width: 11.7998%;"></col><col style="width: 13.9452%;"></col><col style="width: 37.5447%;"></col></colgroup><thead><tr class="tablesorter-headerRow" role="row"><th aria-disabled="false" aria-label="Attribute: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="0" role="columnheader" scope="col" tabindex="0">Attribute</th><th aria-disabled="false" aria-label="Type: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="1" role="columnheader" scope="col" tabindex="0">Type</th><th aria-disabled="false" aria-label="Limits: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="2" role="columnheader" scope="col" tabindex="0">Limits</th><th aria-disabled="false" aria-label="Possible Names: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="3" role="columnheader" scope="col" tabindex="0">Possible Names</th><th scope="col">Required / Optional</th><th aria-disabled="false" aria-label="Description: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="4" role="columnheader" scope="col" tabindex="0">Description</th></tr></thead><tbody aria-live="polite" aria-relevant="all"><tr role="row"><td class="confluenceTd">apiToken</td><td class="confluenceTd">String</td><td class="confluenceTd">50-character alphanumeric including dashes

</td><td class="confluenceTd">apiToken</td><td>**Required**</td><td class="confluenceTd">The unique system token supplied by OPSCOM for validation.</td></tr><tr><td class="confluenceTd">LicensePlate</td><td class="confluenceTd">String</td><td class="confluenceTd">25-characters</td><td class="confluenceTd">plate

LicencePlate

</td><td>**Required**</td><td class="confluenceTd"><span style="font-size: 12.0pt; line-height: 115%; font-family: 'Aptos',sans-serif; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Aptos; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">The license plate of the vehicle receiving the parking permission.</span></td></tr><tr role="row"><td class="confluenceTd">Amount</td><td class="confluenceTd">String</td><td class="confluenceTd">9-character decimal</td><td class="confluenceTd">amount

Amount

</td><td>**Optional**

</td><td class="confluenceTd">Transaction amount. Must contain at least 3 digits, two of which are penny values.

The minimum allowable value is $0.01, and the maximum allowable value is $999999.99.

</td></tr><tr role="row"><td class="confluenceTd">CurrencyID</td><td class="confluenceTd">String</td><td class="confluenceTd">10-characters</td><td class="confluenceTd">currency

CurrencyID

</td><td>**Optional**</td><td class="confluenceTd"><span style="font-size: 12.0pt; line-height: 115%; font-family: 'Aptos',sans-serif; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Aptos; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">Transaction currency type. Supported defaults include CAD or USD.</span></td></tr><tr role="row"><td class="confluenceTd">Start Date

</td><td class="confluenceTd">String</td><td class="confluenceTd">20-characters

</td><td class="confluenceTd">startTime

StartDateUtc

</td><td>**Required**

</td><td class="confluenceTd">Must be in the format of Y-m-d\\TH:i:s

e.g. 2000-05-30T14:38:22

For formatting help, see [PHP Date Formatting](http://php.net/manual/en/function.date.php)

</td></tr><tr role="row"><td class="confluenceTd">End Date</td><td class="confluenceTd">String</td><td class="confluenceTd">20-characters

</td><td class="confluenceTd">endTime

EndDateUtc

</td><td>**Required**

</td><td class="confluenceTd">Must be in the format of Y-m-d\\TH:i:s

e.g. 2000-05-30T14:38:22

For formatting help, see [PHP Date Formatting](http://php.net/manual/en/function.date.php)

</td></tr><tr><td>permitNo</td><td>String</td><td>50-characters</td><td>permitNo

</td><td>**Optional**</td><td>The permit identifier or unique receipt ID</td></tr><tr role="row"><td class="confluenceTd">Ticket Number</td><td class="confluenceTd">String</td><td class="confluenceTd">50-characters</td><td class="confluenceTd">TicketNumber

</td><td>**Optional**</td><td class="confluenceTd">The ticket identifier or unique receipt ID</td></tr><tr role="row"><td class="confluenceTd">zone</td><td class="confluenceTd">String</td><td class="confluenceTd">200-characters</td><td class="confluenceTd">zone

ParkingZoneName

</td><td>**Optional**</td><td class="confluenceTd"><span style="font-size: 12.0pt; line-height: 115%; font-family: 'Aptos',sans-serif; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Aptos; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">The localized parking area identifier. This should match an explicit string name inside the system. If t</span>he zone does not match a zone in our system, it will be a disconnected record and may not report properly.

</td></tr><tr><td>promoCode</td><td>String</td><td>50-characters</td><td>promoCode

</td><td>**Optional**</td><td><span style="font-size: 12.0pt; line-height: 115%; font-family: 'Aptos',sans-serif; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Aptos; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;">Alphanumeric validation string detailing applied customer discounts, validation codes, or free parking promotional campaigns (e.g., HotSpot promo keys).</span>

</td></tr></tbody></table>

</div>### API Server Responses

#### Successful Response

Upon successfully accepting and writing a record to the database, the server transmits an HTTP status code `200 OK` along with a tracking object.

## Successful Response

The response will be a json object. Content-Type: application/json

<div _ngcontent-ng-c303920272="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c303920272-29 ng-star-inserted" id="bkmrk-json"><span class="ng-tns-c303920272-29">JSON</span></div>```
{
    "status": "success",
    "reference_id": "1a9b5375-cb75-4c71-9939-eeae550b09ac",
    "InternalReferenceID": "1a9b5375-cb75-4c71-9939-eeae550b09ac"
}
```

## <span style="color: rgb(22, 145, 121);">Best Practices and Considerations</span>

- <span style="color: rgb(22, 145, 121);">**Audit third-party zone names precisely.** Ensure that zone names passed into the **zone** parameter exactly match your current system setup. If an external pay station pushes a value that does not correspond with a recognized lot name, it registers as a disconnected record and fails to populate correctly within enforcement reports.</span>
- <span style="color: rgb(22, 145, 121);">**Validate promotional campaign metrics.** When working with mobile applications like HotSpot, instruct vendors to map their promotional parameters to the **promoCode** field. Administrators can track usage and verify free or discounted transaction validity by auditing the dedicated promotional code column found on the *Paystation Status* page.</span>
- <span style="color: rgb(22, 145, 121);">**Adhere strictly to UTC string constraints.** Confirm that your developers match the ISO-8601 date formatting style explicitly for **startTime** and **endTime**. For technical validation, reference the *PHP Date Formatting* development rules.</span>

<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="db38aafe-8712-40c9-8a94-4303ba5151c0" data-macro-name="code" id="bkmrk-%7B-%C2%A0%C2%A0%C2%A0%C2%A0%22status%22%3A%C2%A0%22suc"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  js" id="bkmrk-%7B-%C2%A0%C2%A0%C2%A0%C2%A0%22status%22%3A%C2%A0%22suc-1"></div></div></div></div><div class="sectionMacroRow" id="bkmrk--4"><div class="columnMacro conf-macro output-block" data-hasbody="true" data-macro-id="96733877-01a7-4c30-9e62-30b67dd186b6" data-macro-name="column"><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="27c0aef3-a976-47d7-8822-ce06e320ad25" data-macro-name="code"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  js" id="bkmrk--5"></div></div></div></div></div></div>

# Push API: Permit Update

<p class="callout info"><span data-colorid="h5go72n8lk">API access is a paid feature and must be granted by OPSCOM. Email your Account Executive to negotiate access. </span></p>

The OPSCOM Controller provides a simple JSON based API to integrate with. Clients use this API to directly feed paid permit details into OPSCOM from other systems such as Parking Apps.

Make sure you set the HTTP Content-Type header to be application/json.

## <span data-colorid="i82mzfit94">Making API Requests</span>

### Raw Request:

<div class="sectionMacroRow" id="bkmrk-post-%2Fapi%2Foc-toma%2Fv1"><div class="columnMacro conf-macro output-block" data-hasbody="true" data-macro-id="d82683ac-7548-4419-a8f9-4dd2f5a2e52e" data-macro-name="column"><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="3628c7b8-0e3b-4ad3-8cd3-23cd3d72d42d" data-macro-name="code"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  text" id="bkmrk-post-%2Fapi%2Foc-toma%2Fv1-1"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2">`POST /api/OC-TOMA/v1/permits/update HTTP/1.1`</div><div class="line number2 index1 alt1">`Host: controller.operationscommander.io`</div><div class="line number3 index2 alt2">`Accept: application/json`</div><div class="line number4 index3 alt1">`Content-Type: application/json`</div><div class="line number5 index4 alt2">`Cache-Control: no-cache`</div><div class="line number6 index5 alt1"> </div><div class="line number7 index6 alt2">`{`</div><div class="line number8 index7 alt1">`    ``"apiToken": "YOUR-API-TOKEN",`</div><div class="line number9 index8 alt2">`    ``"referenceID": "PREVIOUS-REFERENCE-ID",`</div><div class="line number10 index9 alt1">`    ``"plate": "PL8RDR",`</div><div class="line number11 index10 alt2">`    ``"Amount": "14.50",`</div><div class="line number12 index11 alt1">`    ``"currency": "CAD",`</div><div class="line number13 index12 alt2">`    ``"endTime": "2018-07-02T09:30:00"`</div><div class="line number14 index13 alt1">`}`</div></div></td></tr></tbody></table>

</div></div></div></div></div><div class="columnMacro conf-macro output-block" data-hasbody="true" data-macro-id="96733877-01a7-4c30-9e62-30b67dd186b6" data-macro-name="column">  
</div></div>### JavaScript Request:

<div class="sectionMacroRow" id="bkmrk-var%C2%A0request-%3D%C2%A0new%C2%A0xm"><div class="columnMacro conf-macro output-block" data-hasbody="true" data-macro-id="96733877-01a7-4c30-9e62-30b67dd186b6" data-macro-name="column"><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="b10a8ba8-3a1d-4764-9a4e-c63537336cd5" data-macro-name="code"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  js"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2">`var` `request = ``new` `XMLHttpRequest();`</div><div class="line number2 index1 alt1"> </div><div class="line number3 index2 alt2">`request.open(``'POST'``, ``'<a href="https://controller.operationscommander.io/api/OC-TOMA/v1/permits/update'">https://controller.operationscommander.io/api/OC-TOMA/v1/permits/update'</a>``);`</div><div class="line number4 index3 alt1"> </div><div class="line number5 index4 alt2">`request.setRequestHeader(``'Content-Type'``, ``'application/json'``);`</div><div class="line number6 index5 alt1">`request.setRequestHeader(``'Accept'``, ``'application/json'``);`</div><div class="line number7 index6 alt2"> </div><div class="line number8 index7 alt1">`request.onreadystatechange = ``function` `() {`</div><div class="line number9 index8 alt2">`  ``if` `(``this``.readyState === 4) {`</div><div class="line number10 index9 alt1">`    ``console.log(``'Status:'``, ``this``.status);`</div><div class="line number11 index10 alt2">`    ``console.log(``'Headers:'``, ``this``.getAllResponseHeaders());`</div><div class="line number12 index11 alt1">`    ``console.log(``'Body:'``, ``this``.responseText);`</div><div class="line number13 index12 alt2">`  ``}`</div><div class="line number14 index13 alt1">`};`</div><div class="line number15 index14 alt2"> </div><div class="line number16 index15 alt1"> </div><div class="line number17 index16 alt2">`var` `body = {`</div><div class="line number18 index17 alt1">`    ``"apiToken"``: ``"YOUR-API-TOKEN"``,`</div><div class="line number19 index18 alt2">`    ``"referenceID"``: ``"PREVIOUS-REFERENCE-ID"``,`</div><div class="line number20 index19 alt1">`    ``"plate"``: ``"PL8RDR"``,`</div><div class="line number21 index20 alt2">`    ``"Amount"``: ``"14.50"``,`</div><div class="line number22 index21 alt1">`    ``"currency"``: ``"CAD"``,`</div><div class="line number23 index22 alt2">`    ``"endTime"``: ``"2018-07-02T09:30:00"`</div><div class="line number24 index23 alt1">`}`</div><div class="line number25 index24 alt2">`request.send(JSON.stringify(body));`</div></div></td></tr></tbody></table>

</div></div></div></div></div></div>## <span data-colorid="g19uwjzxss">Request Object Attributes</span>

<div class="table-wrap" id="bkmrk-attribute-type-limit"><table class="wrapped confluenceTable tablesorter tablesorter-default" role="grid"><colgroup><col></col><col></col><col></col><col></col><col></col></colgroup><thead><tr class="tablesorter-headerRow" role="row"><th aria-disabled="false" aria-label="Attribute: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="0" role="columnheader" scope="col" tabindex="0">Attribute</th><th aria-disabled="false" aria-label="Type: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="1" role="columnheader" scope="col" tabindex="0">Type</th><th aria-disabled="false" aria-label="Limits: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="2" role="columnheader" scope="col" tabindex="0">Limits</th><th aria-disabled="false" aria-label="Possible Names: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" data-column="3" role="columnheader" scope="col" tabindex="0">Possible Names</th><th aria-disabled="false" aria-label="Description: No sort applied, activate to apply an ascending sort" aria-sort="none" class="confluenceTh tablesorter-header sortableHeader tablesorter-headerUnSorted" colspan="1" data-column="4" role="columnheader" scope="col" tabindex="0">Description</th></tr></thead><tbody aria-live="polite" aria-relevant="all"><tr role="row"><td class="confluenceTd" colspan="1">apiToken</td><td class="confluenceTd" colspan="1">String</td><td class="confluenceTd" colspan="1">50-character alphanumeric including dashes

</td><td class="confluenceTd" colspan="1">apiToken</td><td class="confluenceTd" colspan="1">**(Required)** Your supplied API Token.</td></tr><tr role="row"><td class="confluenceTd" colspan="1">Reference ID

</td><td class="confluenceTd" colspan="1">String</td><td class="confluenceTd" colspan="1">50-character alphanumeric including dashes</td><td class="confluenceTd" colspan="1">referenceid

referenceID

reference\_id

</td><td class="confluenceTd" colspan="1">**(Required)** This value is supplied to when the permit push api is successful.

e.g. 1a9b5375-cb75-4c71-9939-eeae550b09ac

</td></tr><tr role="row"><td class="confluenceTd" colspan="1">End Date</td><td class="confluenceTd" colspan="1">String</td><td class="confluenceTd" colspan="1">20-characters

Y-m-d\\TH:i:s format.

</td><td class="confluenceTd" colspan="1">endTime

EndDateUtc

</td><td class="confluenceTd" colspan="1">*(Optional)* Must be in the format of Y-m-d\\TH:i:s

e.g. 2000-05-30T14:38:22

For formatting help, see [PHP Date Formatting](http://php.net/manual/en/function.date.php)

</td></tr><tr role="row"><td class="confluenceTd" colspan="1">License Plate</td><td class="confluenceTd" colspan="1">String</td><td class="confluenceTd" colspan="1">25-characters</td><td class="confluenceTd" colspan="1">plate

LicencePlate

</td><td class="confluenceTd" colspan="1">*(Optional)* The plate of the vehicle.</td></tr><tr role="row"><td class="confluenceTd" colspan="1">Amount</td><td class="confluenceTd" colspan="1">String</td><td class="confluenceTd" colspan="1">9-character decimal</td><td class="confluenceTd" colspan="1">amount

Amount

</td><td class="confluenceTd" colspan="1">*(Optional)* Transaction amount This must contain at least 3 digits, two of which are penny values.

The minimum allowable value is $0.01, and the maximum allowable value is $999999.99.

</td></tr><tr role="row"><td class="confluenceTd" colspan="1">Currency</td><td class="confluenceTd" colspan="1">String</td><td class="confluenceTd" colspan="1">10-characters</td><td class="confluenceTd" colspan="1">currency

CurrencyID

</td><td class="confluenceTd" colspan="1">*(Optional)* CAD, USD</td></tr></tbody></table>

</div>## Successful Response

The response will be a json object. The same reference id will be returned.

Content-Type: application/json

<div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="81852e34-68eb-40c1-bbe1-6bea340375f6" data-macro-name="code" id="bkmrk-%7B-%C2%A0%C2%A0%C2%A0%C2%A0%22status%22%3A%C2%A0%22suc"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  js" id="bkmrk-%7B-%C2%A0%C2%A0%C2%A0%C2%A0%22status%22%3A%C2%A0%22suc-1"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="code"><div class="container" title="Hint: double-click to select code"><div class="line number1 index0 alt2">`{`</div><div class="line number2 index1 alt1">`    ``"status"``: ``"success"``,`</div><div class="line number3 index2 alt2">`    ``"reference_id"``: ``"1a9b5375-cb75-4c71-9939-eeae550b09ac"``,`</div><div class="line number4 index3 alt1">`    ``"InternalReferenceID"``: ``"1a9b5375-cb75-4c71-9939-eeae550b09ac"`</div><div class="line number5 index4 alt2">`}`</div></div></td></tr></tbody></table>

</div></div></div></div><div class="sectionMacroRow" id="bkmrk-"><div class="columnMacro conf-macro output-block" data-hasbody="true" data-macro-id="96733877-01a7-4c30-9e62-30b67dd186b6" data-macro-name="column"><div class="code panel pdl conf-macro output-block" data-hasbody="true" data-macro-id="b10a8ba8-3a1d-4764-9a4e-c63537336cd5" data-macro-name="code"><div class="codeContent panelContent pdl"><div><div class="syntaxhighlighter sh-midnight nogutter  js" id="bkmrk--1"></div></div></div></div></div></div>