Pixian.AI offers a unique face stickers API. The API creates fun and festive cutouts of faces, useful for both pets and people.
POST a bitmap image and get a face sticker result back:
$ curl https://api.pixian.ai/api/v2/face-sticker \ -u xyz123:[secret] \ -F image=@example.jpeg \ -o pixian_result.png
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent Request request = Request.post("https://api.pixian.ai/api/v2/face-sticker") .addHeader("Authorization", "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd") .body( MultipartEntityBuilder.create() .addBinaryBody("image", new File("example.jpeg")) // TODO: Replace with your image // TODO: Add more upload parameters here .build() ); ClassicHttpResponse response = (ClassicHttpResponse) request.execute().returnResponse(); if (response.getCode() == 200) { // Write result to disk, TODO: or wherever you'd like try (FileOutputStream out = new FileOutputStream("pixian_result.png")) { response.getEntity().writeTo(out); } } else { System.out.println("Request Failed: Status: " + response.getCode() + ", Reason: " + response.getReasonPhrase()); }
using (var client = new HttpClient()) using (var form = new MultipartFormDataContent()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "INSERT_API_KEY_HERE"); form.Add(new ByteArrayContent(File.ReadAllBytes("example.jpeg")), "image", "example.jpeg"); // TODO: Replace with your image // TODO: Add more upload parameters here var response = client.PostAsync("https://api.pixian.ai/api/v2/face-sticker", form).Result; if (response.IsSuccessStatusCode) { // Write result to disk, TODO: or wherever you'd like FileStream outStream = new FileStream("pixian_result.png", FileMode.Create, FileAccess.Write, FileShare.None); response.Content.CopyToAsync(outStream).ContinueWith((copyTask) => { outStream.Close(); }); } else { Console.WriteLine("Request Failed: Status: " + response.StatusCode + ", Reason: " + response.ReasonPhrase); } }
// Requires "request" to be installed (see https://www.npmjs.com/package/request) var request = require('request'); var fs = require('fs'); request.post({ url: 'https://api.pixian.ai/api/v2/face-sticker', formData: { image: fs.createReadStream('example.jpeg'), // TODO: Replace with your image // TODO: Add more upload options here }, auth: {user: 'xyz123', pass: '[secret]'}, followAllRedirects: true, encoding: null }, function(error, response, body) { if (error) { console.error('Request failed:', error); } else if (!response || response.statusCode != 200) { console.error('Error:', response && response.statusCode, body.toString('utf8')); } else { // Save result fs.writeFileSync("pixian_result.png", body); } });
$ch = curl_init('https://api.pixian.ai/api/v2/face-sticker'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd')); curl_setopt($ch, CURLOPT_POSTFIELDS, array( 'image' => curl_file_create('example.jpeg'), // TODO: Add more upload options here )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $data = curl_exec($ch); if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200) { // Save result file_put_contents("pixian_result.png", $data); } else { echo "Error: " . $data; } curl_close($ch);
# Requires "requests" to be installed (see https://pypi.org/project/requests/) import requests response = requests.post( 'https://api.pixian.ai/api/v2/face-sticker', files={'image': open('example.jpeg', 'rb')}, data={ # TODO: Add more upload options here }, auth=('xyz123', '[secret]') ) if response.status_code == requests.codes.ok: # Save result with open('pixian_result.png', 'wb') as out: out.write(response.content) else: print("Error:", response.status_code, response.text)
# Requires: gem install httpclient require 'httpclient' client = HTTPClient.new default_header: { "Authorization" => "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd" } response = client.post("https://api.pixian.ai/api/v2/face-sticker", { "image" => File.open("example.jpeg", "rb"), # TODO: Replace with your image # TODO: Add more upload parameters here }) if response.status == 200 then # Write result to disk, TODO: or wherever you'd like File.open("pixian_result.png", 'w') { |file| file.write(response.body) } else puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason end
$ curl https://api.pixian.ai/api/v2/face-sticker \ -u xyz123:[secret] \ -F 'image.url=https://example.com/example.jpeg' \ -o pixian_result.png
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent Request request = Request.post("https://api.pixian.ai/api/v2/face-sticker") .addHeader("Authorization", "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd") .body( MultipartEntityBuilder.create() .addTextBody("image.url", "https://example.com/example.jpeg") // TODO: Replace with your image URL // TODO: Add more upload parameters here .build() ); ClassicHttpResponse response = (ClassicHttpResponse) request.execute().returnResponse(); if (response.getCode() == 200) { // Write result to disk, TODO: or wherever you'd like try (FileOutputStream out = new FileOutputStream("pixian_result.png")) { response.getEntity().writeTo(out); } } else { System.out.println("Request Failed: Status: " + response.getCode() + ", Reason: " + response.getReasonPhrase()); }
using (var client = new HttpClient()) using (var form = new MultipartFormDataContent()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "INSERT_API_KEY_HERE"); form.Add(new StringContent("https://example.com/example.jpeg"), "image.url"); // TODO: Replace with your image URL // TODO: Add more upload parameters here var response = client.PostAsync("https://api.pixian.ai/api/v2/face-sticker", form).Result; if (response.IsSuccessStatusCode) { // Write result to disk, TODO: or wherever you'd like FileStream outStream = new FileStream("pixian_result.png", FileMode.Create, FileAccess.Write, FileShare.None); response.Content.CopyToAsync(outStream).ContinueWith((copyTask) => { outStream.Close(); }); } else { Console.WriteLine("Request Failed: Status: " + response.StatusCode + ", Reason: " + response.ReasonPhrase); } }
// Requires "request" to be installed (see https://www.npmjs.com/package/request) var request = require('request'); var fs = require('fs'); request.post({ url: 'https://api.pixian.ai/api/v2/face-sticker', formData: { 'image.url': 'https://example.com/example.jpeg', // TODO: Replace with your image // TODO: Add more upload options here }, auth: {user: 'xyz123', pass: '[secret]'}, followAllRedirects: true, encoding: null }, function(error, response, body) { if (error) { console.error('Request failed:', error); } else if (!response || response.statusCode != 200) { console.error('Error:', response && response.statusCode, body.toString('utf8')); } else { // Save result fs.writeFileSync("pixian_result.png", body); } });
$ch = curl_init('https://api.pixian.ai/api/v2/face-sticker'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd')); curl_setopt($ch, CURLOPT_POSTFIELDS, array( 'image.url' => 'https://example.com/example.jpeg', // TODO: Add more upload options here )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $data = curl_exec($ch); if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200) { // Save result file_put_contents("pixian_result.png", $data); } else { echo "Error: " . $data; } curl_close($ch);
# Requires "requests" to be installed (see https://pypi.org/project/requests/) import requests response = requests.post( 'https://api.pixian.ai/api/v2/face-sticker', data={ 'image.url': 'https://example.com/example.jpeg', # TODO: Add more upload options here }, auth=('xyz123', '[secret]') ) if response.status_code == requests.codes.ok: # Save result with open('pixian_result.png', 'wb') as out: out.write(response.content) else: print("Error:", response.status_code, response.text)
# Requires: gem install httpclient require 'httpclient' client = HTTPClient.new default_header: { "Authorization" => "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd" } response = client.post("https://api.pixian.ai/api/v2/face-sticker", { "image.url" => "https://example.com/example.jpeg", # TODO: Replace with your image URL # TODO: Add more upload parameters here }) if response.status == 200 then # Write result to disk, TODO: or wherever you'd like File.open("pixian_result.png", 'w') { |file| file.write(response.body) } else puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason end
It is free to integrate with and test out the API, no purchase required.
Just use test=true
for development. You can assess the result quality using the interactive Web App on the front page.
Production results require a credit pack purchase. Please see the pricing page.
The API uses standard HTTP basic access authentication. All requests to the API must be made over HTTPS and include your API Credentials, with the API Id as the user and API Secret as the password.
Your http client library must support Server Name Indication (SNI) to successfully make requests. If you're getting weird handshake errors, this is most likely it.
Usage of the API is rate limited with generous allowances and no hard upper bound.
During normal end-user-driven operation you are unlikely to run into any rate limiting as usage then tends to ebb and flow in a way that the service handles gracefully.
However, for batch jobs we recommend starting out with at most 5 threads, adding 1 new thread every 5 minutes until you have reached the desired level of parallelism. Please reach out before starting if you need more than 100 concurrent threads.
If you submit too many requests you will start getting 429 Too Many Requests
responses. When this happens you should apply linear back off: on the first such response, wait 5 seconds until submitting the next request. On the second consecutive 429 response, wait 2*5=10 seconds until submitting the next request. On the third wait 3*5=15 seconds, etc.
You can reset the back off counter after a successful request, and you should apply the back off on a per-thread basis (i.e. the threads should operate independently of each other).
While API requests are normally completed within seconds, it is possible during transient load spikes to experience longer processing times.
To ensure your client library doesn't prematurely terminate API requests it should be configured with an idle timeout of at least 180 seconds.
We use conventional HTTP statuses to indicate success or failure of an API request, and include important error information in the returned Error JSON Object.
We strive to always return an Error JSON Object with any problematic request. However, it is always theoretically possible to have internal server failures that lead to a non-JSON error response.
Attributes |
|
---|---|
status | The HTTP status of the response, repeated here to help with debugging. |
code | Pixian.AI internal error code. |
message | Human-readable error message, intended to be helpful in debugging. |
If the HTTP status for your request is 200 then no Error JSON Object will be returned, and you can safely assume that the request broadly speaking succeeded.
Some HTTP Client libraries raise exceptions for HTTP statuses in the 400
-599
range. You will need to catch those exceptions and handle them appropriately.
HTTP Status | Meaning |
---|---|
200 -299
|
Success |
400 -499
|
There's a problem with the information provided in the request (e.g. a parameter was missing). Please review the error message to figure out how to fix it. |
500 -599
|
There's been a Pixian.AI internal error. Wait a moment then try again, and if the problem persists please email us. |
Example Error Response
{ "error" : { "status" : 400, "code" : 1006, "message" : "Failed to read the supplied image. " } }
POST
https://api.pixian.ai/api/v2/face-sticker
To get a face sticker from an image, you do a standard HTTP POST file upload. Keep in mind that the Content-Type has to be multipart/form-data
when uploading binary files.
Date | Change |
---|---|
Apr 11, 2024 | Initial release. |