McAPI - Barcode API Python

Python sample code to create barcodes with the McAPI Barcode REST API service. All sample code was written in Python 3 but the API can also be used with older versions. For encoding Unicode / utf-8 content, Python 3 is preferred. Make sure to install the requests module, e.g. with PIP:

$ python3 -m pip install requests

Requirements: A free RapidAPI account. Replace YOUR_API_KEY in the snippets below with your RapidAPI key.

All samples below work with the free tier of the API, see RapidAPI McAPI Barcode Listing for available plans.

See the overview page for a reference that lists all available parameters and error codes.

Create a Barcode using Python with the requests module

Shown is the creation of a Code 128 (code type: 7) with Python 3 encoding the text "123456". The module width is set to 0.5mm, the height is set to 20mm, the size of the human readable text under the barcode is set to 10 points. The code is returned as a base64 encoded PDF.

The source code:

# Python 3
  
import requests

url = 'https://mcapi-barcode.p.rapidapi.com/'

payload = '{\
  "data": "123456",\
  "type": 7,\
  "moduleWidth": 0.5,\
  "moduleHeight": 20,\
  "format": "pdf"\
}'
headers = {
  'content-type': 'application/json',
  'x-rapidapi-key': 'YOUR_API_KEY',
  'x-rapidapi-host': 'mcapi-barcode.p.rapidapi.com'
}

response = requests.request('POST', url, data=payload.encode('utf-8'), headers=headers)

The data will be delivered in response.text, e.g.:

{
  "service":"McAPI Barcode Generator, https://mcapi.io",
  "version":"V1",
  "format":"pdf",
  "code":"data:application/pdf;base64,JVBE ... Cg=="
}

McAPI Barcode API - Sample barcode with Python

The returned code from the Python request:

Image of McAPI Barcode API Sample Barcode Python

Note that we are encoding the payload as "utf-8". While not strictly neccessary for most barcode types, it's a requirement when creating QR codes which are Unicode capable.

Creating retail barcodes EAN, ISBN, UPC with Python

The introductory sample above created a Code 128 barcode. Code 128 has many applications, mostly in warehousing and logistics. In the following Python snippet we show how to create EAN and UPC barcodes which are used in retail.

Let's create an EAN 13 code. First step is to set the code type. The reference section lists all available code types; for EAN 13, we have to set the type-parameter to "1". With Code 128, we set the size of the code by specifing values for moduleWidth and moduleHeight. Retail codes are standardized, with the standard specifying the permitted sizes (so called SC sizes). With the Barcode API, the size of retail barcodes is determined through the size-parameter, with "2" being the 100% size. Here's the payload block for creating an EAN 13 encoding "401234567890", again returning a PDF:

# Python 3

...

payload = '{\
  "data": "401234567890",\
  "type": 1,\
  "size": 2,\
  "format": "pdf"\
}'

...

Here's the resulting EAN 13:

Image of McAPI Barcode API EAN 13 Barcode Python

As an aside, the reference section also specifies the expected data for each barcode symbology. EAN 13 encodes twelve digits plus check digit (hence the name). As such you'll have to specify twelve or thirteen digits, less than twelve or more than thirteen will result in an error, likewise if the submitted data contains letters. As a convenience, the API will always recalculate the check digit for retail codes to make sure that a valid symbol is created; in this example the EAN 13 check digit is "1" which will be appended automatically to the provided data.

Incidentally, the ">" to the right of the code is called the light margin indicator. This tells the graphics designer not to put other graphical elements too close to the code. The indicator can be switched off by setting the lmi-parameter to "false".

EAN 13 with reduced height (Python)

As you can see, EAN codes can get quite large, with small boxes or packages the code might not fit into the available space. Per the standard, it's permitted to reduce the height of the code to some degree. The Barcode API supports a special truncate-parameter for retail codes. The parameter is percentage based, e.g. "50" will create a code with half height.

Sample payload block:

# Python 3

...

payload = '{\
  "data": "401234567890",\
  "type": 1,\
  "size": 2,\
  "truncate": 50,\
  "format": "pdf"\
}'

...

Here's the resulting EAN 13 with half height:

Image of McAPI Barcode API EAN 13 Truncated Barcode Python

EAN 13 with additional text (Python)

A very useful feature of the Barcode API is the support for additional text that can be put above and below the barcode. This can be used for article numbers, lot size, pricing, weight, best before dates etc.

The parameters over, under and suppSize control any additional text. The following payload block will put the text "Paperclips" above the code, the text "$2.99" below the code and set the font size for the additional text to 8pt.:

# Python 3

...

payload = '{\
  "data": "401234567890",\
  "type": 1,\
  "size": 2,\
  "truncate": 50,\
  "over": "Paperclips",\
  "under": "$2.99",\
  "suppSize": 8,\
  "format": "pdf"\
}'

...

The resulting EAN 13 with additional text:

Image of McAPI Barcode API EAN 13 Price Best before Barcode Python

Note: Additional text must be from the ASCII character set, Unicode is not supported.

Creating an EAN barcode without text (Python)

Sometimes you will only want the actual barcode without any text at all; that's possible too: Simply specify the hrText-parameter as "false", like so:

# Python 3
  
...

payload = '{\
  "data": "401234567890",\
  "type": 1,\
  "size": 2,\
  "truncate": 50,\
  "hrText": "false",\
  "format": "pdf"\
}'

...

The resulting EAN 13 without any text:

Image of McAPI Barcode API EAN 13 No text Barcode Python

Creating 2D matrix barcodes with Python 3

The Barcode API supports the most common 2D barcode symbologies: Datamatrix, Datamatrix GS1, PDF417, QR and Aztec. Creating those codes is no different from ordinary, linear barcodes; the only aspect to consider is using the moduleWidth-parameter to control the size of the code. With the exception of PDF417, dots are square, i.e. moduleWidth equals moduleHeight. With PDF417, the dots are created with a 3:1 ratio, i.e. moduleHeight equals 3 * moduleWidth.

The following payload block will create a Datamatrix code (type = "16") with a dot size of 1x1mm²:

# Python 3

...

payload = '{\
  "data": "1234567890",\
  "type": 16,\
  "moduleWidth": 1,\
  "format": "pdf"\
}'

...

The resulting Datamatrix code:

Image of McAPI Barcode API Datamatrix 2D Barcode Python

2D barcodes are always created without text as the encoded data is typically too much to be displayed. Use the over and under parameters to put small amounts of text (max. 30 chars) next to the code.

Create QR codes with Python 3

The Barcode API supports the creation of QR codes that can contain plain text, URLs, email addresses, phone numbers and SMS numbers. Our QR implementation is fully Unicode-compatible but remember to encode the data as utf-8 as outlined in the introduction.

Specify content as follows:

  • Plain text (max. 2,000 chars): "123456abcdefÄÖÜ日本語"
  • URL: Specify data param like so: "https://example.com"
  • Email: Specify data param like so: "mailto:info@example.com"
  • Phone no: Specify data param like so: "tel:+18005551234"
  • SMS: Specify data param like so: "smsto:44044"

Sample payload block to create a QR code with the URL "https://mcapi.io":

# Python 3

...

payload = '{\
  "data": "https://mcapi.io",\
  "type": 19,\
  "moduleWidth": 1,\
  "format": "pdf"\
}'

...

The resulting QR code:

Image of McAPI Barcode API QR URL Barcode Python

The header-parameter - writing barcodes to a file (Python)

With all supported formats, the barcode is returned as a base64 encoded string. Per default, this string is preceded by a header that describes the media type (or MIME) of the string.

Sample payload block for a QR code, to be returned as a PNG:

# Python 3
  
...

payload = '{\
  "data": "https://mcapi.io",\
  "type": 19,\
  "moduleWidth": 1,\
  "format": "png"\
}'

...

The result will look like this:

{
  "service":"McAPI Barcode Generator, https://mcapi.io",
  "version":"V1",
  "format":"png",
  "code":"data:image/png;base64,iVBOR ... QmCC"
}

After parsing the result with a JSON parser you can directly set the "code"-string as the src property of an img tag, like so:

# Python 3

import json
...

if response.status_code == 200:
  # In real life you would put the JSON parser in a try/except block 
  barcode = json.loads(response.text)['code']
  print('<img src="' + barcode + '"/>')
else:
  print("Error")

...

The MIME header will make sure that the image data is interpreted correctly by the browser. However, when writing the image data to a file, including the header would result in a corrupt file. To create a code without the header, set the header-parameter to "false", like so:

# Python 3
  
...

payload = '{\
  "data": "https://mcapi.io",\
  "type": 19,\
  "moduleWidth": 1,\
  "header": "false",\
  "format": "png"\
}'

...

The returned code without header:

{
  "service":"McAPI Barcode Generator, https://mcapi.io",
  "version":"V1",
  "format":"png",
  "code":"iVBOR ... QmCC"
}

Now, all we have to do is decode the base64 string and then write the barcode image to a file. Shown as a complete example:

# Python 3

import requests
import json
import base64

url = 'https://mcapi-barcode.p.rapidapi.com/'

payload = '{\
  "data": "https://mcapi.io",\
  "type": 19,\
  "moduleWidth": 1,\
  "header": "false",\
  "format": "png"\
}'
headers = {
  'content-type': 'application/json',
  'x-rapidapi-key': 'YOUR_API_KEY',
  'x-rapidapi-host': 'mcapi-barcode.p.rapidapi.com'
}

response = requests.request('POST', url, data=payload.encode('utf-8'), headers=headers)
if response.status_code == 200:
  # In real life you would put the JSON parser in a try/except block 
  barcode = json.loads(response.text)['code']
  png = base64.b64decode(barcode)
  with open('barcode.png', 'wb') as f:
    f.write(png)
else:
  print("Error")

Back to McAPI Barcode API main page.