NAV Navbar

ToDoListApp

REST API JavaScript TypeScript Android Swift Objective-C PHP .NET

Introduction

The ToDoListApp API Documentation provides an easy way to connect your App to Back4App and use all the backend resources provided by Back4App Platform.

The API closely follows REST semantics, uses JSON to encode objects, relies on standard HTTP codes to signal operation outcomes, and is mostly generated through Parse Server.

The API documentation below is specifically generated for your app ToDoListApp by Back4App Platform. If you make changes to your app's backend schema (using Parse Server Dashboard, Back4App CLI or even these APIs), the API interface for those fields will change correspondingly, and those changes will be reflected here.

Getting Started

Since these are RESTful APIs, you are free to use your preferred technology to perform HTTP requests according to this documentation. Although we highly encourage you to use them through one of the Parse SDKs for a faster and better development experience. Please find below how to install each of the supported SDKs.

Installing Parse SDK

There is not a specific Parse SDK for cURL and you just need to make sure that cURL is installed in your machine. Most of the Operational Systems bring cURL installed by default, but you can also download the latest version of it in cURL Official Web-Site.

Install Parse JavaScript SDK npm module:

npm install parse

You do not need to install nor initialize JavaScript SDK when creating Cloud Code Functions since it is installed and initialized by default.

For a React Native project:

npm install @react-native-async-storage/async-storage
npm install parse/react-native

In a Node.js project:

const Parse = require('parse/node');

Parse.serverURL = 'https://parseapi.back4app.com'; // This is your Server URL
// Remember to inform BOTH the Back4App Application ID AND the JavaScript KEY
Parse.initialize(
  'BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f', // This is your Application ID
  '4wPYRKbpTJeCdmFNaS31AiQZ8344aaYubk6Uo8VW', // This is your Javascript key
  '5AVAtvlGlG5cEeolatkFDhY5p99PzoBUvm7MBLMo' // This is your Master key (never use it in the frontend)
);

Install Parse JavaScript SDK npm module:

npm install parse
npm install @types/parse

For a React Native project:

npm install @react-native-async-storage/async-storage
npm install parse/react-native
npm install @types/parse

In a Node.js project:

const Parse = require('parse/node');

Parse.serverURL = 'https://parseapi.back4app.com'; // This is your Server URL
// Remember to inform BOTH the Back4App Application ID AND the JavaScript KEY
Parse.initialize(
  'BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f', // This is your Application ID
  '4wPYRKbpTJeCdmFNaS31AiQZ8344aaYubk6Uo8VW', // This is your Javascript key
  '5AVAtvlGlG5cEeolatkFDhY5p99PzoBUvm7MBLMo' // This is your Master key (never use it in the frontend)
);

In order to install the Parse-SDK-Android as a Gradle dependency, add this in your root build.gradle file (not your module build.gradle file!)

allprojects {
  repositories {
    ...
    maven { url "https://jitpack.io" }
  }
}

And in your module build.gradle file, add the following:

dependencies {
    ...
    implementation "com.github.parse-community.Parse-SDK-Android:parse:1.18.5"
}

Notice that the version of Parse-SDK-Android was 1.18.5 when this documentation was released. To find the latest version, check here.

There are a plenty of ways to install Parse SDK:

Option 1: Using Carthage. Add the following line to your Cartfile:

github "parse-community/Parse-SDK-iOS-OSX"
github "parse-community/Parse-SDK-iOS-OSX"

Run carthage update and it should be installed in your Carthage folder.

Option 2: Using CocoaPods. Add the following line to your Podfile:

pod 'Parse'
pod 'Parse'

Run pod install and open the generated .xcworkspace on Xcode, in order to avoid the linker error.

Option 3: Downloading the latest build here.

Option 4: Cloning the project and compiling manually:

git clone https://github.com/parse-community/Parse-SDK-iOS-OSX.git
cd ./Parse-SDK-iOS-OSX

# To pull in extra dependencies (Bolts and OCMock)
git submodule update --init --recursive

# To install all the gems
bundle install

# Build & Package the Frameworks
rake package:frameworks
git clone https://github.com/parse-community/Parse-SDK-iOS-OSX.git
cd ./Parse-SDK-iOS-OSX

# To pull in extra dependencies (Bolts and OCMock)
git submodule update --init --recursive

# To install all the gems
bundle install

# Build & Package the Frameworks
rake package:frameworks

Follow these instructions below to install .NET + Xamarin SDK usign NuGet Package

// Using Package Manager
Install-Package parse -Version 1.7.0

// Using .NET CLI
dotnet add package parse --version 1.7.0

Or install a specific release from SDK repository

SDK requires Visual Studio 2012 or Xamarin Studio and targets .NET 4.5 applications, Windows Store apps, Windows Phone 8 apps, and Xamarin.iOS 6.3+ or Xamarin.Android 4.7+ apps.

In order to Parse-SDK work properly, make sure you have at least PHP 5.4 or HHVM 3.0 installed.

Installing with Composer: Create a composer.json file in your project root folder, and add the following:

{
  "require": {
    "parse/php-sdk" : "1.4.*"
  }
}

Run the following command on your terminal to install the Parse-SDK and setup the autoloader:

composer install

And then require the autoloader on your PHP script to automatically load the Parse SDK classes:

require 'vendor/autoload.php';

Installing with Git: Clone the Parse-SDK repository using your terminal:

git clone https://github.com/parse-community/parse-php-sdk.git

And then require the autoloader in your PHP script to automatically load the Parse SDK classes:

require 'autoload.php';

Please choose below one of the Parse SDKs and learn how to install it using the instructions that you can find in the right panel of this documentation.

It is not necessary to install any Parse SDK to call the API using cURL commands. To make sure that cURL is available at your machine, open a terminal window and execute a simple cURL command. If you do not have cURL available or want to use an updated version please visit their official website.

Installing JavaScript SDK

Installing JavaScript SDK using TypeScript

Installing Android SDK

Installing iOS SDK (Swift)

Installing iOS SDK (Objective-C)

Installing PHP SDK

Installing .NET SDK

Initializing Parse SDK

You do not need to do any kind of initialization when using cURL but you must send your app's credentials in the headers of all requests that you'll do. Example:

curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
https://parseapi.back4app.com/serverInfo

You should not use the REST API Key in client apps. If you need to send a REST API directly from your client-side code, you must use the Parse Client Key for your currently client-side platform (e.g. Client Key for iOS/Android, or .NET Key for Windows/Xamarin/Unity).

In a React Native project, in your App.js file:

import AsyncStorage from '@react-native-async-storage/async-storage';
import Parse from 'parse/react-native';

//Before using the SDK...
Parse.setAsyncStorage(AsyncStorage);
// Remember to inform BOTH the Back4App Application ID AND the JavaScript KEY
Parse.initialize('BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f', '4wPYRKbpTJeCdmFNaS31AiQZ8344aaYubk6Uo8VW');
//Point to Back4App Parse API address 
Parse.serverURL = 'https://parseapi.back4app.com'

In a Web Browser (React, Angular, Vue, etc) project:

<script src="node_modules/parse/dist/parse.min.js"></script>

<script>
Parse.serverURL = 'https://parseapi.back4app.com'; // This is your Server URL
// Remember to inform BOTH the Back4App Application ID AND the JavaScript KEY
Parse.initialize(
  'BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f', // This is your Application ID
  '4wPYRKbpTJeCdmFNaS31AiQZ8344aaYubk6Uo8VW' // This is your Javascript key
);
</script>

In an Ionic project:

const Parse = require('parse');

Parse.serverURL = 'https://parseapi.back4app.com'; // This is your Server URL
// Remember to inform BOTH the Back4App Application ID AND the JavaScript KEY
Parse.initialize(
  'BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f', // This is your Application ID
  '4wPYRKbpTJeCdmFNaS31AiQZ8344aaYubk6Uo8VW' // This is your Javascript key
);

In a React Native project, in your App.tsx file:

import AsyncStorage from '@react-native-async-storage/async-storage';
import Parse from 'parse/react-native';

//Before using the SDK...
Parse.setAsyncStorage(AsyncStorage);
// Remember to inform BOTH the Back4App Application ID AND the JavaScript KEY
Parse.initialize('BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f', '4wPYRKbpTJeCdmFNaS31AiQZ8344aaYubk6Uo8VW');
//Point to Back4App Parse API address 
Parse.serverURL = 'https://parseapi.back4app.com'

In a Web Browser (React, Angular, Vue, etc) project:

<script src="node_modules/parse/dist/parse.min.js"></script>

<script>
Parse.serverURL = 'https://parseapi.back4app.com'; // This is your Server URL
// Remember to inform BOTH the Back4App Application ID AND the JavaScript KEY
Parse.initialize(
  'BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f', // This is your Application ID
  '4wPYRKbpTJeCdmFNaS31AiQZ8344aaYubk6Uo8VW' // This is your Javascript key
);
</script>

In an Ionic project:

const Parse = require('parse');

Parse.serverURL = 'https://parseapi.back4app.com'; // This is your Server URL
// Remember to inform BOTH the Back4App Application ID AND the JavaScript KEY
Parse.initialize(
  'BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f', // This is your Application ID
  '4wPYRKbpTJeCdmFNaS31AiQZ8344aaYubk6Uo8VW' // This is your Javascript key
);

First of all, you need to allow your application to have access to the internet and define its name. In your AndroidManifest.xml file, add the following:

<manifest
  ...
  >
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.INTERNET" />
</manifest>

In your Application class, initialize the Parse SDK with your Parse application ID, client key, and server:

package <YOUR_PACKAGE_NAME>;

import com.parse.Parse;
import android.app.Application;

public class YOUR_ANDROID_APPLICATION extends Application {

  // Initializes Parse SDK as soon as the application is created
  @Override
  public void onCreate() {
    super.onCreate();

    Parse.initialize(new Parse.Configuration.Builder(this)
      .applicationId("BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f")
      .clientKey("rWFPEbTs7UzkaVsIXnQ4qmmr9oWqwXfiiJehtIZu")
      .server("https://parseapi.back4app.com")
      .build()
    );
  }
}

After creating our Application class, we need to define its name on the AndroidManifest.xml file, as follows:

<manifest package="<YOUR_PACKAGE_NAME>"
  ...
  >
  <application
    android:name=".YOUR_ANDROID_APPLICATION"
    ...>
    ...
  </application>

In your application, add the following code into AppDelegate.swift and initialize the Parse SDK with your Parse application ID, client key, and server:

// AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  let parseConfig = ParseClientConfiguration {
      $0.applicationId = "BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f"
      $0.clientKey = "rWFPEbTs7UzkaVsIXnQ4qmmr9oWqwXfiiJehtIZu"
      $0.server = "https://parseapi.back4app.com"
  }
  Parse.initialize(with: parseConfig)
}

In your application, add the following code into AppDelegate.m and initialize the Parse SDK with your Parse application ID, client key, and server:

// AppDelegate.m
[Parse initializeWithConfiguration:[ParseClientConfiguration configurationWithBlock:^(id<ParseMutableClientConfiguration>  _Nonnull configuration) {
  configuration.applicationId = @"BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f";
  configuration.clientKey = @"rWFPEbTs7UzkaVsIXnQ4qmmr9oWqwXfiiJehtIZu";
  configuration.server = @"https://parseapi.back4app.com";
}]];

After including the Parse-SDK you need to initialize the ParseClient as follows:

using Parse;

ParseClient.Initialize(new ParseClient.Configuration {
    ApplicationId = "BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f",
    WindowsKey = ""
});

You can build the library from Visual Studio 2013+ or Xamarin IDE.

// In Windows:
MSBuild Parse.sln

// In Unix with Xamarin SDK installed:
xbuild Parse.sln

After including the Parse-SDK classes, you need to initialize the ParseClient as follows:

use Parse\ParseClient;

// Initializes with the <APPLICATION_ID>, <REST_KEY>, and <MASTER_KEY>
ParseClient::initialize( "BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f", "swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w", "5AVAtvlGlG5cEeolatkFDhY5p99PzoBUvm7MBLMo" );
ParseClient::setServerURL('https://parseapi.back4app.com', '/');

After installing the Parse SDK, you have to initialize the SDK using your App keys. You can copy them below from the right panel code snippets. At any time you can also find your App keys on your App dashboard under the Security & Keys menu. You don't need to initialize the SDK if you are using cURL, but you must send your app's credentials in the headers of any requests that you'll do.

Application ID

BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

Client key

rWFPEbTs7UzkaVsIXnQ4qmmr9oWqwXfiiJehtIZu

JavaScript key

4wPYRKbpTJeCdmFNaS31AiQZ8344aaYubk6Uo8VW

.NET key

Y1xbq7W0YSJSw1JSOf8hPUgHqXvwgXVEBDck3oaB

REST API key

swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Webhook key

W0683XHye3PU6H4I8mvOL0aMgsyoPrBdnN0rxn4B

File key

8b5c72e4-8894-4dc3-ab9b-d64528420865

Master key

5AVAtvlGlG5cEeolatkFDhY5p99PzoBUvm7MBLMo

Objects API

Example Object:

{
  "objectId": "4BwpMWdCnm",
  "myCustomKey1Name": "myCustomKey1Value",
  "myCustomKey2Name": "myCustomKey2Value",
  "createdAt": "2018-11-06T00:52:01.520Z",
  "updatedAt": "2018-11-06T00:52:04.713Z"
}

The special keys objectId, createdAt and updatedAt are default and always automatically created by the platform.

Performing CRUD (create, read, update and delete) operations through Back4App - Parse Server Hosting - is really simple and can be done using the Objects API. Each object consists of a set of key-value pairs that are transacted through the API as a JSON document. The keys must be alphanumeric strings and the values must be anything that can be JSON-encoded. The objects are organized in classes so you can distinguish different sorts of data.

The data that represents an object is schemaless which means that you don't need to specify ahead of time a new custom class schema. You just need to send the data and Parse will learn from it. But if for any reason you prefer to specify your class schema before sending the data, you can do that using the Create a class button in the Database Browser of your app's Parse Dashboard.

For each new custom class that you create in your app's schema (either through API or just sending the data), a new endpoint is generated at the address below through which you can perform your CRUD operations:

https://parseapi.back4app.com/classes/MyCustomClassName

In addition, a new section in this documentation is automatically generated for each new custom class that you create through which you can learn how to perform the CRUD operations specifically to one class' objects.

Please note that the User class' objects is a special case and has its own API whose documentation you can find here and endpoint is the one that you can find below:

https://parseapi.back4app.com/users

Creating Objects

Example Request:

curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{"myCustomKey1Name":"myCustomKey1Value","myCustomKey2Name":"myCustomKey2Value"}' \
https://parseapi.back4app.com/classes/MyCustomClassName

Example Response:

{
  "objectId": "4BwpMWdCnm",
  "createdAt": "2018-11-06T00:52:01.520Z"
}

Code:

(async () => {
  const myNewObject = new Parse.Object('MyCustomClassName');
  myNewObject.set('myCustomKey1Name', 'myCustomKey1Value');
  myNewObject.set('myCustomKey2Name', 'myCustomKey2Value');
  try {
    const result = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('object myCustomKey1Name: ', result.get('myCustomKey1Name'));
    console.log('object myCustomKey2Name: ', result.get('myCustomKey2Name'));
    console.log('ParseObject created', result);
  } catch (error) {
    console.error('Error while creating ParseObject: ', error);
  }
})();
(async () => {
  const myNewObject: Parse.Object = new Parse.Object('MyCustomClassName');
  myNewObject.set('myCustomKey1Name', 'myCustomKey1Value');
  myNewObject.set('myCustomKey2Name', 'myCustomKey2Value');
  try {
    const result: Parse.Object = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('object myCustomKey1Name: ', result.get('myCustomKey1Name'));
    console.log('object myCustomKey2Name: ', result.get('myCustomKey2Name'));
    console.log('ParseObject created', result);
  } catch (error: any) {
    console.error('Error while creating ParseObject: ', error);
  }
})();
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.SaveCallback;

public void createObject() {
  String myCustomKey1Value = "foo";
  Integer myCustomKey2Value = 999;

  ParseObject myNewObject = new ParseObject("MyCustomClassName");
  myNewObject.put("myCustomKey1Name", myCustomKey1Value);
  myNewObject.put("myCustomKey2Name", myCustomKey2Value);

  // Saves the new object.
  // Notice that the SaveCallback is totally optional!
  myNewObject.saveInBackground(e -> {
    if (e==null){
      //Save was done
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
var parseObject = PFObject(className:"MyCustomClassName")

parseObject["myCustomKey1Name"] = "My custom value"
parseObject["myCustomKey2Name"] = 999

// Saves the new object.
parseObject.saveInBackground {
  (success: Bool, error: Error?) in
  if (success) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}
PFObject *parseObject = [PFObject objectWithClassName:@"MyCustomClassName"];
parseObject[@"myCustomKey1Name"] = @"My custom value";
parseObject[@"myCustomKey2Name"] = @999;

[parseObject saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (succeeded) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}];
ParseObject myCustomClass = new ParseObject("MyCustomClassName");
myCustomClass["myCustomKey1Name"] = "My custom value";
myCustomClass["myCustomKey2Name"] = 999;
await myCustomClass.SaveAsync();
use Parse\ParseException;
use Parse\ParseObject;

$myCustomObject = new ParseObject("MyCustomClassName");

$myCustomObject->set("myCustomKey1Name", "My custom value");
$myCustomObject->set("myCustomKey2Name", 999);

try {
  $myCustomObject->save();
  echo 'New object created with objectId: ' . $myCustomObject->getObjectId();
} catch (ParseException $ex) {
  // Execute any logic that should take place if the save fails.
  // error is a ParseException object with an error code and message.
  echo 'Failed to create new object, with error message: ' . $ex->getMessage();
}

Example Output:

{
  id: 'xKue915KBG',
  _objCount: 0,
  className: 'MyCustomClassName'
}

To create a new object, you'll need to send a POST request to its class endpoint with your app's credentials in the headers and the object's data in the body. You can include as many key-value pairs as you want. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/MyCustomClassName

Method

POST

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent your object's data.

Success Response

Status

201 Created

Headers

Location: https://parseapi.back4app.com/classes/MyCustomClassName/MyNewObjectId

The Location header will contain the endpoint of the newly-created object.

Body

A JSON document with the objectId and createdAt fields of the newly-created object.

Error Response

Please check the Errors section.

Reading Objects

Example Request:

curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode "where={\"myCustomKey1Name\":\"myCustomKey1Value\"}" \
https://parseapi.back4app.com/classes/MyCustomClassName

Example Response:

{
  "results": [
    {
      "objectId": "zJxVP17mTi",
      "createdAt": "2018-10-31T14:16:13.616Z",
      "updatedAt": "2018-11-07T12:12:20.758Z",
      "myCustomKey1Name": "myCustomKey1Value",
      "myCustomKey2Name": ""
    },
    {
      "objectId": "yDbv0gKGJR",
      "createdAt": "2018-10-31T14:16:42.811Z",
      "updatedAt": "2018-11-07T12:12:18.543Z",
      "myCustomKey1Name": "myCustomKey1Value",
      "myCustomKey2Name": "myCustomKey2Value"
    },
    {
      "objectId": "xKue915KBG",
      "myCustomKey1Name": "myCustomKey1Value",
      "createdAt": "2018-11-07T12:11:58.533Z",
      "updatedAt": "2018-11-07T12:12:15.413Z",
      "myCustomKey2Name": "myCustomKey2Value"
    }
  ]
}

Without any URL parameters, this simply lists all objects in the class.

Learn more about query parameters in queries section.

Code:

(async () => {
  const query = new Parse.Query('MyCustomClassName');
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  const results = await query.find();
  try {
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
      const myCustomKey1Name = object.get('myCustomKey1Name');
      const myCustomKey2Name = object.get('myCustomKey2Name');
      console.log(myCustomKey1Name);
      console.log(myCustomKey2Name);
    }
  } catch (error) {
    console.error('Error while fetching MyCustomClassName', error);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('MyCustomClassName');
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  const results: Parse.Object[] = await query.find();
  try {
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
      const myCustomKey1Name: string = object.get('myCustomKey1Name');
      const myCustomKey2Name: string = object.get('myCustomKey2Name');
      console.log(myCustomKey1Name);
      console.log(myCustomKey2Name);
    }
  } catch (error: any) {
    console.error('Error while fetching MyCustomClassName', error);
  }
})();

Example Output:

myCustomKey1Value
myCustomKey2Value

To get the values out of the Parse.Object, use the get method.

Learn more about query parameters in queries section.

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void readObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("MyCustomClassName");

  // The query will search for a ParseObject, given its objectId.
  // When the query finishes running, it will invoke the GetCallback
  // with either the object, or the exception thrown
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was successfully retrieved
    } else {
      // something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }  
  });
}
var query = PFQuery(className:"MyCustomClassName")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error == nil && parseObject != nil {
    print(parseObject)
  } else {
    print(error)
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"MyCustomClassName"];
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
    // Do something with the returned PFObject in the parseObject variable.
    NSLog(@"%@", parseObject);
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("MyCustomClassName");
ParseObject result = await query.GetAsync("<PARSE_OBJECT_ID>");
// Use the Get<T> method to get the values
string myCustomKey1 = result.Get<string>("myCustomKey1Name");
int myCustomKey2 = result.Get<int>("myCustomKey2Name");

// The same method is applied to the default properties
string objectId = result.ObjectId;
DateTime? updatedAt = result.UpdatedAt;
DateTime? createdAt = result.CreatedAt;
use Parse\ParseException;
use Parse\ParseQuery;

$query = new ParseQuery("MyCustomClassName");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // To get attributes, you can use the "get" method, providing the attribute name:
  $myCustomKey1Value = $myCustomObject->get("myCustomKey1Name");
  echo $myCustomKey1Value;
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To retrieve an object, you'll need to send a GET request to its class endpoint with your app's credentials in the headers and the query parameters in the URL parameters. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/MyCustomClassName

Method

GET

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Parameters

A where URL parameter constraining the value for keys. It should be encoded JSON.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a results field with a JSON array that lists the objects.

Error Response

Please check the Errors section.

Updating Objects

Example Request:

curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{"myCustomKeyName":"newValue"}' \
https://parseapi.back4app.com/classes/MyCustomClassName/Ed1nuqPvcm

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

You can delete a single field from an object by using the Delete operation:

Example Request:


curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{"myCustomKeyName":{"__op":"Delete"}}' \
https://parseapi.back4app.com/classes/MyCustomClassName/

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

Code:

(async () => {
  const query = new Parse.Query('MyCustomClassName');
  try {
    // here you put the objectId that you want to update
    const object = await query.get('xKue915KBG');
    object.set('myCustomKey1Name', 'new value');
    try {
      const response = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('myCustomKey1Name'));
      console.log('MyCustomClassName updated', response);
    } catch (error) {
      console.error('Error while updating ', error);
    }
  } catch (error) {
    console.error('Error while retrieving object ', error);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('MyCustomClassName');
  try {
    // here you put the objectId that you want to update
    const object: Parse.Object = await query.get('xKue915KBG');
    object.set('myCustomKey1Name', 'new value');
    try {
      const response: Parse.Object = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('myCustomKey1Name'));
      console.log('MyCustomClassName updated', response);
    } catch (error: any) {
      console.error('Error while updating ', error);
    }
  } catch (error: any) {
    console.error('Error while retrieving object ', error);
  }
})();

Example Output:

myCustomKey1Name
MyCustomClassName updated
{
  className: 'MyCustomClassName',
  _objCount: 0,
  id: 'xKue915KBG'
}

You can delete a single field from an object with the unset method:

(async() => {
  const query = new Parse.Query('MyCustomClassName');
  try {
    const object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('myCustomKeyName');
    try {
      const response = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('myCustomKeyName'));
    } catch (error) {
      console.error(error);
    }
  } catch (error) {
    console.error(error);    
  }
})();

You can delete a single field from an object with the unset method:

(async() => {
  const query: Parse.Query = new Parse.Query('MyCustomClassName');
  try {
    const object: Parse.Object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('myCustomKeyName');
    try {
      const response: Parse.Object = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('myCustomKeyName'));
    } catch (error: any) {
      console.error(error);
    }
  } catch (error: any) {
    console.error(error);    
  }
})();

Example Output:

{
  className: 'MyCustomClassName',
  id: 'xKue915KBG',
  _localId: undefined,
  _objCount: 0, 
}
undefined

Please note that use of object.set(null) to remove a field from an object is not recommended and will result in unexpected functionality.

import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;

public void updateObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("MyCustomClassName");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      // Update the fields we want to
      object.put("myCustomKey1Name", "My new value");
      object.put("myCustomKey2Name", 999);

      // All other fields will remain the same
      object.saveInBackground();

    } else {
      // something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }  
  });

}
var query = PFQuery(className:"MyCustomClassName")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    parseObject["myCustomKey1Name"] = "My custom value"
    parseObject["myCustomKey2Name"] = 999

    parseObject.saveInBackground()
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"MyCustomClassName"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>"
                             block:^(PFObject *parseObject, NSError *error) {
    parseObject[@"myCustomKey1Name"] = @"My custom value";
    parseObject[@"myCustomKey2Name"] = @999;
    [parseObject saveInBackground];
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("MyCustomClassName");
ParseObject object = await query.GetAsync("<PARSE_OBJECT_ID>");
object["myCustomKey1Name"] = "My new value";
await object.SaveAsync();

You can delete a single field from an object with the Remove method:

ParseQuery<ParseObject> query = ParseObject.GetQuery("MyCustomClassName");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
// After this, the myCustomKey1Name field will be empty
myObject.Remove("myCustomKey1Name");
await object.SaveAsync();
use Parse\ParseException;
use Parse\ParseQuery;

$query = new ParseQuery("MyCustomClassName");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // Update any data you want with the "set" method,
  // providing the attribute name and the new value
  $myCustomObject->set("myCustomKey1Name", "My new value");
  $myCustomObject->set("myCustomKey2Name", 12345);

  // And then save your changes
  $myCustomObject->save();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To update data on an object that already exists, send a PUT request to this object endpoint with your app's credentials in the headers and the query parameters in the body. Any keys you don’t specify will remain unchanged, so you can update just a subset of the object’s data. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/MyCustomClassName/MyCurrentObjectId

Method

PUT

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent the object's new data.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a updatedAt field with the timestamp of the update.

Error Response

Please check the Errors section.

Deleting Objects

Example Request:


curl -X DELETE \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
https://parseapi.back4app.com/classes/MyCustomClassName/Ed1nuqPvcm

Example Response:

{}

Code:

(async () => {
  const query = new Parse.Query('MyCustomClassName');
  try {
    // here you put the objectId that you want to delete
    const object = await query.get('xKue915KBG');
    try {
      const response = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error) {
    console.error('Error while retrieving ParseObject', error);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('MyCustomClassName');
  try {
    // here you put the objectId that you want to delete
    const object: Parse.Object = await query.get('xKue915KBG');
    try {
      const response: any = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error: any) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error: any) {
    console.error('Error while retrieving ParseObject', error);
  }
})();

Example Output:

Deleted ParseObject
{
  className: 'MyCustomClassName',
  _objCount: 0,
  id: 'xKue915KBG'
}
import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void deleteObject() {
// Retrieve the object by id
  ParseQuery<ParseObject> query = ParseQuery.getQuery("MyCustomClassName");
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
      if (e == null) {
          // Deletes the fetched ParseObject from the database
          object.deleteInBackground(e2 -> {
              if(e2==null){
                  Toast.makeText(this, "Delete Successful", Toast.LENGTH_SHORT).show();
              }else{
                  //Something went wrong while deleting the Object
                  Toast.makeText(this, "Error: "+e2.getMessage(), Toast.LENGTH_SHORT).show();
              }
          });
      }else{
          //Something went wrong while retrieving the Object
          Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
      }
  });
}
var deleteAttributesOnly = true

var query = PFQuery(className:"")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    if deleteAttributesOnly {

      parseObject.saveInBackground()
    } else {
      parseObject.deleteInBackground()
    }
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"MyCustomClassName"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
  // After this, the myCustomKey1Name field will be empty
  // [parseObject removeObjectForKey:@"myCustomKey1Name"];
  // Saves the field deletion to the Parse Cloud
  // [parseObject saveInBackground];

  [parseObject deleteInBackground];
}
ParseQuery<ParseObject> query = ParseObject.GetQuery("MyCustomClassName");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
await myObject.DeleteAsync();
use Parse\ParseQuery;
use Parse\ParseException;

$query = new ParseQuery("MyCustomClassName");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // After this, the myCustomKey1Name field will be empty
  $myCustomObject->delete("myCustomKey1Name");
  // Saves any changes done to the object
  $myCustomObject->save();

  // Otherwise, you can delete the entire object from the database
  $myCustomObject->destroy();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To delete an object send a DELETE request to this object endpoint with your app's credentials in the headers. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/MyCustomClassName/MyCurrentObjectId

Method

DELETE

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

An empty JSON object.

Error Response

Please check the Errors section.

Understanding Data Types

Parse supports many types of data, from Strings to relations with other Parse Objects, users are able to store their data in our servers with great availability and low latency. Check the list aside with examples of how to define them and use on your application.

Examples:

{
  \"stringExample\": \"A string\",
  \"numberExample\": 1,
  \"booleanExample\": true,
  \"arrayExample\": [ 1, \"a string\" ],
  \"objectExample\": { \"foo\": \"bar\" },
  \"dateExample\": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },
  \"fileExample\": { \"__type\": \"File\", \"name\": \"resume.txt\" },
  \"pointerExample\": { \"__type\": \"Pointer\", \"className\": \"<YOUR_CLASS_NAME>\", \"objectId\": \"<THE_REFERENCED_OBJECT_ID>\" },
  \"relationExample\": { \"__type\": \"Relation\", \"className\": \"<YOUR_CLASS_NAME>\" },
  \"geopointExample\": { \"__type\": \"GeoPoint\", \"latitude\": 40.0, \"longitude\": -30.0 },
  \"polygonExample\": {\"__type\":\"Polygon\",\"coordinates\":[[0,0],[0,1],[1,0]]}
}

const stringExample = 'A string';

const numberExample = 1;

const booleanExample = true;

const arrayExample = [1, 'a string'];

const objectExample = { foo: 'bar' };

const dateExample = new Date();

const fileExample = new Parse.File("resume.txt", { base64: btoa("My file content") });

const pointerExample = new Parse.Object("<YOUR_CLASS_NAME>");

const relationExample = new Parse.Object("<YOUR_CLASS_NAME>");

const geopointExample = new Parse.GeoPoint({latitude: 40.0, longitude: -30.0});

const polygonExample = new Parse.Polygon([ [0,0], [0,1], [1,0] ]);

String stringExample = "A string";

int numberExample = 1;

boolean booleanExample = true;

JSONArray arrayExample = new JSONArray();

JSONObject objectExample = new JSONObject();

java.util.Date dateExample = new Date();

ParseFile fileExample = new ParseFile("resume.txt", "My string content".getBytes());

ParseObject pointerExample = new ParseObject("<YOUR_CLASS_NAME>");

ParseRelation relationExample = new ParseObject("<YOUR_CLASS_NAME>");

ParseGeoPoint geopointExample = new ParseGeoPoint(40.0, -30.0);

ParsePolygon polygonExample = new ParsePolygon(Arrays.asList(new ParseGeoPoint(0,0), new ParseGeoPoint(0,1), new ParseGeoPoint(1,0)));

var stringExample = "A string"

var numberExample = 1

var booleanExample = true

var arrayExample = [1, "a string"]

var objectExample = [ "foo": "bar" ]

var dateExample = NSDate()

var fileExample = PFFile(name:"resume.txt", data:"My string content".dataUsingEncoding(NSUTF8StringEncoding))

var pointerExample = PFObject(className:"<YOUR_CLASS_NAME>")

var relationExample = PFObject(className:"<YOUR_CLASS_NAME>")

var geopointExample = PFGeoPoint(latitude:40.0, longitude:-30.0)

var polygonExample = PFPolygon(coordinates: [ [0,0], [0,1], [1,0] ])

NSString stringExample = @"A string";

NSNumber numberExample = @1;

NSNumber booleanExample = @YES;

NSArray arrayExample = @[@1, @"a string"];

NSObject objectExample = @{ @"foo": @"bar" };

NSDate dateExample = [NSDate date];

PFFile fileExample = [PFFile fileWithName:@"resume.txt" data: [@"My string content" dataUsingEncoding:NSUTF8StringEncoding]];

PFObject pointerExample = [PFObject objectWithClassName:@"<YOUR_CLASS_NAME>"];

PFRelation relationExample = [PFObject objectWithClassName:@"<YOUR_CLASS_NAME>"];

PFGeoPoint geopointExample = [PFGeoPoint geoPointWithLatitude:40.0 longitude:-30.0];

PFPolygon polygonExample = [PFPolygon polygonWithCoordinates: @[ @[@0,@0], @[@0,@1], @[@1,@0] ] ];

$stringExample = "A string"

$numberExample = 1

$booleanExample = true

$arrayExample = [1, "a string"]

$objectExample = ["foo" => "bar"]

$dateExample = new DateTime()

$fileExample = ParseFile::createFromData("My resume content", "resume.txt")

$pointerExample = new ParseObject("<YOUR_CLASS_NAME>")

$relationExample = new ParseObject("<YOUR_CLASS_NAME>")

$geopointExample = new ParseGeoPoint(40.0, -30.0)

$polygonExample = new ParsePolygon([ new ParseGeoPoint(0, 0), new ParseGeoPoint(0, 1), new ParseGeoPoint(1, 0) ])

string stringExample = "A string";

int numberExample = 1;

bool booleanExample = true;

IList arrayExample = new List<object>{1, "a string"};

IDictionary objectExample = new Dictionary<string, object> { { "number", number }, { "string", str } };

DateTime dateExample = DateTime.Now;

ParseFile fileExample =  new ParseFile("resume.txt", System.Text.Encoding.UTF8.GetBytes("My string content"));;

ParseObject pointerExample = new ParseObject("<YOUR_CLASS_NAME>");

ParseRelation relationExample = new ParseObject("<YOUR_CLASS_NAME>");

ParseGeoPoint geopointExample = new ParseGeoPoint(40.0, -30.0);

//  polygonExample = <NOT_AVAILABLE>;

Project Class

Example JSON:

{
  "name": "A string",
  "firstName": "A string",
  "lastName": "A string",
  "AverageGrade": 1,
  "duration": 1,
  "fees": 1,
  "level": "A string"
}

Project is a custom class that was created and is specific for ToDoListApp. Please use the following documentation to learn how to perform CRUD (create, read, update and delete) operations to this specific class. A new endpoint was automatically generated at the address below to which you can send your requests:

https://parseapi.back4app.com/classes/Project

The following fields are supported by this class' schema and can be used in the operations:

Name Type Example
name String "A string"
firstName String "A string"
lastName String "A string"
AverageGrade Number 1
duration Number 1
fees Number 1
level String "A string"

Creating Objects

Example Request:

curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d "{ \"name\":\"A string\",\"firstName\":\"A string\",\"lastName\":\"A string\",\"AverageGrade\":1,\"duration\":1,\"fees\":1,\"level\":\"A string\" }" \
https://parseapi.back4app.com/classes/Project

Example Response:

{
  "objectId": "4BwpMWdCnm",
  "createdAt": "2018-11-06T00:52:01.520Z"
}

Code:

(async () => {
  const myNewObject = new Parse.Object('Project');
  myNewObject.set('name', 'A string');
  myNewObject.set('firstName', 'A string');
  myNewObject.set('lastName', 'A string');
  myNewObject.set('AverageGrade', 1);
  myNewObject.set('duration', 1);
  myNewObject.set('fees', 1);
  myNewObject.set('level', 'A string');
  try {
    const result = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('Project created', result);
  } catch (error) {
    console.error('Error while creating Project: ', error);
  }
})();
(async () => {
  const myNewObject: Parse.Object = new Parse.Object('Project');
  myNewObject.set('name', 'A string');
  myNewObject.set('firstName', 'A string');
  myNewObject.set('lastName', 'A string');
  myNewObject.set('AverageGrade', 1);
  myNewObject.set('duration', 1);
  myNewObject.set('fees', 1);
  myNewObject.set('level', 'A string');
  try {
    const result: Parse.Object = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('Project created', result);
  } catch (error: any) {
    console.error('Error while creating Project: ', error);
  }
})();
import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;
import com.parse.SaveCallback;

public void createObject() {
  ParseObject entity = new ParseObject("Project");

  entity.put("name", "A string");
  entity.put("firstName", "A string");
  entity.put("lastName", "A string");
  entity.put("AverageGrade", 1);
  entity.put("duration", 1);
  entity.put("fees", 1);
  entity.put("level", "A string");

  // Saves the new object.
  // Notice that the SaveCallback is totally optional!
  entity.saveInBackground(e -> {
    if (e==null){
      //Save was done
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });

}
var parseObject = PFObject(className:"Project")

parseObject["name"] = "A string"
parseObject["firstName"] = "A string"
parseObject["lastName"] = "A string"
parseObject["AverageGrade"] = 1
parseObject["duration"] = 1
parseObject["fees"] = 1
parseObject["level"] = "A string"

// Saves the new object.
parseObject.saveInBackground {
  (success: Bool, error: Error?) in
  if (success) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}
PFObject *parseObject = [PFObject objectWithClassName:@"Project"];

parseObject[@"name"] = @"A string";
parseObject[@"firstName"] = @"A string";
parseObject[@"lastName"] = @"A string";
parseObject[@"AverageGrade"] = @1;
parseObject[@"duration"] = @1;
parseObject[@"fees"] = @1;
parseObject[@"level"] = @"A string";

[parseObject saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (succeeded) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}];
ParseObject myObject = new ParseObject("Project");
myObject["name"] = "A string";
myObject["firstName"] = "A string";
myObject["lastName"] = "A string";
myObject["AverageGrade"] = 1;
myObject["duration"] = 1;
myObject["fees"] = 1;
myObject["level"] = "A string";
await myObject.SaveAsync();
$myCustomObject = new ParseObject("Project");

$myCustomObject->set("name", "A string");
$myCustomObject->set("firstName", "A string");
$myCustomObject->set("lastName", "A string");
$myCustomObject->set("AverageGrade", 1);
$myCustomObject->set("duration", 1);
$myCustomObject->set("fees", 1);
$myCustomObject->set("level", "A string");

try {
  $myCustomObject->save();
  echo 'New object created with objectId: ' . $myCustomObject->getObjectId();
} catch (ParseException $ex) {
  // Execute any logic that should take place if the save fails.
  // error is a ParseException object with an error code and message.
  echo 'Failed to create new object, with error message: ' . $ex->getMessage();
}

Example Output:

{
  id: 'xKue915KBG',
  _objCount: 0,
  className: 'Project
}

To create a new object of the Project class, you'll need to send a POST request to the Project class' endpoint with your app's credentials in the headers and the object's data in the body. You can include as many key-value pairs of the supported fields as you want. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/Project

Method

POST

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent your object's data according to the supported fields.

Success Response

Status

201 Created

Headers

Location: https://parseapi.back4app.com/classes/Project/MyNewObjectId

The Location header will contain the endpoint of the newly-created object.

Body

A JSON document with the objectId and createdAt fields of the newly-created object.

Error Response

Please check the Errors section.

Reading Objects

Example Request:

curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode "where={ \"name\":\"A string\",\"firstName\":\"A string\",\"lastName\":\"A string\",\"AverageGrade\":1,\"duration\":1,\"fees\":1,\"level\":\"A string\" }" \
https://parseapi.back4app.com/classes/Project

Example Response:

{
  "results": [
    {
      "objectId": "zJxVP17mTi",
      "createdAt": "2018-10-31T14:16:13.616Z",
      "updatedAt": "2018-11-07T12:12:20.758Z",
      "name": \"A string\","firstName": \"A string\","lastName": \"A string\","AverageGrade": 1,"duration": 1,"fees": 1,"level": \"A string\"
    },
    {
      "objectId": "yDbv0gKGJR",
      "createdAt": "2018-10-31T14:16:42.811Z",
      "updatedAt": "2018-11-07T12:12:18.543Z",
      "name": \"A string\","firstName": \"A string\","lastName": \"A string\","AverageGrade": 1,"duration": 1,"fees": 1,"level": \"A string\"
    },
    {
      "objectId": "xKue915KBG",
      "createdAt": "2018-11-07T12:11:58.533Z",
      "updatedAt": "2018-11-07T12:12:15.413Z",
      "name": \"A string\","firstName": \"A string\","lastName": \"A string\","AverageGrade": 1,"duration": 1,"fees": 1,"level": \"A string\"
    }
  ]
}

Without any URL parameters, this simply lists all objects in the class.

Learn more about query parameters in queries section.

Code:

(async () => {
  const Project = Parse.Object.extend('Project');
  const query = new Parse.Query(Project);
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  try {
    const results = await query.find();
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
      const name = object.get('name')
      const firstName = object.get('firstName')
      const lastName = object.get('lastName')
      const AverageGrade = object.get('AverageGrade')
      const duration = object.get('duration')
      const fees = object.get('fees')
      const level = object.get('level')
      console.log(name);
      console.log(firstName);
      console.log(lastName);
      console.log(AverageGrade);
      console.log(duration);
      console.log(fees);
      console.log(level);
    }
  } catch (error) {
    console.error('Error while fetching Project', error);
  }
})();
(async () => {
  const Project: Parse.Object = Parse.Object.extend('Project');
  const query: Parse.Query = new Parse.Query(Project);
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  try {
    const results: Parse.Object[] = await query.find();
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
      const name: string = object.get('name')
      const firstName: string = object.get('firstName')
      const lastName: string = object.get('lastName')
      const AverageGrade: string = object.get('AverageGrade')
      const duration: string = object.get('duration')
      const fees: string = object.get('fees')
      const level: string = object.get('level')
      console.log(name);
      console.log(firstName);
      console.log(lastName);
      console.log(AverageGrade);
      console.log(duration);
      console.log(fees);
      console.log(level);
    }
  } catch (error: any) {
    console.error('Error while fetching Project', error);
  }
})();

Example Output:

'A string' 'A string' 'A string' 1 1 1 'A string' 

To get the values out of the Parse.Object, use the get method.

Learn more about query parameters in queries section.

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void readObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("Project");

  // The query will search for a ParseObject, given its objectId.
  // When the query finishes running, it will invoke the GetCallback
  // with either the object, or the exception thrown
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
        if (e == null) {
        //Object was successfully retrieved
      } else {
        // something went wrong
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
      }  
  });
}
var query = PFQuery(className:"Project")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error == nil && parseObject != nil {
    print(parseObject)
  } else {
    print(error)
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"Project"];
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
    // Do something with the returned PFObject in the parseObject variable.
    NSLog(@"%@", parseObject);
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("Project");
ParseObject result = await query.GetAsync("<PARSE_OBJECT_ID>");
// Use the Get<T> method to get the values
string name = result.Get<string>("name");
string firstName = result.Get<string>("firstName");
string lastName = result.Get<string>("lastName");
int AverageGrade = result.Get<int>("AverageGrade");
int duration = result.Get<int>("duration");
int fees = result.Get<int>("fees");
string level = result.Get<string>("level");
$query = new ParseQuery("Project");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // To get attributes, you can use the "get" method, providing the attribute name:
  $name = $myCustomObject->get("name");
  $firstName = $myCustomObject->get("firstName");
  $lastName = $myCustomObject->get("lastName");
  $AverageGrade = $myCustomObject->get("AverageGrade");
  $duration = $myCustomObject->get("duration");
  $fees = $myCustomObject->get("fees");
  $level = $myCustomObject->get("level");
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To retrieve an object, you'll need to send a GET request to its class endpoint with your app's credentials in the headers and the query parameters in the URL parameters. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/Project

Method

GET

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Parameters

A where URL parameter constraining the value for keys. It should be encoded JSON.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a results field with a JSON array that lists the objects.

Error Response

Please check the Errors section.

Updating Objects

Example Request:


# Don't forget to set the OBJECT_ID parameter
curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d "{ \"name\": \"A string\",\"firstName\": \"A string\",\"lastName\": \"A string\",\"AverageGrade\": 1,\"duration\": 1,\"fees\": 1,\"level\": \"A string\" }" \
https://parseapi.back4app.com/classes/Project/<OBJECT_ID>

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

You can delete a single field from an object by using the Delete operation:

Example Request:


curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{ "name": {"__op":"Delete"},"firstName": {"__op":"Delete"},"lastName": {"__op":"Delete"},"AverageGrade": {"__op":"Delete"},"duration": {"__op":"Delete"},"fees": {"__op":"Delete"},"level": {"__op":"Delete"} }' \
https://parseapi.back4app.com/classes/Project

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

Code:

(async () => {
  const query = new Parse.Query(Project);
  try {
    // here you put the objectId that you want to update
    const object = await query.get('xKue915KBG');
    object.set('name', 'A string');
    object.set('firstName', 'A string');
    object.set('lastName', 'A string');
    object.set('AverageGrade', 1);
    object.set('duration', 1);
    object.set('fees', 1);
    object.set('level', 'A string');
    try {
      const response = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('name'));
      console.log(response.get('firstName'));
      console.log(response.get('lastName'));
      console.log(response.get('AverageGrade'));
      console.log(response.get('duration'));
      console.log(response.get('fees'));
      console.log(response.get('level'));
      console.log('Project updated', response);
    } catch (error) {
      console.error('Error while updating Project', error);
      }
    } catch (error) {
      console.error('Error while retrieving object Project', error);
    }
})();
(async () => {
  const query: Parse.Query = new Parse.Query(Project);
  try {
    // here you put the objectId that you want to update
    const object: Parse.Object = await query.get('xKue915KBG');
    object.set('name', 'A string');
    object.set('firstName', 'A string');
    object.set('lastName', 'A string');
    object.set('AverageGrade', 1);
    object.set('duration', 1);
    object.set('fees', 1);
    object.set('level', 'A string');
    try {
      const response: Parse.Object = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('name'));
      console.log(response.get('firstName'));
      console.log(response.get('lastName'));
      console.log(response.get('AverageGrade'));
      console.log(response.get('duration'));
      console.log(response.get('fees'));
      console.log(response.get('level'));
      console.log('Project updated', response);
    } catch (error: any) {
      console.error('Error while updating Project', error);
      }
    } catch (error: any) {
      console.error('Error while retrieving object Project', error);
    }
})();

Example Output:


name
firstName
lastName
AverageGrade
duration
fees
level
Project updated
{
  className: Project,
   _objCount: 0,
   id: 'xKue915KBG'
}

You can delete a single field from an object with the unset method:

(async() => {
  const query = new Parse.Query('Project');
  try {
    const object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('level');
    try {
      const response = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('level'));
    } catch (error) {
      console.error(error);
    }
  } catch (error) {
    console.error(error);    
  }
})();
(async() => {
  const query: Parse.Query = new Parse.Query('Project');
  try {
    const object: Parse.Object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('level');
    try {
      const response: Parse.Object = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('level'));
    } catch (error: any) {
      console.error(error);
    }
  } catch (error: any) {
    console.error(error);    
  }
})();

Example Output:

{
  className: Project,
  id: 'xKue915KBG',
  _localId: undefined,
  _objCount: 0, 
}
undefined

Please note that use of object.set(null) to remove a field from an object is not recommended and will result in unexpected functionality.

import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;

public void updateObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("Project");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was successfully retrieved
      // Update the fields we want to
      object.put("name", "A string");
      object.put("firstName", "A string");
      object.put("lastName", "A string");
      object.put("AverageGrade", 1);
      object.put("duration", 1);
      object.put("fees", 1);
      object.put("level", "A string");

      //All other fields will remain the same
      object.saveInBackground();

    } else {
      // something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }  
  });

}
var query = PFQuery(className:"Project")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    parseObject["name"] = "A string"
    parseObject["firstName"] = "A string"
    parseObject["lastName"] = "A string"
    parseObject["AverageGrade"] = 1
    parseObject["duration"] = 1
    parseObject["fees"] = 1
    parseObject["level"] = "A string"

    parseObject.saveInBackground()
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"Project"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>"
                             block:^(PFObject *parseObject, NSError *error) {
    parseObject[@"name"] = @"A string";
    parseObject[@"firstName"] = @"A string";
    parseObject[@"lastName"] = @"A string";
    parseObject[@"AverageGrade"] = @1;
    parseObject[@"duration"] = @1;
    parseObject[@"fees"] = @1;
    parseObject[@"level"] = @"A string";

    [parseObject saveInBackground];
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("Project");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
myObject["name"] = "A string";
myObject["firstName"] = "A string";
myObject["lastName"] = "A string";
myObject["AverageGrade"] = 1;
myObject["duration"] = 1;
myObject["fees"] = 1;
myObject["level"] = "A string";
await myObject.SaveAsync();

You can delete a single field from an object with the Remove method:

ParseQuery<ParseObject> query = ParseObject.GetQuery("MyCustomClassName");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
myObject.Remove("name");
myObject.Remove("firstName");
myObject.Remove("lastName");
myObject.Remove("AverageGrade");
myObject.Remove("duration");
myObject.Remove("fees");
myObject.Remove("level");
await myObject.SaveAsync();
$query = new ParseQuery("Project");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // Update any data you want with the "set" method,
  // providing the attribute name and the new value
  $myCustomObject->set("name", "A string");
  $myCustomObject->set("firstName", "A string");
  $myCustomObject->set("lastName", "A string");
  $myCustomObject->set("AverageGrade", 1);
  $myCustomObject->set("duration", 1);
  $myCustomObject->set("fees", 1);
  $myCustomObject->set("level", "A string");

  // And then save your changes
  $myCustomObject->save();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To update data on an object that already exists, send a PUT request to this object endpoint with your app's credentials in the headers and the query parameters in the body. Any keys you don’t specify will remain unchanged, so you can update just a subset of the object’s data. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/Project/MyCurrentObjectId

Method

PUT

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent the object's new data.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a updatedAt field with the timestamp of the update.

Error Response

Please check the Errors section.

Deleting Objects

Example Request:

# Don't forget to set the OBJECT_ID parameter
curl -X DELETE \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
https://parseapi.back4app.com/classes/Project/<OBJECT_ID>

Example Response:

{}

Code:

(async () => {
  const query = new Parse.Query('Project');
  try {
    // here you put the objectId that you want to delete
    const object = await query.get('xKue915KBG');
    try {
      const response = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error) {
    console.error('Error while retrieving ParseObject', error);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('Project');
  try {
    // here you put the objectId that you want to delete
    const object: Parse.Object = await query.get('xKue915KBG');
    try {
      const response: any = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error: any) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error: any) {
    console.error('Error while retrieving ParseObject', error);
  }
})();

Example Output:

Deleted ParseObject
{
  className: 'Project',
  _objCount: 0,
  id: 'xKue915KBG'
}
import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void deleteObject() {

  ParseQuery<ParseObject> query = ParseQuery.getQuery("Project");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was fetched
      //Deletes the fetched ParseObject from the database
      object.deleteInBackground(e2 -> {
          if(e2==null){
              Toast.makeText(this, "Delete Successful", Toast.LENGTH_SHORT).show();
          }else{
              //Something went wrong while deleting the Object
              Toast.makeText(this, "Error: "+e2.getMessage(), Toast.LENGTH_SHORT).show();
          }
      });
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });

}
var deleteAttributesOnly = true

var query = PFQuery(className:"Project")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    if deleteAttributesOnly {
      parseObject.removeObjectForKey("name")
      parseObject.removeObjectForKey("firstName")
      parseObject.removeObjectForKey("lastName")
      parseObject.removeObjectForKey("AverageGrade")
      parseObject.removeObjectForKey("duration")
      parseObject.removeObjectForKey("fees")
      parseObject.removeObjectForKey("level")
      parseObject.saveInBackground()
    } else {
      parseObject.deleteInBackground()
    }
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"Project"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
  // When using "removeObjectForKey", the field will be empty
  // [parseObject removeObjectForKey:@"name"];
  // [parseObject removeObjectForKey:@"firstName"];
  // [parseObject removeObjectForKey:@"lastName"];
  // [parseObject removeObjectForKey:@"AverageGrade"];
  // [parseObject removeObjectForKey:@"duration"];
  // [parseObject removeObjectForKey:@"fees"];
  // [parseObject removeObjectForKey:@"level"];
  // Saves the field deletion to the Parse Cloud
  // [parseObject saveInBackground];

  // Or you can delete the entire object from the database
  [parseObject deleteInBackground];
}
ParseQuery<ParseObject> query = ParseObject.GetQuery("Project");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
await myObject.DeleteAsync();
$query = new ParseQuery("Project");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // After this, the field will be empty
  $myCustomObject->delete("name");
  $myCustomObject->delete("firstName");
  $myCustomObject->delete("lastName");
  $myCustomObject->delete("AverageGrade");
  $myCustomObject->delete("duration");
  $myCustomObject->delete("fees");
  $myCustomObject->delete("level");
  // Saves any changes done to the object
  $myCustomObject->save();

  // Otherwise, you can delete the entire object from the database
  $myCustomObject->destroy();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To delete an object send a DELETE request to this object endpoint with your app's credentials in the headers. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/Project/MyCurrentObjectId

Method

DELETE

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

An empty JSON object.

Error Response

Please check the Errors section.

ToDo Class

Example JSON:

{
  "title": "A string",
  "url": "A string",
  "isCompleted": true,
  "schedule": "2018-11-12T13:13:45.958Z",
  "order": 1,
  "description": "A string",
  "attachmentt": { "__type": "File", "name": "resume.txt" },
  "project": { "__type": "Pointer", "className": "Project", "objectId": "<THE_REFERENCED_OBJECT_ID>" },
  "name": "A string",
  "attachment": { "__type": "File", "name": "resume.txt" },
  "task": "A string",
  "Nombre": "A string",
  "edad": "A string",
  "correo": "A string",
  "matricula": "A string",
  "Edad": "A string",
  "Matricula": "A string",
  "nombre": "A string",
  "Correo": "A string",
  "query": "A string"
}

ToDo is a custom class that was created and is specific for ToDoListApp. Please use the following documentation to learn how to perform CRUD (create, read, update and delete) operations to this specific class. A new endpoint was automatically generated at the address below to which you can send your requests:

https://parseapi.back4app.com/classes/ToDo

The following fields are supported by this class' schema and can be used in the operations:

Name Type Example
title String "A string"
url String "A string"
isCompleted Boolean true
schedule Date "2018-11-12T13:13:45.958Z"
order Number 1
description String "A string"
attachmentt File { "__type": "File", "name": "resume.txt" }
project Pointer { "__type": "Pointer", "className": "Project", "objectId": "<THE_REFERENCED_OBJECT_ID>" }
name String "A string"
attachment File { "__type": "File", "name": "resume.txt" }
task String "A string"
Nombre String "A string"
edad String "A string"
correo String "A string"
matricula String "A string"
Edad String "A string"
Matricula String "A string"
nombre String "A string"
Correo String "A string"
query String "A string"

Creating Objects

Example Request:

curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d "{ \"title\":\"A string\",\"url\":\"A string\",\"isCompleted\":true,\"schedule\":{ \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },\"order\":1,\"description\":\"A string\",\"attachmentt\":{ \"__type\": \"File\", \"name\": \"resume.txt\" },\"project\":{ \"__type\": \"Pointer\", \"className\": \"Project\", \"objectId\": \"<THE_REFERENCED_OBJECT_ID>\" },\"name\":\"A string\",\"attachment\":{ \"__type\": \"File\", \"name\": \"resume.txt\" },\"task\":\"A string\",\"Nombre\":\"A string\",\"edad\":\"A string\",\"correo\":\"A string\",\"matricula\":\"A string\",\"Edad\":\"A string\",\"Matricula\":\"A string\",\"nombre\":\"A string\",\"Correo\":\"A string\",\"query\":\"A string\" }" \
https://parseapi.back4app.com/classes/ToDo

Example Response:

{
  "objectId": "4BwpMWdCnm",
  "createdAt": "2018-11-06T00:52:01.520Z"
}

Code:

(async () => {
  const myNewObject = new Parse.Object('ToDo');
  myNewObject.set('title', 'A string');
  myNewObject.set('url', 'A string');
  myNewObject.set('isCompleted', true);
  myNewObject.set('schedule', new Date());
  myNewObject.set('order', 1);
  myNewObject.set('description', 'A string');
  myNewObject.set('attachmentt', new Parse.File("resume.txt", { base64: btoa("My file content") }));
  myNewObject.set('project', new Parse.Object("Project"));
  myNewObject.set('name', 'A string');
  myNewObject.set('attachment', new Parse.File("resume.txt", { base64: btoa("My file content") }));
  myNewObject.set('task', 'A string');
  myNewObject.set('Nombre', 'A string');
  myNewObject.set('edad', 'A string');
  myNewObject.set('correo', 'A string');
  myNewObject.set('matricula', 'A string');
  myNewObject.set('Edad', 'A string');
  myNewObject.set('Matricula', 'A string');
  myNewObject.set('nombre', 'A string');
  myNewObject.set('Correo', 'A string');
  myNewObject.set('query', 'A string');
  try {
    const result = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('ToDo created', result);
  } catch (error) {
    console.error('Error while creating ToDo: ', error);
  }
})();
(async () => {
  const myNewObject: Parse.Object = new Parse.Object('ToDo');
  myNewObject.set('title', 'A string');
  myNewObject.set('url', 'A string');
  myNewObject.set('isCompleted', true);
  myNewObject.set('schedule', new Date());
  myNewObject.set('order', 1);
  myNewObject.set('description', 'A string');
  myNewObject.set('attachmentt', new Parse.File("resume.txt", { base64: btoa("My file content") }));
  myNewObject.set('project', new Parse.Object("Project"));
  myNewObject.set('name', 'A string');
  myNewObject.set('attachment', new Parse.File("resume.txt", { base64: btoa("My file content") }));
  myNewObject.set('task', 'A string');
  myNewObject.set('Nombre', 'A string');
  myNewObject.set('edad', 'A string');
  myNewObject.set('correo', 'A string');
  myNewObject.set('matricula', 'A string');
  myNewObject.set('Edad', 'A string');
  myNewObject.set('Matricula', 'A string');
  myNewObject.set('nombre', 'A string');
  myNewObject.set('Correo', 'A string');
  myNewObject.set('query', 'A string');
  try {
    const result: Parse.Object = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('ToDo created', result);
  } catch (error: any) {
    console.error('Error while creating ToDo: ', error);
  }
})();
import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;
import com.parse.SaveCallback;

public void createObject() {
  ParseObject entity = new ParseObject("ToDo");

  entity.put("title", "A string");
  entity.put("url", "A string");
  entity.put("isCompleted", true);
  entity.put("schedule", new Date());
  entity.put("order", 1);
  entity.put("description", "A string");
  entity.put("attachmentt", new ParseFile("resume.txt", "My string content".getBytes()));
  entity.put("project", new ParseObject("Project"));
  entity.put("name", "A string");
  entity.put("attachment", new ParseFile("resume.txt", "My string content".getBytes()));
  entity.put("task", "A string");
  entity.put("Nombre", "A string");
  entity.put("edad", "A string");
  entity.put("correo", "A string");
  entity.put("matricula", "A string");
  entity.put("Edad", "A string");
  entity.put("Matricula", "A string");
  entity.put("nombre", "A string");
  entity.put("Correo", "A string");
  entity.put("query", "A string");

  // Saves the new object.
  // Notice that the SaveCallback is totally optional!
  entity.saveInBackground(e -> {
    if (e==null){
      //Save was done
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });

}
var parseObject = PFObject(className:"ToDo")

parseObject["title"] = "A string"
parseObject["url"] = "A string"
parseObject["isCompleted"] = true
parseObject["schedule"] = NSDate()
parseObject["order"] = 1
parseObject["description"] = "A string"
parseObject["attachmentt"] = PFFile(name:"resume.txt", data:"My string content".dataUsingEncoding(NSUTF8StringEncoding))
parseObject["project"] = PFObject(className:"Project")
parseObject["name"] = "A string"
parseObject["attachment"] = PFFile(name:"resume.txt", data:"My string content".dataUsingEncoding(NSUTF8StringEncoding))
parseObject["task"] = "A string"
parseObject["Nombre"] = "A string"
parseObject["edad"] = "A string"
parseObject["correo"] = "A string"
parseObject["matricula"] = "A string"
parseObject["Edad"] = "A string"
parseObject["Matricula"] = "A string"
parseObject["nombre"] = "A string"
parseObject["Correo"] = "A string"
parseObject["query"] = "A string"

// Saves the new object.
parseObject.saveInBackground {
  (success: Bool, error: Error?) in
  if (success) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}
PFObject *parseObject = [PFObject objectWithClassName:@"ToDo"];

parseObject[@"title"] = @"A string";
parseObject[@"url"] = @"A string";
parseObject[@"isCompleted"] = @YES;
parseObject[@"schedule"] = [NSDate date];
parseObject[@"order"] = @1;
parseObject[@"description"] = @"A string";
parseObject[@"attachmentt"] = [PFFile fileWithName:@"resume.txt" data: [@"My string content" dataUsingEncoding:NSUTF8StringEncoding]];
parseObject[@"project"] = [PFObject objectWithClassName:@"Project"];
parseObject[@"name"] = @"A string";
parseObject[@"attachment"] = [PFFile fileWithName:@"resume.txt" data: [@"My string content" dataUsingEncoding:NSUTF8StringEncoding]];
parseObject[@"task"] = @"A string";
parseObject[@"Nombre"] = @"A string";
parseObject[@"edad"] = @"A string";
parseObject[@"correo"] = @"A string";
parseObject[@"matricula"] = @"A string";
parseObject[@"Edad"] = @"A string";
parseObject[@"Matricula"] = @"A string";
parseObject[@"nombre"] = @"A string";
parseObject[@"Correo"] = @"A string";
parseObject[@"query"] = @"A string";

[parseObject saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (succeeded) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}];
ParseObject myObject = new ParseObject("ToDo");
myObject["title"] = "A string";
myObject["url"] = "A string";
myObject["isCompleted"] = true;
myObject["schedule"] = DateTime.Now;
myObject["order"] = 1;
myObject["description"] = "A string";
myObject["attachmentt"] =  new ParseFile("resume.txt", System.Text.Encoding.UTF8.GetBytes("My string content"));;
myObject["project"] = new ParseObject("Project");
myObject["name"] = "A string";
myObject["attachment"] =  new ParseFile("resume.txt", System.Text.Encoding.UTF8.GetBytes("My string content"));;
myObject["task"] = "A string";
myObject["Nombre"] = "A string";
myObject["edad"] = "A string";
myObject["correo"] = "A string";
myObject["matricula"] = "A string";
myObject["Edad"] = "A string";
myObject["Matricula"] = "A string";
myObject["nombre"] = "A string";
myObject["Correo"] = "A string";
myObject["query"] = "A string";
await myObject.SaveAsync();
$myCustomObject = new ParseObject("ToDo");

$myCustomObject->set("title", "A string");
$myCustomObject->set("url", "A string");
$myCustomObject->set("isCompleted", true);
$myCustomObject->set("schedule", new DateTime());
$myCustomObject->set("order", 1);
$myCustomObject->set("description", "A string");
$myCustomObject->set("attachmentt", ParseFile::createFromData("My resume content", "resume.txt"));
$myCustomObject->set("project", new ParseObject("Project"));
$myCustomObject->set("name", "A string");
$myCustomObject->set("attachment", ParseFile::createFromData("My resume content", "resume.txt"));
$myCustomObject->set("task", "A string");
$myCustomObject->set("Nombre", "A string");
$myCustomObject->set("edad", "A string");
$myCustomObject->set("correo", "A string");
$myCustomObject->set("matricula", "A string");
$myCustomObject->set("Edad", "A string");
$myCustomObject->set("Matricula", "A string");
$myCustomObject->set("nombre", "A string");
$myCustomObject->set("Correo", "A string");
$myCustomObject->set("query", "A string");

try {
  $myCustomObject->save();
  echo 'New object created with objectId: ' . $myCustomObject->getObjectId();
} catch (ParseException $ex) {
  // Execute any logic that should take place if the save fails.
  // error is a ParseException object with an error code and message.
  echo 'Failed to create new object, with error message: ' . $ex->getMessage();
}

Example Output:

{
  id: 'xKue915KBG',
  _objCount: 0,
  className: 'ToDo
}

To create a new object of the ToDo class, you'll need to send a POST request to the ToDo class' endpoint with your app's credentials in the headers and the object's data in the body. You can include as many key-value pairs of the supported fields as you want. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/ToDo

Method

POST

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent your object's data according to the supported fields.

Success Response

Status

201 Created

Headers

Location: https://parseapi.back4app.com/classes/ToDo/MyNewObjectId

The Location header will contain the endpoint of the newly-created object.

Body

A JSON document with the objectId and createdAt fields of the newly-created object.

Error Response

Please check the Errors section.

Reading Objects

Example Request:

curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode "where={ \"title\":\"A string\",\"url\":\"A string\",\"isCompleted\":true,\"schedule\":{ \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },\"order\":1,\"description\":\"A string\",\"attachmentt\":{ \"__type\": \"File\", \"name\": \"resume.txt\" },\"project\":{ \"__type\": \"Pointer\", \"className\": \"Project\", \"objectId\": \"<THE_REFERENCED_OBJECT_ID>\" },\"name\":\"A string\",\"attachment\":{ \"__type\": \"File\", \"name\": \"resume.txt\" },\"task\":\"A string\",\"Nombre\":\"A string\",\"edad\":\"A string\",\"correo\":\"A string\",\"matricula\":\"A string\",\"Edad\":\"A string\",\"Matricula\":\"A string\",\"nombre\":\"A string\",\"Correo\":\"A string\",\"query\":\"A string\" }" \
https://parseapi.back4app.com/classes/ToDo

Example Response:

{
  "results": [
    {
      "objectId": "zJxVP17mTi",
      "createdAt": "2018-10-31T14:16:13.616Z",
      "updatedAt": "2018-11-07T12:12:20.758Z",
      "title": \"A string\","url": \"A string\","isCompleted": true,"schedule": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },"order": 1,"description": \"A string\","attachmentt": { \"__type\": \"File\", \"name\": \"resume.txt\" },"project": { \"__type\": \"Pointer\", \"className\": \"Project\", \"objectId\": \"<THE_REFERENCED_OBJECT_ID>\" },"name": \"A string\","attachment": { \"__type\": \"File\", \"name\": \"resume.txt\" },"task": \"A string\","Nombre": \"A string\","edad": \"A string\","correo": \"A string\","matricula": \"A string\","Edad": \"A string\","Matricula": \"A string\","nombre": \"A string\","Correo": \"A string\","query": \"A string\"
    },
    {
      "objectId": "yDbv0gKGJR",
      "createdAt": "2018-10-31T14:16:42.811Z",
      "updatedAt": "2018-11-07T12:12:18.543Z",
      "title": \"A string\","url": \"A string\","isCompleted": true,"schedule": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },"order": 1,"description": \"A string\","attachmentt": { \"__type\": \"File\", \"name\": \"resume.txt\" },"project": { \"__type\": \"Pointer\", \"className\": \"Project\", \"objectId\": \"<THE_REFERENCED_OBJECT_ID>\" },"name": \"A string\","attachment": { \"__type\": \"File\", \"name\": \"resume.txt\" },"task": \"A string\","Nombre": \"A string\","edad": \"A string\","correo": \"A string\","matricula": \"A string\","Edad": \"A string\","Matricula": \"A string\","nombre": \"A string\","Correo": \"A string\","query": \"A string\"
    },
    {
      "objectId": "xKue915KBG",
      "createdAt": "2018-11-07T12:11:58.533Z",
      "updatedAt": "2018-11-07T12:12:15.413Z",
      "title": \"A string\","url": \"A string\","isCompleted": true,"schedule": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },"order": 1,"description": \"A string\","attachmentt": { \"__type\": \"File\", \"name\": \"resume.txt\" },"project": { \"__type\": \"Pointer\", \"className\": \"Project\", \"objectId\": \"<THE_REFERENCED_OBJECT_ID>\" },"name": \"A string\","attachment": { \"__type\": \"File\", \"name\": \"resume.txt\" },"task": \"A string\","Nombre": \"A string\","edad": \"A string\","correo": \"A string\","matricula": \"A string\","Edad": \"A string\","Matricula": \"A string\","nombre": \"A string\","Correo": \"A string\","query": \"A string\"
    }
  ]
}

Without any URL parameters, this simply lists all objects in the class.

Learn more about query parameters in queries section.

Code:

(async () => {
  const ToDo = Parse.Object.extend('ToDo');
  const query = new Parse.Query(ToDo);
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  try {
    const results = await query.find();
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
      const title = object.get('title')
      const url = object.get('url')
      const isCompleted = object.get('isCompleted')
      const schedule = object.get('schedule')
      const order = object.get('order')
      const description = object.get('description')
      const attachmentt = object.get('attachmentt')
      const project = object.get('project')
      const name = object.get('name')
      const attachment = object.get('attachment')
      const task = object.get('task')
      const Nombre = object.get('Nombre')
      const edad = object.get('edad')
      const correo = object.get('correo')
      const matricula = object.get('matricula')
      const Edad = object.get('Edad')
      const Matricula = object.get('Matricula')
      const nombre = object.get('nombre')
      const Correo = object.get('Correo')
      const query = object.get('query')
      console.log(title);
      console.log(url);
      console.log(isCompleted);
      console.log(schedule);
      console.log(order);
      console.log(description);
      console.log(attachmentt);
      console.log(project);
      console.log(name);
      console.log(attachment);
      console.log(task);
      console.log(Nombre);
      console.log(edad);
      console.log(correo);
      console.log(matricula);
      console.log(Edad);
      console.log(Matricula);
      console.log(nombre);
      console.log(Correo);
      console.log(query);
    }
  } catch (error) {
    console.error('Error while fetching ToDo', error);
  }
})();
(async () => {
  const ToDo: Parse.Object = Parse.Object.extend('ToDo');
  const query: Parse.Query = new Parse.Query(ToDo);
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  try {
    const results: Parse.Object[] = await query.find();
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
      const title: string = object.get('title')
      const url: string = object.get('url')
      const isCompleted: string = object.get('isCompleted')
      const schedule: string = object.get('schedule')
      const order: string = object.get('order')
      const description: string = object.get('description')
      const attachmentt: string = object.get('attachmentt')
      const project: string = object.get('project')
      const name: string = object.get('name')
      const attachment: string = object.get('attachment')
      const task: string = object.get('task')
      const Nombre: string = object.get('Nombre')
      const edad: string = object.get('edad')
      const correo: string = object.get('correo')
      const matricula: string = object.get('matricula')
      const Edad: string = object.get('Edad')
      const Matricula: string = object.get('Matricula')
      const nombre: string = object.get('nombre')
      const Correo: string = object.get('Correo')
      const query: string = object.get('query')
      console.log(title);
      console.log(url);
      console.log(isCompleted);
      console.log(schedule);
      console.log(order);
      console.log(description);
      console.log(attachmentt);
      console.log(project);
      console.log(name);
      console.log(attachment);
      console.log(task);
      console.log(Nombre);
      console.log(edad);
      console.log(correo);
      console.log(matricula);
      console.log(Edad);
      console.log(Matricula);
      console.log(nombre);
      console.log(Correo);
      console.log(query);
    }
  } catch (error: any) {
    console.error('Error while fetching ToDo', error);
  }
})();

Example Output:

'A string' 'A string' true new Date() 1 'A string' new Parse.File("resume.txt", { base64: btoa("My file content") }) new Parse.Object("Project") 'A string' new Parse.File("resume.txt", { base64: btoa("My file content") }) 'A string' 'A string' 'A string' 'A string' 'A string' 'A string' 'A string' 'A string' 'A string' 'A string' 

To get the values out of the Parse.Object, use the get method.

Learn more about query parameters in queries section.

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void readObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("ToDo");

  // The query will search for a ParseObject, given its objectId.
  // When the query finishes running, it will invoke the GetCallback
  // with either the object, or the exception thrown
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
        if (e == null) {
        //Object was successfully retrieved
      } else {
        // something went wrong
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
      }  
  });
}
var query = PFQuery(className:"ToDo")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error == nil && parseObject != nil {
    print(parseObject)
  } else {
    print(error)
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"ToDo"];
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
    // Do something with the returned PFObject in the parseObject variable.
    NSLog(@"%@", parseObject);
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("ToDo");
ParseObject result = await query.GetAsync("<PARSE_OBJECT_ID>");
// Use the Get<T> method to get the values
string title = result.Get<string>("title");
string url = result.Get<string>("url");
bool isCompleted = result.Get<bool>("isCompleted");
DateTime schedule = result.Get<DateTime>("schedule");
int order = result.Get<int>("order");
string description = result.Get<string>("description");
ParseFile attachmentt = result.Get<ParseFile>("attachmentt");
ParseObject project = result.Get<ParseObject>("project");
string name = result.Get<string>("name");
ParseFile attachment = result.Get<ParseFile>("attachment");
string task = result.Get<string>("task");
string Nombre = result.Get<string>("Nombre");
string edad = result.Get<string>("edad");
string correo = result.Get<string>("correo");
string matricula = result.Get<string>("matricula");
string Edad = result.Get<string>("Edad");
string Matricula = result.Get<string>("Matricula");
string nombre = result.Get<string>("nombre");
string Correo = result.Get<string>("Correo");
string query = result.Get<string>("query");
$query = new ParseQuery("ToDo");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // To get attributes, you can use the "get" method, providing the attribute name:
  $title = $myCustomObject->get("title");
  $url = $myCustomObject->get("url");
  $isCompleted = $myCustomObject->get("isCompleted");
  $schedule = $myCustomObject->get("schedule");
  $order = $myCustomObject->get("order");
  $description = $myCustomObject->get("description");
  $attachmentt = $myCustomObject->get("attachmentt");
  $project = $myCustomObject->get("project");
  $name = $myCustomObject->get("name");
  $attachment = $myCustomObject->get("attachment");
  $task = $myCustomObject->get("task");
  $Nombre = $myCustomObject->get("Nombre");
  $edad = $myCustomObject->get("edad");
  $correo = $myCustomObject->get("correo");
  $matricula = $myCustomObject->get("matricula");
  $Edad = $myCustomObject->get("Edad");
  $Matricula = $myCustomObject->get("Matricula");
  $nombre = $myCustomObject->get("nombre");
  $Correo = $myCustomObject->get("Correo");
  $query = $myCustomObject->get("query");
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To retrieve an object, you'll need to send a GET request to its class endpoint with your app's credentials in the headers and the query parameters in the URL parameters. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/ToDo

Method

GET

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Parameters

A where URL parameter constraining the value for keys. It should be encoded JSON.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a results field with a JSON array that lists the objects.

Error Response

Please check the Errors section.

Updating Objects

Example Request:


# Don't forget to set the OBJECT_ID parameter
curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d "{ \"title\": \"A string\",\"url\": \"A string\",\"isCompleted\": true,\"schedule\": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },\"order\": 1,\"description\": \"A string\",\"attachmentt\": { \"__type\": \"File\", \"name\": \"resume.txt\" },\"project\": { \"__type\": \"Pointer\", \"className\": \"Project\", \"objectId\": \"<THE_REFERENCED_OBJECT_ID>\" },\"name\": \"A string\",\"attachment\": { \"__type\": \"File\", \"name\": \"resume.txt\" },\"task\": \"A string\",\"Nombre\": \"A string\",\"edad\": \"A string\",\"correo\": \"A string\",\"matricula\": \"A string\",\"Edad\": \"A string\",\"Matricula\": \"A string\",\"nombre\": \"A string\",\"Correo\": \"A string\",\"query\": \"A string\" }" \
https://parseapi.back4app.com/classes/ToDo/<OBJECT_ID>

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

You can delete a single field from an object by using the Delete operation:

Example Request:


curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{ "title": {"__op":"Delete"},"url": {"__op":"Delete"},"isCompleted": {"__op":"Delete"},"schedule": {"__op":"Delete"},"order": {"__op":"Delete"},"description": {"__op":"Delete"},"attachmentt": {"__op":"Delete"},"project": {"__op":"Delete"},"name": {"__op":"Delete"},"attachment": {"__op":"Delete"},"task": {"__op":"Delete"},"Nombre": {"__op":"Delete"},"edad": {"__op":"Delete"},"correo": {"__op":"Delete"},"matricula": {"__op":"Delete"},"Edad": {"__op":"Delete"},"Matricula": {"__op":"Delete"},"nombre": {"__op":"Delete"},"Correo": {"__op":"Delete"},"query": {"__op":"Delete"} }' \
https://parseapi.back4app.com/classes/ToDo

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

Code:

(async () => {
  const query = new Parse.Query(ToDo);
  try {
    // here you put the objectId that you want to update
    const object = await query.get('xKue915KBG');
    object.set('title', 'A string');
    object.set('url', 'A string');
    object.set('isCompleted', true);
    object.set('schedule', new Date());
    object.set('order', 1);
    object.set('description', 'A string');
    object.set('attachmentt', new Parse.File("resume.txt", { base64: btoa("My file content") }));
    object.set('project', new Parse.Object("Project"));
    object.set('name', 'A string');
    object.set('attachment', new Parse.File("resume.txt", { base64: btoa("My file content") }));
    object.set('task', 'A string');
    object.set('Nombre', 'A string');
    object.set('edad', 'A string');
    object.set('correo', 'A string');
    object.set('matricula', 'A string');
    object.set('Edad', 'A string');
    object.set('Matricula', 'A string');
    object.set('nombre', 'A string');
    object.set('Correo', 'A string');
    object.set('query', 'A string');
    try {
      const response = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('title'));
      console.log(response.get('url'));
      console.log(response.get('isCompleted'));
      console.log(response.get('schedule'));
      console.log(response.get('order'));
      console.log(response.get('description'));
      console.log(response.get('attachmentt'));
      console.log(response.get('project'));
      console.log(response.get('name'));
      console.log(response.get('attachment'));
      console.log(response.get('task'));
      console.log(response.get('Nombre'));
      console.log(response.get('edad'));
      console.log(response.get('correo'));
      console.log(response.get('matricula'));
      console.log(response.get('Edad'));
      console.log(response.get('Matricula'));
      console.log(response.get('nombre'));
      console.log(response.get('Correo'));
      console.log(response.get('query'));
      console.log('ToDo updated', response);
    } catch (error) {
      console.error('Error while updating ToDo', error);
      }
    } catch (error) {
      console.error('Error while retrieving object ToDo', error);
    }
})();
(async () => {
  const query: Parse.Query = new Parse.Query(ToDo);
  try {
    // here you put the objectId that you want to update
    const object: Parse.Object = await query.get('xKue915KBG');
    object.set('title', 'A string');
    object.set('url', 'A string');
    object.set('isCompleted', true);
    object.set('schedule', new Date());
    object.set('order', 1);
    object.set('description', 'A string');
    object.set('attachmentt', new Parse.File("resume.txt", { base64: btoa("My file content") }));
    object.set('project', new Parse.Object("Project"));
    object.set('name', 'A string');
    object.set('attachment', new Parse.File("resume.txt", { base64: btoa("My file content") }));
    object.set('task', 'A string');
    object.set('Nombre', 'A string');
    object.set('edad', 'A string');
    object.set('correo', 'A string');
    object.set('matricula', 'A string');
    object.set('Edad', 'A string');
    object.set('Matricula', 'A string');
    object.set('nombre', 'A string');
    object.set('Correo', 'A string');
    object.set('query', 'A string');
    try {
      const response: Parse.Object = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('title'));
      console.log(response.get('url'));
      console.log(response.get('isCompleted'));
      console.log(response.get('schedule'));
      console.log(response.get('order'));
      console.log(response.get('description'));
      console.log(response.get('attachmentt'));
      console.log(response.get('project'));
      console.log(response.get('name'));
      console.log(response.get('attachment'));
      console.log(response.get('task'));
      console.log(response.get('Nombre'));
      console.log(response.get('edad'));
      console.log(response.get('correo'));
      console.log(response.get('matricula'));
      console.log(response.get('Edad'));
      console.log(response.get('Matricula'));
      console.log(response.get('nombre'));
      console.log(response.get('Correo'));
      console.log(response.get('query'));
      console.log('ToDo updated', response);
    } catch (error: any) {
      console.error('Error while updating ToDo', error);
      }
    } catch (error: any) {
      console.error('Error while retrieving object ToDo', error);
    }
})();

Example Output:


title
url
isCompleted
schedule
order
description
attachmentt
project
name
attachment
task
Nombre
edad
correo
matricula
Edad
Matricula
nombre
Correo
query
ToDo updated
{
  className: ToDo,
   _objCount: 0,
   id: 'xKue915KBG'
}

You can delete a single field from an object with the unset method:

(async() => {
  const query = new Parse.Query('ToDo');
  try {
    const object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('query');
    try {
      const response = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('query'));
    } catch (error) {
      console.error(error);
    }
  } catch (error) {
    console.error(error);    
  }
})();
(async() => {
  const query: Parse.Query = new Parse.Query('ToDo');
  try {
    const object: Parse.Object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('query');
    try {
      const response: Parse.Object = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('query'));
    } catch (error: any) {
      console.error(error);
    }
  } catch (error: any) {
    console.error(error);    
  }
})();

Example Output:

{
  className: ToDo,
  id: 'xKue915KBG',
  _localId: undefined,
  _objCount: 0, 
}
undefined

Please note that use of object.set(null) to remove a field from an object is not recommended and will result in unexpected functionality.

import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;

public void updateObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("ToDo");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was successfully retrieved
      // Update the fields we want to
      object.put("title", "A string");
      object.put("url", "A string");
      object.put("isCompleted", true);
      object.put("schedule", new Date());
      object.put("order", 1);
      object.put("description", "A string");
      object.put("attachmentt", new ParseFile("resume.txt", "My string content".getBytes()));
      object.put("project", new ParseObject("Project"));
      object.put("name", "A string");
      object.put("attachment", new ParseFile("resume.txt", "My string content".getBytes()));
      object.put("task", "A string");
      object.put("Nombre", "A string");
      object.put("edad", "A string");
      object.put("correo", "A string");
      object.put("matricula", "A string");
      object.put("Edad", "A string");
      object.put("Matricula", "A string");
      object.put("nombre", "A string");
      object.put("Correo", "A string");
      object.put("query", "A string");

      //All other fields will remain the same
      object.saveInBackground();

    } else {
      // something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }  
  });

}
var query = PFQuery(className:"ToDo")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    parseObject["title"] = "A string"
    parseObject["url"] = "A string"
    parseObject["isCompleted"] = true
    parseObject["schedule"] = NSDate()
    parseObject["order"] = 1
    parseObject["description"] = "A string"
    parseObject["attachmentt"] = PFFile(name:"resume.txt", data:"My string content".dataUsingEncoding(NSUTF8StringEncoding))
    parseObject["project"] = PFObject(className:"Project")
    parseObject["name"] = "A string"
    parseObject["attachment"] = PFFile(name:"resume.txt", data:"My string content".dataUsingEncoding(NSUTF8StringEncoding))
    parseObject["task"] = "A string"
    parseObject["Nombre"] = "A string"
    parseObject["edad"] = "A string"
    parseObject["correo"] = "A string"
    parseObject["matricula"] = "A string"
    parseObject["Edad"] = "A string"
    parseObject["Matricula"] = "A string"
    parseObject["nombre"] = "A string"
    parseObject["Correo"] = "A string"
    parseObject["query"] = "A string"

    parseObject.saveInBackground()
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"ToDo"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>"
                             block:^(PFObject *parseObject, NSError *error) {
    parseObject[@"title"] = @"A string";
    parseObject[@"url"] = @"A string";
    parseObject[@"isCompleted"] = @YES;
    parseObject[@"schedule"] = [NSDate date];
    parseObject[@"order"] = @1;
    parseObject[@"description"] = @"A string";
    parseObject[@"attachmentt"] = [PFFile fileWithName:@"resume.txt" data: [@"My string content" dataUsingEncoding:NSUTF8StringEncoding]];
    parseObject[@"project"] = [PFObject objectWithClassName:@"Project"];
    parseObject[@"name"] = @"A string";
    parseObject[@"attachment"] = [PFFile fileWithName:@"resume.txt" data: [@"My string content" dataUsingEncoding:NSUTF8StringEncoding]];
    parseObject[@"task"] = @"A string";
    parseObject[@"Nombre"] = @"A string";
    parseObject[@"edad"] = @"A string";
    parseObject[@"correo"] = @"A string";
    parseObject[@"matricula"] = @"A string";
    parseObject[@"Edad"] = @"A string";
    parseObject[@"Matricula"] = @"A string";
    parseObject[@"nombre"] = @"A string";
    parseObject[@"Correo"] = @"A string";
    parseObject[@"query"] = @"A string";

    [parseObject saveInBackground];
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("ToDo");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
myObject["title"] = "A string";
myObject["url"] = "A string";
myObject["isCompleted"] = true;
myObject["schedule"] = DateTime.Now;
myObject["order"] = 1;
myObject["description"] = "A string";
myObject["attachmentt"] =  new ParseFile("resume.txt", System.Text.Encoding.UTF8.GetBytes("My string content"));;
myObject["project"] = new ParseObject("Project");
myObject["name"] = "A string";
myObject["attachment"] =  new ParseFile("resume.txt", System.Text.Encoding.UTF8.GetBytes("My string content"));;
myObject["task"] = "A string";
myObject["Nombre"] = "A string";
myObject["edad"] = "A string";
myObject["correo"] = "A string";
myObject["matricula"] = "A string";
myObject["Edad"] = "A string";
myObject["Matricula"] = "A string";
myObject["nombre"] = "A string";
myObject["Correo"] = "A string";
myObject["query"] = "A string";
await myObject.SaveAsync();

You can delete a single field from an object with the Remove method:

ParseQuery<ParseObject> query = ParseObject.GetQuery("MyCustomClassName");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
myObject.Remove("title");
myObject.Remove("url");
myObject.Remove("isCompleted");
myObject.Remove("schedule");
myObject.Remove("order");
myObject.Remove("description");
myObject.Remove("attachmentt");
myObject.Remove("project");
myObject.Remove("name");
myObject.Remove("attachment");
myObject.Remove("task");
myObject.Remove("Nombre");
myObject.Remove("edad");
myObject.Remove("correo");
myObject.Remove("matricula");
myObject.Remove("Edad");
myObject.Remove("Matricula");
myObject.Remove("nombre");
myObject.Remove("Correo");
myObject.Remove("query");
await myObject.SaveAsync();
$query = new ParseQuery("ToDo");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // Update any data you want with the "set" method,
  // providing the attribute name and the new value
  $myCustomObject->set("title", "A string");
  $myCustomObject->set("url", "A string");
  $myCustomObject->set("isCompleted", true);
  $myCustomObject->set("schedule", new DateTime());
  $myCustomObject->set("order", 1);
  $myCustomObject->set("description", "A string");
  $myCustomObject->set("attachmentt", ParseFile::createFromData("My resume content", "resume.txt"));
  $myCustomObject->set("project", new ParseObject("Project"));
  $myCustomObject->set("name", "A string");
  $myCustomObject->set("attachment", ParseFile::createFromData("My resume content", "resume.txt"));
  $myCustomObject->set("task", "A string");
  $myCustomObject->set("Nombre", "A string");
  $myCustomObject->set("edad", "A string");
  $myCustomObject->set("correo", "A string");
  $myCustomObject->set("matricula", "A string");
  $myCustomObject->set("Edad", "A string");
  $myCustomObject->set("Matricula", "A string");
  $myCustomObject->set("nombre", "A string");
  $myCustomObject->set("Correo", "A string");
  $myCustomObject->set("query", "A string");

  // And then save your changes
  $myCustomObject->save();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To update data on an object that already exists, send a PUT request to this object endpoint with your app's credentials in the headers and the query parameters in the body. Any keys you don’t specify will remain unchanged, so you can update just a subset of the object’s data. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/ToDo/MyCurrentObjectId

Method

PUT

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent the object's new data.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a updatedAt field with the timestamp of the update.

Error Response

Please check the Errors section.

Deleting Objects

Example Request:

# Don't forget to set the OBJECT_ID parameter
curl -X DELETE \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
https://parseapi.back4app.com/classes/ToDo/<OBJECT_ID>

Example Response:

{}

Code:

(async () => {
  const query = new Parse.Query('ToDo');
  try {
    // here you put the objectId that you want to delete
    const object = await query.get('xKue915KBG');
    try {
      const response = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error) {
    console.error('Error while retrieving ParseObject', error);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('ToDo');
  try {
    // here you put the objectId that you want to delete
    const object: Parse.Object = await query.get('xKue915KBG');
    try {
      const response: any = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error: any) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error: any) {
    console.error('Error while retrieving ParseObject', error);
  }
})();

Example Output:

Deleted ParseObject
{
  className: 'ToDo',
  _objCount: 0,
  id: 'xKue915KBG'
}
import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void deleteObject() {

  ParseQuery<ParseObject> query = ParseQuery.getQuery("ToDo");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was fetched
      //Deletes the fetched ParseObject from the database
      object.deleteInBackground(e2 -> {
          if(e2==null){
              Toast.makeText(this, "Delete Successful", Toast.LENGTH_SHORT).show();
          }else{
              //Something went wrong while deleting the Object
              Toast.makeText(this, "Error: "+e2.getMessage(), Toast.LENGTH_SHORT).show();
          }
      });
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });

}
var deleteAttributesOnly = true

var query = PFQuery(className:"ToDo")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    if deleteAttributesOnly {
      parseObject.removeObjectForKey("title")
      parseObject.removeObjectForKey("url")
      parseObject.removeObjectForKey("isCompleted")
      parseObject.removeObjectForKey("schedule")
      parseObject.removeObjectForKey("order")
      parseObject.removeObjectForKey("description")
      parseObject.removeObjectForKey("attachmentt")
      parseObject.removeObjectForKey("project")
      parseObject.removeObjectForKey("name")
      parseObject.removeObjectForKey("attachment")
      parseObject.removeObjectForKey("task")
      parseObject.removeObjectForKey("Nombre")
      parseObject.removeObjectForKey("edad")
      parseObject.removeObjectForKey("correo")
      parseObject.removeObjectForKey("matricula")
      parseObject.removeObjectForKey("Edad")
      parseObject.removeObjectForKey("Matricula")
      parseObject.removeObjectForKey("nombre")
      parseObject.removeObjectForKey("Correo")
      parseObject.removeObjectForKey("query")
      parseObject.saveInBackground()
    } else {
      parseObject.deleteInBackground()
    }
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"ToDo"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
  // When using "removeObjectForKey", the field will be empty
  // [parseObject removeObjectForKey:@"title"];
  // [parseObject removeObjectForKey:@"url"];
  // [parseObject removeObjectForKey:@"isCompleted"];
  // [parseObject removeObjectForKey:@"schedule"];
  // [parseObject removeObjectForKey:@"order"];
  // [parseObject removeObjectForKey:@"description"];
  // [parseObject removeObjectForKey:@"attachmentt"];
  // [parseObject removeObjectForKey:@"project"];
  // [parseObject removeObjectForKey:@"name"];
  // [parseObject removeObjectForKey:@"attachment"];
  // [parseObject removeObjectForKey:@"task"];
  // [parseObject removeObjectForKey:@"Nombre"];
  // [parseObject removeObjectForKey:@"edad"];
  // [parseObject removeObjectForKey:@"correo"];
  // [parseObject removeObjectForKey:@"matricula"];
  // [parseObject removeObjectForKey:@"Edad"];
  // [parseObject removeObjectForKey:@"Matricula"];
  // [parseObject removeObjectForKey:@"nombre"];
  // [parseObject removeObjectForKey:@"Correo"];
  // [parseObject removeObjectForKey:@"query"];
  // Saves the field deletion to the Parse Cloud
  // [parseObject saveInBackground];

  // Or you can delete the entire object from the database
  [parseObject deleteInBackground];
}
ParseQuery<ParseObject> query = ParseObject.GetQuery("ToDo");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
await myObject.DeleteAsync();
$query = new ParseQuery("ToDo");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // After this, the field will be empty
  $myCustomObject->delete("title");
  $myCustomObject->delete("url");
  $myCustomObject->delete("isCompleted");
  $myCustomObject->delete("schedule");
  $myCustomObject->delete("order");
  $myCustomObject->delete("description");
  $myCustomObject->delete("attachmentt");
  $myCustomObject->delete("project");
  $myCustomObject->delete("name");
  $myCustomObject->delete("attachment");
  $myCustomObject->delete("task");
  $myCustomObject->delete("Nombre");
  $myCustomObject->delete("edad");
  $myCustomObject->delete("correo");
  $myCustomObject->delete("matricula");
  $myCustomObject->delete("Edad");
  $myCustomObject->delete("Matricula");
  $myCustomObject->delete("nombre");
  $myCustomObject->delete("Correo");
  $myCustomObject->delete("query");
  // Saves any changes done to the object
  $myCustomObject->save();

  // Otherwise, you can delete the entire object from the database
  $myCustomObject->destroy();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To delete an object send a DELETE request to this object endpoint with your app's credentials in the headers. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/ToDo/MyCurrentObjectId

Method

DELETE

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

An empty JSON object.

Error Response

Please check the Errors section.

TeamInfo Class

Example JSON:

{
}

TeamInfo is a custom class that was created and is specific for ToDoListApp. Please use the following documentation to learn how to perform CRUD (create, read, update and delete) operations to this specific class. A new endpoint was automatically generated at the address below to which you can send your requests:

https://parseapi.back4app.com/classes/TeamInfo

The following fields are supported by this class' schema and can be used in the operations:

Name Type Example

Creating Objects

Example Request:

curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d "{  }" \
https://parseapi.back4app.com/classes/TeamInfo

Example Response:

{
  "objectId": "4BwpMWdCnm",
  "createdAt": "2018-11-06T00:52:01.520Z"
}

Code:

(async () => {
  const myNewObject = new Parse.Object('TeamInfo');
  try {
    const result = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('TeamInfo created', result);
  } catch (error) {
    console.error('Error while creating TeamInfo: ', error);
  }
})();
(async () => {
  const myNewObject: Parse.Object = new Parse.Object('TeamInfo');
  try {
    const result: Parse.Object = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('TeamInfo created', result);
  } catch (error: any) {
    console.error('Error while creating TeamInfo: ', error);
  }
})();
import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;
import com.parse.SaveCallback;

public void createObject() {
  ParseObject entity = new ParseObject("TeamInfo");


  // Saves the new object.
  // Notice that the SaveCallback is totally optional!
  entity.saveInBackground(e -> {
    if (e==null){
      //Save was done
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });

}
var parseObject = PFObject(className:"TeamInfo")


// Saves the new object.
parseObject.saveInBackground {
  (success: Bool, error: Error?) in
  if (success) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}
PFObject *parseObject = [PFObject objectWithClassName:@"TeamInfo"];


[parseObject saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (succeeded) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}];
ParseObject myObject = new ParseObject("TeamInfo");
await myObject.SaveAsync();
$myCustomObject = new ParseObject("TeamInfo");


try {
  $myCustomObject->save();
  echo 'New object created with objectId: ' . $myCustomObject->getObjectId();
} catch (ParseException $ex) {
  // Execute any logic that should take place if the save fails.
  // error is a ParseException object with an error code and message.
  echo 'Failed to create new object, with error message: ' . $ex->getMessage();
}

Example Output:

{
  id: 'xKue915KBG',
  _objCount: 0,
  className: 'TeamInfo
}

To create a new object of the TeamInfo class, you'll need to send a POST request to the TeamInfo class' endpoint with your app's credentials in the headers and the object's data in the body. You can include as many key-value pairs of the supported fields as you want. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/TeamInfo

Method

POST

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent your object's data according to the supported fields.

Success Response

Status

201 Created

Headers

Location: https://parseapi.back4app.com/classes/TeamInfo/MyNewObjectId

The Location header will contain the endpoint of the newly-created object.

Body

A JSON document with the objectId and createdAt fields of the newly-created object.

Error Response

Please check the Errors section.

Reading Objects

Example Request:

curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode "where={  }" \
https://parseapi.back4app.com/classes/TeamInfo

Example Response:

{
  "results": [
    {
      "objectId": "zJxVP17mTi",
      "createdAt": "2018-10-31T14:16:13.616Z",
      "updatedAt": "2018-11-07T12:12:20.758Z",
      
    },
    {
      "objectId": "yDbv0gKGJR",
      "createdAt": "2018-10-31T14:16:42.811Z",
      "updatedAt": "2018-11-07T12:12:18.543Z",
      
    },
    {
      "objectId": "xKue915KBG",
      "createdAt": "2018-11-07T12:11:58.533Z",
      "updatedAt": "2018-11-07T12:12:15.413Z",
      
    }
  ]
}

Without any URL parameters, this simply lists all objects in the class.

Learn more about query parameters in queries section.

Code:

(async () => {
  const TeamInfo = Parse.Object.extend('TeamInfo');
  const query = new Parse.Query(TeamInfo);
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  try {
    const results = await query.find();
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
    }
  } catch (error) {
    console.error('Error while fetching TeamInfo', error);
  }
})();
(async () => {
  const TeamInfo: Parse.Object = Parse.Object.extend('TeamInfo');
  const query: Parse.Query = new Parse.Query(TeamInfo);
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  try {
    const results: Parse.Object[] = await query.find();
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
    }
  } catch (error: any) {
    console.error('Error while fetching TeamInfo', error);
  }
})();

Example Output:


To get the values out of the Parse.Object, use the get method.

Learn more about query parameters in queries section.

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void readObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("TeamInfo");

  // The query will search for a ParseObject, given its objectId.
  // When the query finishes running, it will invoke the GetCallback
  // with either the object, or the exception thrown
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
        if (e == null) {
        //Object was successfully retrieved
      } else {
        // something went wrong
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
      }  
  });
}
var query = PFQuery(className:"TeamInfo")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error == nil && parseObject != nil {
    print(parseObject)
  } else {
    print(error)
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"TeamInfo"];
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
    // Do something with the returned PFObject in the parseObject variable.
    NSLog(@"%@", parseObject);
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("TeamInfo");
ParseObject result = await query.GetAsync("<PARSE_OBJECT_ID>");
// Use the Get<T> method to get the values
$query = new ParseQuery("TeamInfo");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // To get attributes, you can use the "get" method, providing the attribute name:
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To retrieve an object, you'll need to send a GET request to its class endpoint with your app's credentials in the headers and the query parameters in the URL parameters. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/TeamInfo

Method

GET

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Parameters

A where URL parameter constraining the value for keys. It should be encoded JSON.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a results field with a JSON array that lists the objects.

Error Response

Please check the Errors section.

Updating Objects

Example Request:


# Don't forget to set the OBJECT_ID parameter
curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d "{  }" \
https://parseapi.back4app.com/classes/TeamInfo/<OBJECT_ID>

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

You can delete a single field from an object by using the Delete operation:

Example Request:


curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{  }' \
https://parseapi.back4app.com/classes/TeamInfo

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

Code:

(async () => {
  const query = new Parse.Query(TeamInfo);
  try {
    // here you put the objectId that you want to update
    const object = await query.get('xKue915KBG');
    try {
      const response = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log('TeamInfo updated', response);
    } catch (error) {
      console.error('Error while updating TeamInfo', error);
      }
    } catch (error) {
      console.error('Error while retrieving object TeamInfo', error);
    }
})();
(async () => {
  const query: Parse.Query = new Parse.Query(TeamInfo);
  try {
    // here you put the objectId that you want to update
    const object: Parse.Object = await query.get('xKue915KBG');
    try {
      const response: Parse.Object = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log('TeamInfo updated', response);
    } catch (error: any) {
      console.error('Error while updating TeamInfo', error);
      }
    } catch (error: any) {
      console.error('Error while retrieving object TeamInfo', error);
    }
})();

Example Output:


TeamInfo updated
{
  className: TeamInfo,
   _objCount: 0,
   id: 'xKue915KBG'
}

You can delete a single field from an object with the unset method:

(async() => {
  const query = new Parse.Query('TeamInfo');
  try {
    const object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('');
    try {
      const response = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get(''));
    } catch (error) {
      console.error(error);
    }
  } catch (error) {
    console.error(error);    
  }
})();
(async() => {
  const query: Parse.Query = new Parse.Query('TeamInfo');
  try {
    const object: Parse.Object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('');
    try {
      const response: Parse.Object = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get(''));
    } catch (error: any) {
      console.error(error);
    }
  } catch (error: any) {
    console.error(error);    
  }
})();

Example Output:

{
  className: TeamInfo,
  id: 'xKue915KBG',
  _localId: undefined,
  _objCount: 0, 
}
undefined

Please note that use of object.set(null) to remove a field from an object is not recommended and will result in unexpected functionality.

import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;

public void updateObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("TeamInfo");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was successfully retrieved
      // Update the fields we want to

      //All other fields will remain the same
      object.saveInBackground();

    } else {
      // something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }  
  });

}
var query = PFQuery(className:"TeamInfo")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {

    parseObject.saveInBackground()
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"TeamInfo"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>"
                             block:^(PFObject *parseObject, NSError *error) {

    [parseObject saveInBackground];
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("TeamInfo");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
await myObject.SaveAsync();

You can delete a single field from an object with the Remove method:

ParseQuery<ParseObject> query = ParseObject.GetQuery("MyCustomClassName");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
await myObject.SaveAsync();
$query = new ParseQuery("TeamInfo");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // Update any data you want with the "set" method,
  // providing the attribute name and the new value

  // And then save your changes
  $myCustomObject->save();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To update data on an object that already exists, send a PUT request to this object endpoint with your app's credentials in the headers and the query parameters in the body. Any keys you don’t specify will remain unchanged, so you can update just a subset of the object’s data. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/TeamInfo/MyCurrentObjectId

Method

PUT

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent the object's new data.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a updatedAt field with the timestamp of the update.

Error Response

Please check the Errors section.

Deleting Objects

Example Request:

# Don't forget to set the OBJECT_ID parameter
curl -X DELETE \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
https://parseapi.back4app.com/classes/TeamInfo/<OBJECT_ID>

Example Response:

{}

Code:

(async () => {
  const query = new Parse.Query('TeamInfo');
  try {
    // here you put the objectId that you want to delete
    const object = await query.get('xKue915KBG');
    try {
      const response = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error) {
    console.error('Error while retrieving ParseObject', error);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('TeamInfo');
  try {
    // here you put the objectId that you want to delete
    const object: Parse.Object = await query.get('xKue915KBG');
    try {
      const response: any = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error: any) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error: any) {
    console.error('Error while retrieving ParseObject', error);
  }
})();

Example Output:

Deleted ParseObject
{
  className: 'TeamInfo',
  _objCount: 0,
  id: 'xKue915KBG'
}
import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void deleteObject() {

  ParseQuery<ParseObject> query = ParseQuery.getQuery("TeamInfo");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was fetched
      //Deletes the fetched ParseObject from the database
      object.deleteInBackground(e2 -> {
          if(e2==null){
              Toast.makeText(this, "Delete Successful", Toast.LENGTH_SHORT).show();
          }else{
              //Something went wrong while deleting the Object
              Toast.makeText(this, "Error: "+e2.getMessage(), Toast.LENGTH_SHORT).show();
          }
      });
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });

}
var deleteAttributesOnly = true

var query = PFQuery(className:"TeamInfo")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    if deleteAttributesOnly {
      parseObject.saveInBackground()
    } else {
      parseObject.deleteInBackground()
    }
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"TeamInfo"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
  // When using "removeObjectForKey", the field will be empty
  // Saves the field deletion to the Parse Cloud
  // [parseObject saveInBackground];

  // Or you can delete the entire object from the database
  [parseObject deleteInBackground];
}
ParseQuery<ParseObject> query = ParseObject.GetQuery("TeamInfo");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
await myObject.DeleteAsync();
$query = new ParseQuery("TeamInfo");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // After this, the field will be empty
  // Saves any changes done to the object
  $myCustomObject->save();

  // Otherwise, you can delete the entire object from the database
  $myCustomObject->destroy();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To delete an object send a DELETE request to this object endpoint with your app's credentials in the headers. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/TeamInfo/MyCurrentObjectId

Method

DELETE

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

An empty JSON object.

Error Response

Please check the Errors section.

records Class

Example JSON:

{
  "where": { "foo": "bar" },
  "blogName": "A string",
  "imgUrl": "A string",
  "description": "A string"
}

records is a custom class that was created and is specific for ToDoListApp. Please use the following documentation to learn how to perform CRUD (create, read, update and delete) operations to this specific class. A new endpoint was automatically generated at the address below to which you can send your requests:

https://parseapi.back4app.com/classes/records

The following fields are supported by this class' schema and can be used in the operations:

Name Type Example
where Object { "foo": "bar" }
blogName String "A string"
imgUrl String "A string"
description String "A string"

Creating Objects

Example Request:

curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d "{ \"where\":{ \"foo\": \"bar\" },\"blogName\":\"A string\",\"imgUrl\":\"A string\",\"description\":\"A string\" }" \
https://parseapi.back4app.com/classes/records

Example Response:

{
  "objectId": "4BwpMWdCnm",
  "createdAt": "2018-11-06T00:52:01.520Z"
}

Code:

(async () => {
  const myNewObject = new Parse.Object('records');
  myNewObject.set('where', { foo: 'bar' });
  myNewObject.set('blogName', 'A string');
  myNewObject.set('imgUrl', 'A string');
  myNewObject.set('description', 'A string');
  try {
    const result = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('records created', result);
  } catch (error) {
    console.error('Error while creating records: ', error);
  }
})();
(async () => {
  const myNewObject: Parse.Object = new Parse.Object('records');
  myNewObject.set('where', { foo: 'bar' });
  myNewObject.set('blogName', 'A string');
  myNewObject.set('imgUrl', 'A string');
  myNewObject.set('description', 'A string');
  try {
    const result: Parse.Object = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('records created', result);
  } catch (error: any) {
    console.error('Error while creating records: ', error);
  }
})();
import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;
import com.parse.SaveCallback;

public void createObject() {
  ParseObject entity = new ParseObject("records");

  entity.put("where", new JSONObject());
  entity.put("blogName", "A string");
  entity.put("imgUrl", "A string");
  entity.put("description", "A string");

  // Saves the new object.
  // Notice that the SaveCallback is totally optional!
  entity.saveInBackground(e -> {
    if (e==null){
      //Save was done
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });

}
var parseObject = PFObject(className:"records")

parseObject["where"] = [ "foo": "bar" ]
parseObject["blogName"] = "A string"
parseObject["imgUrl"] = "A string"
parseObject["description"] = "A string"

// Saves the new object.
parseObject.saveInBackground {
  (success: Bool, error: Error?) in
  if (success) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}
PFObject *parseObject = [PFObject objectWithClassName:@"records"];

parseObject[@"where"] = @{ @"foo": @"bar" };
parseObject[@"blogName"] = @"A string";
parseObject[@"imgUrl"] = @"A string";
parseObject[@"description"] = @"A string";

[parseObject saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (succeeded) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}];
ParseObject myObject = new ParseObject("records");
myObject["where"] = new Dictionary<string, object> { { "number", number }, { "string", str } };
myObject["blogName"] = "A string";
myObject["imgUrl"] = "A string";
myObject["description"] = "A string";
await myObject.SaveAsync();
$myCustomObject = new ParseObject("records");

$myCustomObject->set("where", ["foo" => "bar"]);
$myCustomObject->set("blogName", "A string");
$myCustomObject->set("imgUrl", "A string");
$myCustomObject->set("description", "A string");

try {
  $myCustomObject->save();
  echo 'New object created with objectId: ' . $myCustomObject->getObjectId();
} catch (ParseException $ex) {
  // Execute any logic that should take place if the save fails.
  // error is a ParseException object with an error code and message.
  echo 'Failed to create new object, with error message: ' . $ex->getMessage();
}

Example Output:

{
  id: 'xKue915KBG',
  _objCount: 0,
  className: 'records
}

To create a new object of the records class, you'll need to send a POST request to the records class' endpoint with your app's credentials in the headers and the object's data in the body. You can include as many key-value pairs of the supported fields as you want. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/records

Method

POST

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent your object's data according to the supported fields.

Success Response

Status

201 Created

Headers

Location: https://parseapi.back4app.com/classes/records/MyNewObjectId

The Location header will contain the endpoint of the newly-created object.

Body

A JSON document with the objectId and createdAt fields of the newly-created object.

Error Response

Please check the Errors section.

Reading Objects

Example Request:

curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode "where={ \"where.foo\":\"bar\",\"blogName\":\"A string\",\"imgUrl\":\"A string\",\"description\":\"A string\" }" \
https://parseapi.back4app.com/classes/records

Example Response:

{
  "results": [
    {
      "objectId": "zJxVP17mTi",
      "createdAt": "2018-10-31T14:16:13.616Z",
      "updatedAt": "2018-11-07T12:12:20.758Z",
      "where": { \"foo\": \"bar\" },"blogName": \"A string\","imgUrl": \"A string\","description": \"A string\"
    },
    {
      "objectId": "yDbv0gKGJR",
      "createdAt": "2018-10-31T14:16:42.811Z",
      "updatedAt": "2018-11-07T12:12:18.543Z",
      "where": { \"foo\": \"bar\" },"blogName": \"A string\","imgUrl": \"A string\","description": \"A string\"
    },
    {
      "objectId": "xKue915KBG",
      "createdAt": "2018-11-07T12:11:58.533Z",
      "updatedAt": "2018-11-07T12:12:15.413Z",
      "where": { \"foo\": \"bar\" },"blogName": \"A string\","imgUrl": \"A string\","description": \"A string\"
    }
  ]
}

Without any URL parameters, this simply lists all objects in the class.

Learn more about query parameters in queries section.

Code:

(async () => {
  const records = Parse.Object.extend('records');
  const query = new Parse.Query(records);
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  try {
    const results = await query.find();
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
      const where = object.get('where')
      const blogName = object.get('blogName')
      const imgUrl = object.get('imgUrl')
      const description = object.get('description')
      console.log(where);
      console.log(blogName);
      console.log(imgUrl);
      console.log(description);
    }
  } catch (error) {
    console.error('Error while fetching records', error);
  }
})();
(async () => {
  const records: Parse.Object = Parse.Object.extend('records');
  const query: Parse.Query = new Parse.Query(records);
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  try {
    const results: Parse.Object[] = await query.find();
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
      const where: string = object.get('where')
      const blogName: string = object.get('blogName')
      const imgUrl: string = object.get('imgUrl')
      const description: string = object.get('description')
      console.log(where);
      console.log(blogName);
      console.log(imgUrl);
      console.log(description);
    }
  } catch (error: any) {
    console.error('Error while fetching records', error);
  }
})();

Example Output:

{ foo: 'bar' } 'A string' 'A string' 'A string' 

To get the values out of the Parse.Object, use the get method.

Learn more about query parameters in queries section.

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void readObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("records");

  // The query will search for a ParseObject, given its objectId.
  // When the query finishes running, it will invoke the GetCallback
  // with either the object, or the exception thrown
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
        if (e == null) {
        //Object was successfully retrieved
      } else {
        // something went wrong
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
      }  
  });
}
var query = PFQuery(className:"records")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error == nil && parseObject != nil {
    print(parseObject)
  } else {
    print(error)
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"records"];
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
    // Do something with the returned PFObject in the parseObject variable.
    NSLog(@"%@", parseObject);
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("records");
ParseObject result = await query.GetAsync("<PARSE_OBJECT_ID>");
// Use the Get<T> method to get the values
IDictionary where = result.Get<IDictionary>("where");
string blogName = result.Get<string>("blogName");
string imgUrl = result.Get<string>("imgUrl");
string description = result.Get<string>("description");
$query = new ParseQuery("records");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // To get attributes, you can use the "get" method, providing the attribute name:
  $where = $myCustomObject->get("where");
  $blogName = $myCustomObject->get("blogName");
  $imgUrl = $myCustomObject->get("imgUrl");
  $description = $myCustomObject->get("description");
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To retrieve an object, you'll need to send a GET request to its class endpoint with your app's credentials in the headers and the query parameters in the URL parameters. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/records

Method

GET

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Parameters

A where URL parameter constraining the value for keys. It should be encoded JSON.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a results field with a JSON array that lists the objects.

Error Response

Please check the Errors section.

Updating Objects

Example Request:


# Don't forget to set the OBJECT_ID parameter
curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d "{ \"where\": { \"foo\": \"bar\" },\"blogName\": \"A string\",\"imgUrl\": \"A string\",\"description\": \"A string\" }" \
https://parseapi.back4app.com/classes/records/<OBJECT_ID>

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

You can delete a single field from an object by using the Delete operation:

Example Request:


curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{ "where": {"__op":"Delete"},"blogName": {"__op":"Delete"},"imgUrl": {"__op":"Delete"},"description": {"__op":"Delete"} }' \
https://parseapi.back4app.com/classes/records

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

Code:

(async () => {
  const query = new Parse.Query(records);
  try {
    // here you put the objectId that you want to update
    const object = await query.get('xKue915KBG');
    object.set('where', { foo: 'bar' });
    object.set('blogName', 'A string');
    object.set('imgUrl', 'A string');
    object.set('description', 'A string');
    try {
      const response = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('where'));
      console.log(response.get('blogName'));
      console.log(response.get('imgUrl'));
      console.log(response.get('description'));
      console.log('records updated', response);
    } catch (error) {
      console.error('Error while updating records', error);
      }
    } catch (error) {
      console.error('Error while retrieving object records', error);
    }
})();
(async () => {
  const query: Parse.Query = new Parse.Query(records);
  try {
    // here you put the objectId that you want to update
    const object: Parse.Object = await query.get('xKue915KBG');
    object.set('where', { foo: 'bar' });
    object.set('blogName', 'A string');
    object.set('imgUrl', 'A string');
    object.set('description', 'A string');
    try {
      const response: Parse.Object = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('where'));
      console.log(response.get('blogName'));
      console.log(response.get('imgUrl'));
      console.log(response.get('description'));
      console.log('records updated', response);
    } catch (error: any) {
      console.error('Error while updating records', error);
      }
    } catch (error: any) {
      console.error('Error while retrieving object records', error);
    }
})();

Example Output:


where
blogName
imgUrl
description
records updated
{
  className: records,
   _objCount: 0,
   id: 'xKue915KBG'
}

You can delete a single field from an object with the unset method:

(async() => {
  const query = new Parse.Query('records');
  try {
    const object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('description');
    try {
      const response = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('description'));
    } catch (error) {
      console.error(error);
    }
  } catch (error) {
    console.error(error);    
  }
})();
(async() => {
  const query: Parse.Query = new Parse.Query('records');
  try {
    const object: Parse.Object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('description');
    try {
      const response: Parse.Object = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('description'));
    } catch (error: any) {
      console.error(error);
    }
  } catch (error: any) {
    console.error(error);    
  }
})();

Example Output:

{
  className: records,
  id: 'xKue915KBG',
  _localId: undefined,
  _objCount: 0, 
}
undefined

Please note that use of object.set(null) to remove a field from an object is not recommended and will result in unexpected functionality.

import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;

public void updateObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("records");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was successfully retrieved
      // Update the fields we want to
      object.put("where", new JSONObject());
      object.put("blogName", "A string");
      object.put("imgUrl", "A string");
      object.put("description", "A string");

      //All other fields will remain the same
      object.saveInBackground();

    } else {
      // something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }  
  });

}
var query = PFQuery(className:"records")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    parseObject["where"] = [ "foo": "bar" ]
    parseObject["blogName"] = "A string"
    parseObject["imgUrl"] = "A string"
    parseObject["description"] = "A string"

    parseObject.saveInBackground()
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"records"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>"
                             block:^(PFObject *parseObject, NSError *error) {
    parseObject[@"where"] = @{ @"foo": @"bar" };
    parseObject[@"blogName"] = @"A string";
    parseObject[@"imgUrl"] = @"A string";
    parseObject[@"description"] = @"A string";

    [parseObject saveInBackground];
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("records");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
myObject["where"] = new Dictionary<string, object> { { "number", number }, { "string", str } };
myObject["blogName"] = "A string";
myObject["imgUrl"] = "A string";
myObject["description"] = "A string";
await myObject.SaveAsync();

You can delete a single field from an object with the Remove method:

ParseQuery<ParseObject> query = ParseObject.GetQuery("MyCustomClassName");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
myObject.Remove("where");
myObject.Remove("blogName");
myObject.Remove("imgUrl");
myObject.Remove("description");
await myObject.SaveAsync();
$query = new ParseQuery("records");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // Update any data you want with the "set" method,
  // providing the attribute name and the new value
  $myCustomObject->set("where", ["foo" => "bar"]);
  $myCustomObject->set("blogName", "A string");
  $myCustomObject->set("imgUrl", "A string");
  $myCustomObject->set("description", "A string");

  // And then save your changes
  $myCustomObject->save();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To update data on an object that already exists, send a PUT request to this object endpoint with your app's credentials in the headers and the query parameters in the body. Any keys you don’t specify will remain unchanged, so you can update just a subset of the object’s data. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/records/MyCurrentObjectId

Method

PUT

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent the object's new data.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a updatedAt field with the timestamp of the update.

Error Response

Please check the Errors section.

Deleting Objects

Example Request:

# Don't forget to set the OBJECT_ID parameter
curl -X DELETE \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
https://parseapi.back4app.com/classes/records/<OBJECT_ID>

Example Response:

{}

Code:

(async () => {
  const query = new Parse.Query('records');
  try {
    // here you put the objectId that you want to delete
    const object = await query.get('xKue915KBG');
    try {
      const response = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error) {
    console.error('Error while retrieving ParseObject', error);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('records');
  try {
    // here you put the objectId that you want to delete
    const object: Parse.Object = await query.get('xKue915KBG');
    try {
      const response: any = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error: any) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error: any) {
    console.error('Error while retrieving ParseObject', error);
  }
})();

Example Output:

Deleted ParseObject
{
  className: 'records',
  _objCount: 0,
  id: 'xKue915KBG'
}
import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void deleteObject() {

  ParseQuery<ParseObject> query = ParseQuery.getQuery("records");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was fetched
      //Deletes the fetched ParseObject from the database
      object.deleteInBackground(e2 -> {
          if(e2==null){
              Toast.makeText(this, "Delete Successful", Toast.LENGTH_SHORT).show();
          }else{
              //Something went wrong while deleting the Object
              Toast.makeText(this, "Error: "+e2.getMessage(), Toast.LENGTH_SHORT).show();
          }
      });
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });

}
var deleteAttributesOnly = true

var query = PFQuery(className:"records")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    if deleteAttributesOnly {
      parseObject.removeObjectForKey("where")
      parseObject.removeObjectForKey("blogName")
      parseObject.removeObjectForKey("imgUrl")
      parseObject.removeObjectForKey("description")
      parseObject.saveInBackground()
    } else {
      parseObject.deleteInBackground()
    }
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"records"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
  // When using "removeObjectForKey", the field will be empty
  // [parseObject removeObjectForKey:@"where"];
  // [parseObject removeObjectForKey:@"blogName"];
  // [parseObject removeObjectForKey:@"imgUrl"];
  // [parseObject removeObjectForKey:@"description"];
  // Saves the field deletion to the Parse Cloud
  // [parseObject saveInBackground];

  // Or you can delete the entire object from the database
  [parseObject deleteInBackground];
}
ParseQuery<ParseObject> query = ParseObject.GetQuery("records");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
await myObject.DeleteAsync();
$query = new ParseQuery("records");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // After this, the field will be empty
  $myCustomObject->delete("where");
  $myCustomObject->delete("blogName");
  $myCustomObject->delete("imgUrl");
  $myCustomObject->delete("description");
  // Saves any changes done to the object
  $myCustomObject->save();

  // Otherwise, you can delete the entire object from the database
  $myCustomObject->destroy();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To delete an object send a DELETE request to this object endpoint with your app's credentials in the headers. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/records/MyCurrentObjectId

Method

DELETE

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

An empty JSON object.

Error Response

Please check the Errors section.

rareFlowers Class

Example JSON:

{
  "name": "A string",
  "birth": "2018-11-12T13:13:45.958Z",
  "birthPlace": {"__type": "GeoPoint", "latitude": 40.0, "longitude": -30.0 }
}

rareFlowers is a custom class that was created and is specific for ToDoListApp. Please use the following documentation to learn how to perform CRUD (create, read, update and delete) operations to this specific class. A new endpoint was automatically generated at the address below to which you can send your requests:

https://parseapi.back4app.com/classes/rareFlowers

The following fields are supported by this class' schema and can be used in the operations:

Name Type Example
name String "A string"
birth Date "2018-11-12T13:13:45.958Z"
birthPlace GeoPoint {"__type": "GeoPoint", "latitude": 40.0, "longitude": -30.0 }

Creating Objects

Example Request:

curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d "{ \"name\":\"A string\",\"birth\":{ \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },\"birthPlace\":{ \"__type\": \"GeoPoint\", \"latitude\": 40.0, \"longitude\": -30.0 } }" \
https://parseapi.back4app.com/classes/rareFlowers

Example Response:

{
  "objectId": "4BwpMWdCnm",
  "createdAt": "2018-11-06T00:52:01.520Z"
}

Code:

(async () => {
  const myNewObject = new Parse.Object('rareFlowers');
  myNewObject.set('name', 'A string');
  myNewObject.set('birth', new Date());
  myNewObject.set('birthPlace', new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}));
  try {
    const result = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('rareFlowers created', result);
  } catch (error) {
    console.error('Error while creating rareFlowers: ', error);
  }
})();
(async () => {
  const myNewObject: Parse.Object = new Parse.Object('rareFlowers');
  myNewObject.set('name', 'A string');
  myNewObject.set('birth', new Date());
  myNewObject.set('birthPlace', new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}));
  try {
    const result: Parse.Object = await myNewObject.save();
    // Access the Parse Object attributes using the .GET method
    console.log('rareFlowers created', result);
  } catch (error: any) {
    console.error('Error while creating rareFlowers: ', error);
  }
})();
import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;
import com.parse.SaveCallback;

public void createObject() {
  ParseObject entity = new ParseObject("rareFlowers");

  entity.put("name", "A string");
  entity.put("birth", new Date());
  entity.put("birthPlace", new ParseGeoPoint(40.0, -30.0));

  // Saves the new object.
  // Notice that the SaveCallback is totally optional!
  entity.saveInBackground(e -> {
    if (e==null){
      //Save was done
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });

}
var parseObject = PFObject(className:"rareFlowers")

parseObject["name"] = "A string"
parseObject["birth"] = NSDate()
parseObject["birthPlace"] = PFGeoPoint(latitude:40.0, longitude:-30.0)

// Saves the new object.
parseObject.saveInBackground {
  (success: Bool, error: Error?) in
  if (success) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}
PFObject *parseObject = [PFObject objectWithClassName:@"rareFlowers"];

parseObject[@"name"] = @"A string";
parseObject[@"birth"] = [NSDate date];
parseObject[@"birthPlace"] = [PFGeoPoint geoPointWithLatitude:40.0 longitude:-30.0];

[parseObject saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (succeeded) {
    // The object has been saved.
  } else {
    // There was a problem, check error.description
  }
}];
ParseObject myObject = new ParseObject("rareFlowers");
myObject["name"] = "A string";
myObject["birth"] = DateTime.Now;
myObject["birthPlace"] = new ParseGeoPoint(40.0, -30.0);
await myObject.SaveAsync();
$myCustomObject = new ParseObject("rareFlowers");

$myCustomObject->set("name", "A string");
$myCustomObject->set("birth", new DateTime());
$myCustomObject->set("birthPlace", new ParseGeoPoint(40.0, -30.0));

try {
  $myCustomObject->save();
  echo 'New object created with objectId: ' . $myCustomObject->getObjectId();
} catch (ParseException $ex) {
  // Execute any logic that should take place if the save fails.
  // error is a ParseException object with an error code and message.
  echo 'Failed to create new object, with error message: ' . $ex->getMessage();
}

Example Output:

{
  id: 'xKue915KBG',
  _objCount: 0,
  className: 'rareFlowers
}

To create a new object of the rareFlowers class, you'll need to send a POST request to the rareFlowers class' endpoint with your app's credentials in the headers and the object's data in the body. You can include as many key-value pairs of the supported fields as you want. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/rareFlowers

Method

POST

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent your object's data according to the supported fields.

Success Response

Status

201 Created

Headers

Location: https://parseapi.back4app.com/classes/rareFlowers/MyNewObjectId

The Location header will contain the endpoint of the newly-created object.

Body

A JSON document with the objectId and createdAt fields of the newly-created object.

Error Response

Please check the Errors section.

Reading Objects

Example Request:

curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode "where={ \"name\":\"A string\",\"birth\":{ \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },\"birthPlace\":{ \"__type\": \"GeoPoint\", \"latitude\": 40.0, \"longitude\": -30.0 } }" \
https://parseapi.back4app.com/classes/rareFlowers

Example Response:

{
  "results": [
    {
      "objectId": "zJxVP17mTi",
      "createdAt": "2018-10-31T14:16:13.616Z",
      "updatedAt": "2018-11-07T12:12:20.758Z",
      "name": \"A string\","birth": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },"birthPlace": { \"__type\": \"GeoPoint\", \"latitude\": 40.0, \"longitude\": -30.0 }
    },
    {
      "objectId": "yDbv0gKGJR",
      "createdAt": "2018-10-31T14:16:42.811Z",
      "updatedAt": "2018-11-07T12:12:18.543Z",
      "name": \"A string\","birth": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },"birthPlace": { \"__type\": \"GeoPoint\", \"latitude\": 40.0, \"longitude\": -30.0 }
    },
    {
      "objectId": "xKue915KBG",
      "createdAt": "2018-11-07T12:11:58.533Z",
      "updatedAt": "2018-11-07T12:12:15.413Z",
      "name": \"A string\","birth": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },"birthPlace": { \"__type\": \"GeoPoint\", \"latitude\": 40.0, \"longitude\": -30.0 }
    }
  ]
}

Without any URL parameters, this simply lists all objects in the class.

Learn more about query parameters in queries section.

Code:

(async () => {
  const rareFlowers = Parse.Object.extend('rareFlowers');
  const query = new Parse.Query(rareFlowers);
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  try {
    const results = await query.find();
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
      const name = object.get('name')
      const birth = object.get('birth')
      const birthPlace = object.get('birthPlace')
      console.log(name);
      console.log(birth);
      console.log(birthPlace);
    }
  } catch (error) {
    console.error('Error while fetching rareFlowers', error);
  }
})();
(async () => {
  const rareFlowers: Parse.Object = Parse.Object.extend('rareFlowers');
  const query: Parse.Query = new Parse.Query(rareFlowers);
  // You can also query by using a parameter of an object
  // query.equalTo('objectId', 'xKue915KBG');
  try {
    const results: Parse.Object[] = await query.find();
    for (const object of results) {
      // Access the Parse Object attributes using the .GET method
      const name: string = object.get('name')
      const birth: string = object.get('birth')
      const birthPlace: string = object.get('birthPlace')
      console.log(name);
      console.log(birth);
      console.log(birthPlace);
    }
  } catch (error: any) {
    console.error('Error while fetching rareFlowers', error);
  }
})();

Example Output:

'A string' new Date() new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}) 

To get the values out of the Parse.Object, use the get method.

Learn more about query parameters in queries section.

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void readObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("rareFlowers");

  // The query will search for a ParseObject, given its objectId.
  // When the query finishes running, it will invoke the GetCallback
  // with either the object, or the exception thrown
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
        if (e == null) {
        //Object was successfully retrieved
      } else {
        // something went wrong
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
      }  
  });
}
var query = PFQuery(className:"rareFlowers")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error == nil && parseObject != nil {
    print(parseObject)
  } else {
    print(error)
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"rareFlowers"];
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
    // Do something with the returned PFObject in the parseObject variable.
    NSLog(@"%@", parseObject);
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("rareFlowers");
ParseObject result = await query.GetAsync("<PARSE_OBJECT_ID>");
// Use the Get<T> method to get the values
string name = result.Get<string>("name");
DateTime birth = result.Get<DateTime>("birth");
ParseGeoPoint birthPlace = result.Get<ParseGeoPoint>("birthPlace");
$query = new ParseQuery("rareFlowers");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // To get attributes, you can use the "get" method, providing the attribute name:
  $name = $myCustomObject->get("name");
  $birth = $myCustomObject->get("birth");
  $birthPlace = $myCustomObject->get("birthPlace");
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To retrieve an object, you'll need to send a GET request to its class endpoint with your app's credentials in the headers and the query parameters in the URL parameters. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/rareFlowers

Method

GET

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Parameters

A where URL parameter constraining the value for keys. It should be encoded JSON.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a results field with a JSON array that lists the objects.

Error Response

Please check the Errors section.

Updating Objects

Example Request:


# Don't forget to set the OBJECT_ID parameter
curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d "{ \"name\": \"A string\",\"birth\": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },\"birthPlace\": { \"__type\": \"GeoPoint\", \"latitude\": 40.0, \"longitude\": -30.0 } }" \
https://parseapi.back4app.com/classes/rareFlowers/<OBJECT_ID>

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

You can delete a single field from an object by using the Delete operation:

Example Request:


curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{ "name": {"__op":"Delete"},"birth": {"__op":"Delete"},"birthPlace": {"__op":"Delete"} }' \
https://parseapi.back4app.com/classes/rareFlowers

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

Code:

(async () => {
  const query = new Parse.Query(rareFlowers);
  try {
    // here you put the objectId that you want to update
    const object = await query.get('xKue915KBG');
    object.set('name', 'A string');
    object.set('birth', new Date());
    object.set('birthPlace', new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}));
    try {
      const response = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('name'));
      console.log(response.get('birth'));
      console.log(response.get('birthPlace'));
      console.log('rareFlowers updated', response);
    } catch (error) {
      console.error('Error while updating rareFlowers', error);
      }
    } catch (error) {
      console.error('Error while retrieving object rareFlowers', error);
    }
})();
(async () => {
  const query: Parse.Query = new Parse.Query(rareFlowers);
  try {
    // here you put the objectId that you want to update
    const object: Parse.Object = await query.get('xKue915KBG');
    object.set('name', 'A string');
    object.set('birth', new Date());
    object.set('birthPlace', new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}));
    try {
      const response: Parse.Object = await object.save();
      // You can use the "get" method to get the value of an attribute
      // Ex: response.get("<ATTRIBUTE_NAME>")
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('name'));
      console.log(response.get('birth'));
      console.log(response.get('birthPlace'));
      console.log('rareFlowers updated', response);
    } catch (error: any) {
      console.error('Error while updating rareFlowers', error);
      }
    } catch (error: any) {
      console.error('Error while retrieving object rareFlowers', error);
    }
})();

Example Output:


name
birth
birthPlace
rareFlowers updated
{
  className: rareFlowers,
   _objCount: 0,
   id: 'xKue915KBG'
}

You can delete a single field from an object with the unset method:

(async() => {
  const query = new Parse.Query('rareFlowers');
  try {
    const object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('birthPlace');
    try {
      const response = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('birthPlace'));
    } catch (error) {
      console.error(error);
    }
  } catch (error) {
    console.error(error);    
  }
})();
(async() => {
  const query: Parse.Query = new Parse.Query('rareFlowers');
  try {
    const object: Parse.Object = await query.get('xKue915KBG');
    // After this, the myCustomKeyName field will be empty
    object.unset('birthPlace');
    try {
      const response: Parse.Object = await object.save();
      console.log(response);
      // Access the Parse Object attributes using the .GET method
      console.log(response.get('birthPlace'));
    } catch (error: any) {
      console.error(error);
    }
  } catch (error: any) {
    console.error(error);    
  }
})();

Example Output:

{
  className: rareFlowers,
  id: 'xKue915KBG',
  _localId: undefined,
  _objCount: 0, 
}
undefined

Please note that use of object.set(null) to remove a field from an object is not recommended and will result in unexpected functionality.

import java.util.Date;
import javax.json.JSONArray;
import javax.json.JSONObject;

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseRelation;

public void updateObject() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("rareFlowers");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was successfully retrieved
      // Update the fields we want to
      object.put("name", "A string");
      object.put("birth", new Date());
      object.put("birthPlace", new ParseGeoPoint(40.0, -30.0));

      //All other fields will remain the same
      object.saveInBackground();

    } else {
      // something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }  
  });

}
var query = PFQuery(className:"rareFlowers")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    parseObject["name"] = "A string"
    parseObject["birth"] = NSDate()
    parseObject["birthPlace"] = PFGeoPoint(latitude:40.0, longitude:-30.0)

    parseObject.saveInBackground()
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"rareFlowers"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>"
                             block:^(PFObject *parseObject, NSError *error) {
    parseObject[@"name"] = @"A string";
    parseObject[@"birth"] = [NSDate date];
    parseObject[@"birthPlace"] = [PFGeoPoint geoPointWithLatitude:40.0 longitude:-30.0];

    [parseObject saveInBackground];
}];
ParseQuery<ParseObject> query = ParseObject.GetQuery("rareFlowers");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
myObject["name"] = "A string";
myObject["birth"] = DateTime.Now;
myObject["birthPlace"] = new ParseGeoPoint(40.0, -30.0);
await myObject.SaveAsync();

You can delete a single field from an object with the Remove method:

ParseQuery<ParseObject> query = ParseObject.GetQuery("MyCustomClassName");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
myObject.Remove("name");
myObject.Remove("birth");
myObject.Remove("birthPlace");
await myObject.SaveAsync();
$query = new ParseQuery("rareFlowers");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // Update any data you want with the "set" method,
  // providing the attribute name and the new value
  $myCustomObject->set("name", "A string");
  $myCustomObject->set("birth", new DateTime());
  $myCustomObject->set("birthPlace", new ParseGeoPoint(40.0, -30.0));

  // And then save your changes
  $myCustomObject->save();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To update data on an object that already exists, send a PUT request to this object endpoint with your app's credentials in the headers and the query parameters in the body. Any keys you don’t specify will remain unchanged, so you can update just a subset of the object’s data. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/rareFlowers/MyCurrentObjectId

Method

PUT

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent the object's new data.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a updatedAt field with the timestamp of the update.

Error Response

Please check the Errors section.

Deleting Objects

Example Request:

# Don't forget to set the OBJECT_ID parameter
curl -X DELETE \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
https://parseapi.back4app.com/classes/rareFlowers/<OBJECT_ID>

Example Response:

{}

Code:

(async () => {
  const query = new Parse.Query('rareFlowers');
  try {
    // here you put the objectId that you want to delete
    const object = await query.get('xKue915KBG');
    try {
      const response = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error) {
    console.error('Error while retrieving ParseObject', error);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('rareFlowers');
  try {
    // here you put the objectId that you want to delete
    const object: Parse.Object = await query.get('xKue915KBG');
    try {
      const response: any = await object.destroy();
      console.log('Deleted ParseObject', response);
    } catch (error: any) {
      console.error('Error while deleting ParseObject', error);
    }
  } catch (error: any) {
    console.error('Error while retrieving ParseObject', error);
  }
})();

Example Output:

Deleted ParseObject
{
  className: 'rareFlowers',
  _objCount: 0,
  id: 'xKue915KBG'
}
import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void deleteObject() {

  ParseQuery<ParseObject> query = ParseQuery.getQuery("rareFlowers");

  // Retrieve the object by id
  query.getInBackground("<PARSE_OBJECT_ID>", (object, e) -> {
    if (e == null) {
      //Object was fetched
      //Deletes the fetched ParseObject from the database
      object.deleteInBackground(e2 -> {
          if(e2==null){
              Toast.makeText(this, "Delete Successful", Toast.LENGTH_SHORT).show();
          }else{
              //Something went wrong while deleting the Object
              Toast.makeText(this, "Error: "+e2.getMessage(), Toast.LENGTH_SHORT).show();
          }
      });
    }else{
      //Something went wrong
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });

}
var deleteAttributesOnly = true

var query = PFQuery(className:"rareFlowers")

query.getObjectInBackgroundWithId("<PARSE_OBJECT_ID>") {
  (parseObject: PFObject?, error: NSError?) -> Void in
  if error != nil {
    print(error)
  } else if parseObject != nil {
    if deleteAttributesOnly {
      parseObject.removeObjectForKey("name")
      parseObject.removeObjectForKey("birth")
      parseObject.removeObjectForKey("birthPlace")
      parseObject.saveInBackground()
    } else {
      parseObject.deleteInBackground()
    }
  }
}
PFQuery *query = [PFQuery queryWithClassName:@"rareFlowers"];

// Retrieve the object by id
[query getObjectInBackgroundWithId:@"<PARSE_OBJECT_ID>" block:^(PFObject *parseObject, NSError *error) {
  // When using "removeObjectForKey", the field will be empty
  // [parseObject removeObjectForKey:@"name"];
  // [parseObject removeObjectForKey:@"birth"];
  // [parseObject removeObjectForKey:@"birthPlace"];
  // Saves the field deletion to the Parse Cloud
  // [parseObject saveInBackground];

  // Or you can delete the entire object from the database
  [parseObject deleteInBackground];
}
ParseQuery<ParseObject> query = ParseObject.GetQuery("rareFlowers");
ParseObject myObject = await query.GetAsync("<PARSE_OBJECT_ID>");
await myObject.DeleteAsync();
$query = new ParseQuery("rareFlowers");
try {
  $myCustomObject = $query->get("<PARSE_OBJECT_ID>");
  // The object was retrieved successfully.

  // After this, the field will be empty
  $myCustomObject->delete("name");
  $myCustomObject->delete("birth");
  $myCustomObject->delete("birthPlace");
  // Saves any changes done to the object
  $myCustomObject->save();

  // Otherwise, you can delete the entire object from the database
  $myCustomObject->destroy();
} catch (ParseException $ex) {
  // The object was not retrieved successfully.
  // error is a ParseException with an error code and message.
}

To delete an object send a DELETE request to this object endpoint with your app's credentials in the headers. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/classes/rareFlowers/MyCurrentObjectId

Method

DELETE

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

An empty JSON object.

Error Response

Please check the Errors section.

User API

Example Object:

{
  "objectId": "4BwpMWdCnm",
  "username": "A string",
  "email": "A string",
  "firstName": "A string",
  "lastName": "A string",
  "birthDate": "2018-11-12T13:13:45.958Z",
  "avatarPicture": { "__type": "File", "name": "resume.txt" },
  "name": "A string",
  "imageUrl": "A string",
  "nativeFirstName": "A string",
  "nativeLastName": "A string",
  "mobilePhoneNumber": "A string",
  "role": "A string",
  "jobTitle": "A string",
  "active": true,
  "fullName": "A string",
  "retypePassword": "A string",
  "phoneNumber": "A string",
  "repeatPassword": "A string",
  "idealCarSpeedRating": "A string",
  "currentCarYearWasMade": "A string",
  "idealCarHowMuchToBuyFor": "A string",
  "currentCarSpeedRating": "A string",
  "idealCarYearWasMade": "A string",
  "currentCarSpaceRating": "A string",
  "currentCarSafetyRating": "A string",
  "currentCarModel": "A string",
  "idealNextCarTrim": "A string",
  "currentCarSuitabilityForEverydayUseRating": "A string",
  "idealCarSuitabilityForEverydayUseRating": "A string",
  "idealCarSpaceRating": "A string",
  "currentCarWhenCarWasBought": "A string",
  "idealCarModel": "A string",
  "currentCarManufacturer": "A string",
  "currentCarTrim": "A string",
  "idealCarSafetyRating": "A string",
  "idealCarManufacturer": "A string",
  "idealCarWhenToPurchase": "A string",
  "idealCarComfortRating": "A string",
  "currentCarComfort": "A string",
  "currentCarHowMuchWasBoughtFor": "A string",
  "sessionToken": "A string",
  "currentGeoPoint": {"__type": "GeoPoint", "latitude": 40.0, "longitude": -30.0 },
  "avatar": "A string",
  "AccountType": "A string",
  "Provider": "A string",
  "Name": "A string",
  "company": "A string",
  "Full_Name": "A string",
  "phone": "A string",
  "currentCarSuitabilityForEverydayUseRatng": "A string",
  "posters": [1, "a string"],
  "vip": "A string",
  "city": "A string",
  "confirmPassword": "A string",
  "address": "A string",
  "repass": "A string",
  "fisrtName": "A string",
  "password": "#Password123",
  "createdAt": "2018-11-06T00:52:01.520Z",
  "updatedAt": "2018-11-06T00:52:04.713Z"
}

The special keys objectId, createdAt and updatedAt are default and always automatically created by the platform.

User is a subclass of Object, what meanings that has the same properties and methods as a generic object. The difference is that Parse.User has some special additions specific to user accounts.

As others objects, users have a flexible schema, the differences are that the username and password fields are required and username and email must be unique per user.

For each new custom class that you create in your app's schema (either through API or just sending the data), a new endpoint is generated at the address below through which you can perform your CRUD operations:

https://parseapi.back4app.com/user/MyCurrentUserObjectId

Signing Up

Example Request:

# Don't forget to set your own User data!
curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "X-Parse-Revocable-Session: 1" \
-H "Content-Type: application/json" \
-d "{ \"password\":\"#Password123\", \"username\": \"A string\",\"email\": \"A string\",\"firstName\": \"A string\",\"lastName\": \"A string\",\"birthDate\": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },\"avatarPicture\": { \"__type\": \"File\", \"name\": \"resume.txt\" },\"name\": \"A string\",\"imageUrl\": \"A string\",\"nativeFirstName\": \"A string\",\"nativeLastName\": \"A string\",\"mobilePhoneNumber\": \"A string\",\"role\": \"A string\",\"jobTitle\": \"A string\",\"active\": true,\"fullName\": \"A string\",\"retypePassword\": \"A string\",\"phoneNumber\": \"A string\",\"repeatPassword\": \"A string\",\"idealCarSpeedRating\": \"A string\",\"currentCarYearWasMade\": \"A string\",\"idealCarHowMuchToBuyFor\": \"A string\",\"currentCarSpeedRating\": \"A string\",\"idealCarYearWasMade\": \"A string\",\"currentCarSpaceRating\": \"A string\",\"currentCarSafetyRating\": \"A string\",\"currentCarModel\": \"A string\",\"idealNextCarTrim\": \"A string\",\"currentCarSuitabilityForEverydayUseRating\": \"A string\",\"idealCarSuitabilityForEverydayUseRating\": \"A string\",\"idealCarSpaceRating\": \"A string\",\"currentCarWhenCarWasBought\": \"A string\",\"idealCarModel\": \"A string\",\"currentCarManufacturer\": \"A string\",\"currentCarTrim\": \"A string\",\"idealCarSafetyRating\": \"A string\",\"idealCarManufacturer\": \"A string\",\"idealCarWhenToPurchase\": \"A string\",\"idealCarComfortRating\": \"A string\",\"currentCarComfort\": \"A string\",\"currentCarHowMuchWasBoughtFor\": \"A string\",\"sessionToken\": \"A string\",\"currentGeoPoint\": { \"__type\": \"GeoPoint\", \"latitude\": 40.0, \"longitude\": -30.0 },\"avatar\": \"A string\",\"AccountType\": \"A string\",\"Provider\": \"A string\",\"Name\": \"A string\",\"company\": \"A string\",\"Full_Name\": \"A string\",\"phone\": \"A string\",\"currentCarSuitabilityForEverydayUseRatng\": \"A string\",\"posters\": [ 1, \"a string\" ],\"vip\": \"A string\",\"city\": \"A string\",\"confirmPassword\": \"A string\",\"address\": \"A string\",\"repass\": \"A string\",\"fisrtName\": \"A string\" }" \
https://parseapi.back4app.com/users

Example Response:

{ "objectId":"nr7hAYS43a","createdAt":"2018-11-08T13:08:42.914Z","sessionToken":"r:35c2ae1c1def6c38a469e41ce671cb7e" }

Code:

(async () => {
  const user = new Parse.User();
  user.set('username', 'A string');
  user.set('email', 'A string');
  user.set('firstName', 'A string');
  user.set('lastName', 'A string');
  user.set('birthDate', new Date());
  user.set('avatarPicture', new Parse.File("resume.txt", { base64: btoa("My file content") }));
  user.set('name', 'A string');
  user.set('imageUrl', 'A string');
  user.set('nativeFirstName', 'A string');
  user.set('nativeLastName', 'A string');
  user.set('mobilePhoneNumber', 'A string');
  user.set('role', 'A string');
  user.set('jobTitle', 'A string');
  user.set('active', true);
  user.set('fullName', 'A string');
  user.set('retypePassword', 'A string');
  user.set('phoneNumber', 'A string');
  user.set('repeatPassword', 'A string');
  user.set('idealCarSpeedRating', 'A string');
  user.set('currentCarYearWasMade', 'A string');
  user.set('idealCarHowMuchToBuyFor', 'A string');
  user.set('currentCarSpeedRating', 'A string');
  user.set('idealCarYearWasMade', 'A string');
  user.set('currentCarSpaceRating', 'A string');
  user.set('currentCarSafetyRating', 'A string');
  user.set('currentCarModel', 'A string');
  user.set('idealNextCarTrim', 'A string');
  user.set('currentCarSuitabilityForEverydayUseRating', 'A string');
  user.set('idealCarSuitabilityForEverydayUseRating', 'A string');
  user.set('idealCarSpaceRating', 'A string');
  user.set('currentCarWhenCarWasBought', 'A string');
  user.set('idealCarModel', 'A string');
  user.set('currentCarManufacturer', 'A string');
  user.set('currentCarTrim', 'A string');
  user.set('idealCarSafetyRating', 'A string');
  user.set('idealCarManufacturer', 'A string');
  user.set('idealCarWhenToPurchase', 'A string');
  user.set('idealCarComfortRating', 'A string');
  user.set('currentCarComfort', 'A string');
  user.set('currentCarHowMuchWasBoughtFor', 'A string');
  user.set('sessionToken', 'A string');
  user.set('currentGeoPoint', new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}));
  user.set('avatar', 'A string');
  user.set('AccountType', 'A string');
  user.set('Provider', 'A string');
  user.set('Name', 'A string');
  user.set('company', 'A string');
  user.set('Full_Name', 'A string');
  user.set('phone', 'A string');
  user.set('currentCarSuitabilityForEverydayUseRatng', 'A string');
  user.set('posters', [1, 'a string']);
  user.set('vip', 'A string');
  user.set('city', 'A string');
  user.set('confirmPassword', 'A string');
  user.set('address', 'A string');
  user.set('repass', 'A string');
  user.set('fisrtName', 'A string');
  user.set('password', '#Password123');

  try {
    let userResult = await user.signUp();
    console.log('User signed up', userResult);
  } catch (error) {
    console.error('Error while signing up user', error);
  }
})();
(async () => {
  const user: Parse.User = new Parse.User();
  user.set('username', 'A string');
  user.set('email', 'A string');
  user.set('firstName', 'A string');
  user.set('lastName', 'A string');
  user.set('birthDate', new Date());
  user.set('avatarPicture', new Parse.File("resume.txt", { base64: btoa("My file content") }));
  user.set('name', 'A string');
  user.set('imageUrl', 'A string');
  user.set('nativeFirstName', 'A string');
  user.set('nativeLastName', 'A string');
  user.set('mobilePhoneNumber', 'A string');
  user.set('role', 'A string');
  user.set('jobTitle', 'A string');
  user.set('active', true);
  user.set('fullName', 'A string');
  user.set('retypePassword', 'A string');
  user.set('phoneNumber', 'A string');
  user.set('repeatPassword', 'A string');
  user.set('idealCarSpeedRating', 'A string');
  user.set('currentCarYearWasMade', 'A string');
  user.set('idealCarHowMuchToBuyFor', 'A string');
  user.set('currentCarSpeedRating', 'A string');
  user.set('idealCarYearWasMade', 'A string');
  user.set('currentCarSpaceRating', 'A string');
  user.set('currentCarSafetyRating', 'A string');
  user.set('currentCarModel', 'A string');
  user.set('idealNextCarTrim', 'A string');
  user.set('currentCarSuitabilityForEverydayUseRating', 'A string');
  user.set('idealCarSuitabilityForEverydayUseRating', 'A string');
  user.set('idealCarSpaceRating', 'A string');
  user.set('currentCarWhenCarWasBought', 'A string');
  user.set('idealCarModel', 'A string');
  user.set('currentCarManufacturer', 'A string');
  user.set('currentCarTrim', 'A string');
  user.set('idealCarSafetyRating', 'A string');
  user.set('idealCarManufacturer', 'A string');
  user.set('idealCarWhenToPurchase', 'A string');
  user.set('idealCarComfortRating', 'A string');
  user.set('currentCarComfort', 'A string');
  user.set('currentCarHowMuchWasBoughtFor', 'A string');
  user.set('sessionToken', 'A string');
  user.set('currentGeoPoint', new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}));
  user.set('avatar', 'A string');
  user.set('AccountType', 'A string');
  user.set('Provider', 'A string');
  user.set('Name', 'A string');
  user.set('company', 'A string');
  user.set('Full_Name', 'A string');
  user.set('phone', 'A string');
  user.set('currentCarSuitabilityForEverydayUseRatng', 'A string');
  user.set('posters', [1, 'a string']);
  user.set('vip', 'A string');
  user.set('city', 'A string');
  user.set('confirmPassword', 'A string');
  user.set('address', 'A string');
  user.set('repass', 'A string');
  user.set('fisrtName', 'A string');
  user.set('password', '#Password123');

  try {
    let userResult: Parse.User = await user.signUp();
    console.log('User signed up', userResult);
  } catch (error: any) {
    console.error('Error while signing up user', error);
  }
})();
import com.parse.ParseException;
import com.parse.ParseUser;
import com.parse.SignUpCallback;

public void createUser() {
  ParseUser user = new ParseUser();
  user.setUsername("my name");
  user.setPassword("my pass");
  user.setEmail("email@example.com");

  // Other fields can be set just like any other ParseObject,
  // using the "put" method, like this: user.put("attribute", "its value");
  // If this field does not exists, it will be automatically created

  user.signUpInBackground(e -> {
    if (e == null) {
        // Hooray! Let them use the app now.
    } else {
        // Sign up didn't succeed. Look at the ParseException
        // to figure out what went wrong
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}

func createUser() {
  var user = PFUser()
  user.username = "myUsername"
  user.password = "myPassword"
  user.email = "email@example.com"

  // Other fields can be set just like any other PFObject,
  // like this: user["attribute"] = "its value"
  // If this field does not exists, it will be automatically created

  user.signUpInBackgroundWithBlock {
    (succeeded: Bool, error: NSError?) -> Void in
    if let error = error {
      let errorString = error.userInfo["error"] as? NSString
      // Show the errorString somewhere and let the user try again.
    } else {
      // Hooray! Let them use the app now.
    }
  }
}
PFUser *user = [PFUser user];
user.username = @"my name";
user.password = @"my pass";
user.email = @"email@example.com";

// Other fields can be set just like any other PFObject,
// like this: user[@"attribute"] = @"its value";
// If this field does not exists, it will be automatically created

[user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (!error) {
    // Hooray! Let them use the app now.
  } else {
    // Show the errorString somewhere and let the user try again.
    NSString *errorString = [error userInfo][@"error"];
  }
}];
public async void SignUpButton_Click(object sender, RoutedEventArgs e)
{
    var user = new ParseUser()
    {
        Username = "myname",
        Password = "MyPaSs123#",
        Email = "email@example.com"
    };

    // Other fields can be set just like any other PFObject,
    // like this: user["attribute"] = "its value"
    // If this field does not exists, it will be automatically created

    await user.SignUpAsync();
}
$user = new ParseUser();
$user->set("username", "my name");
$user->set("password", "my pass");
$user->set("email", "email@example.com");

// Other fields can be set just like any other ParseObject,
// like this: $user->set("attribute", "its value");
// If this field does not exists, it will be automatically created
// other fields can be set just like with ParseObject

try {
  $user->signUp();
  // Hooray! Let them use the app now.
} catch (ParseException $ex) {
  // Show the error message somewhere and let the user try again.
  echo "Error: " . $ex->getCode() . " " . $ex->getMessage();
}

Example Output:

ParseUser { _objCount: 0, className: '_User', id: 'luo69YBMXi' }

To signing up a new user, you'll need to send a POST request to /users endpoint with your app's credentials in the headers and the object's data in the body. You can include as many key-value pairs as you want. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/users

Method

POST

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

X-Parse-Revocable-Session: 1

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent your object's data. It must contain a valid username and password.

Success Response

Status

201 Created

Headers

Location: https://parseapi.back4app.com/users/MyNewUserId

The Location header will contain the endpoint of the newly-created user.

Body

A JSON document with the objectId, createdAt and sessionToken fields of the newly-created user.

Error Response

Please check the Errors section.

Logging In

Example Request:

# Don't forget to set the USERNAME and PASSWORD parameters!
curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "X-Parse-Revocable-Session: 1" \
-G \
--data-urlencode 'username=<USERNAME>' \
--data-urlencode 'password=<PASSWORD>' \
https://parseapi.back4app.com/login

Example Response:

{
  "objectId":"AHRLeYvh0d",
  "username":"newUserName",
  "createdAt":"2018-11-08T13:50:56.843Z",
  "updatedAt":"2018-11-08T13:50:56.843Z",
  "sessionToken":"r:8d975a0f207fab1211752da3be0a3c81"
}

The response could contain another custom fields.

Code:

(async () => {
  try {
    // Pass the username and password to logIn function
    let user = await Parse.User.logIn('newUserName','#Password123');
    // Do stuff after successful login
    console.log('Logged in user', user);
  } catch (error) {
    console.error('Error while logging in user', error);
  }
})();
(async () => {
  try {
    // Pass the username and password to logIn function
    let user: Parse.User = await Parse.User.logIn('newUserName','#Password123');
    // Do stuff after successful login
    console.log('Logged in user', user);
  } catch (error: any) {
    console.error('Error while logging in user', error);
  }
})();

Example Output:

ParseUser { _objCount: 0, className: '_User', id: 'M2Uln6C4vk' }
import com.parse.LogInCallback;
import com.parse.ParseException;
import com.parse.ParseUser;

public void loginUser() {
  ParseUser.logInInBackground("<userName>", "<password>", (user, e) -> {
    if (user != null) {
        // Hooray! The user is logged in.
    } else {
        // Login failed. Look at the ParseException to see what happened.
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
PFUser.logInWithUsernameInBackground("<userName>", password:"<password>") {
  (user: PFUser?, error: NSError?) -> Void in
  if user != nil {
    // Do stuff after successful login.
  } else {
    // The login failed. Check error to see why.
  }
}
[PFUser logInWithUsernameInBackground:@"myname" password:@"mypass"
  block:^(PFUser *user, NSError *error) {
    if (user) {
      // Do stuff after successful login.
    } else {
      // The login failed. Check error to see why.
    }
  }
];
try
{
    await ParseUser.LogInAsync("myname", "mypass");
    // Login was successful.
}
catch (Exception e)
{
    // The login failed. Check the error to see why.
}
try {
  $user = ParseUser::logIn("myname", "mypass");
  // Do stuff after successful login.
} catch (ParseException $error) {
  // The login failed. Check error to see why.
}

To log in into a user account you'll need to send a GET request to /login endpoint with your app's credentials in the headers and the username and password as URL parameters. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/login

Method

GET

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

X-Parse-Revocable-Session: 1

Parameters

Pass the username and password in URL parameters. It should be encoded JSON.

Success Response

Status

200 OK

Body

A JSON document with the user's fields.

Error Response

Please check the Errors section.

Verifying Email

Example Request:

# Don't forget to set the target e-mail!
curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{"email":"email@example.com"}' \
https://parseapi.back4app.com/verificationEmailRequest

Example Response:

{}

Example Request:

(async () => {
  const https = require('https');

  const params = '{"email": "email@example.com"}';

  const options = {
    hostname: 'https://parseapi.back4app.com',
    path: '/verificationEmailRequest',
    method: 'POST',
    headers: {
      'X-Parse-Application-Id': 'BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f',
      'X-Parse-REST-API-Key': 'swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w',
      'Content-Type': 'application/json'
    }
  };

  const req = https.request(options, (res) => {
    console.log(`STATUS: ${res.statusCode}`);
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
      console.log(`BODY: ${chunk}`);
    });
    res.on('end', () => {
      console.log('No more data in response.');
    });
  });

  req.on('error', (e) => {
    console.error(`Problem with request: ${e.message}`);
  });

  // write data to request body
  req.write(params);
  req.end();
})();
(async () => {
  const https = require('https');

  const params: string = '{"email": "email@example.com"}';

  const options: object = {
    hostname: 'https://parseapi.back4app.com',
    path: '/verificationEmailRequest',
    method: 'POST',
    headers: {
      'X-Parse-Application-Id': 'BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f',
      'X-Parse-REST-API-Key': 'swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w',
      'Content-Type': 'application/json'
    }
  };

  const req: https.request = https.request(options, (res) => {
    console.log(`STATUS: ${res.statusCode}`);
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
      console.log(`BODY: ${chunk}`);
    });
    res.on('end', () => {
      console.log('No more data in response.');
    });
  });

  req.on('error', (e: any) => {
    console.error(`Problem with request: ${e.message}`);
  });

  // write data to request body
  req.write(params);
  req.end();
})();

Example Response:

STATUS: 200
BODY: {}
No more data in response.

Enable email verification in server settings provides the app to reserve part of its experience just to users with confirmed email addresses. Email verification adds the emailVerified key to the Parse.User object. When a Parse.User’s email is set or modified, emailVerified is set to false and an email is automatically sent to user email. After the validation process, the emailVerified is set to true.

You can request a verification email to be sent by sending a POST request to /verificationEmailRequest endpoint with email in the body of the request:

Sign up

Code:

(async () => {
  const user = new Parse.User()
  user.set('username', 'A string');
  user.set('email', 'A string');
  user.set('firstName', 'A string');
  user.set('lastName', 'A string');
  user.set('birthDate', new Date());
  user.set('avatarPicture', new Parse.File("resume.txt", { base64: btoa("My file content") }));
  user.set('name', 'A string');
  user.set('imageUrl', 'A string');
  user.set('nativeFirstName', 'A string');
  user.set('nativeLastName', 'A string');
  user.set('mobilePhoneNumber', 'A string');
  user.set('role', 'A string');
  user.set('jobTitle', 'A string');
  user.set('active', true);
  user.set('fullName', 'A string');
  user.set('retypePassword', 'A string');
  user.set('phoneNumber', 'A string');
  user.set('repeatPassword', 'A string');
  user.set('idealCarSpeedRating', 'A string');
  user.set('currentCarYearWasMade', 'A string');
  user.set('idealCarHowMuchToBuyFor', 'A string');
  user.set('currentCarSpeedRating', 'A string');
  user.set('idealCarYearWasMade', 'A string');
  user.set('currentCarSpaceRating', 'A string');
  user.set('currentCarSafetyRating', 'A string');
  user.set('currentCarModel', 'A string');
  user.set('idealNextCarTrim', 'A string');
  user.set('currentCarSuitabilityForEverydayUseRating', 'A string');
  user.set('idealCarSuitabilityForEverydayUseRating', 'A string');
  user.set('idealCarSpaceRating', 'A string');
  user.set('currentCarWhenCarWasBought', 'A string');
  user.set('idealCarModel', 'A string');
  user.set('currentCarManufacturer', 'A string');
  user.set('currentCarTrim', 'A string');
  user.set('idealCarSafetyRating', 'A string');
  user.set('idealCarManufacturer', 'A string');
  user.set('idealCarWhenToPurchase', 'A string');
  user.set('idealCarComfortRating', 'A string');
  user.set('currentCarComfort', 'A string');
  user.set('currentCarHowMuchWasBoughtFor', 'A string');
  user.set('sessionToken', 'A string');
  user.set('currentGeoPoint', new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}));
  user.set('avatar', 'A string');
  user.set('AccountType', 'A string');
  user.set('Provider', 'A string');
  user.set('Name', 'A string');
  user.set('company', 'A string');
  user.set('Full_Name', 'A string');
  user.set('phone', 'A string');
  user.set('currentCarSuitabilityForEverydayUseRatng', 'A string');
  user.set('posters', [1, 'a string']);
  user.set('vip', 'A string');
  user.set('city', 'A string');
  user.set('confirmPassword', 'A string');
  user.set('address', 'A string');
  user.set('repass', 'A string');
  user.set('fisrtName', 'A string');
  user.set('password', '#Password123')

  try {
    let userResult = await user.signUp();
    Parse.User.logOut();
    console.log("User signed up. Please verify your e-mail")
  } catch (error) {
    console.error('Error while signing up user', error);
  }
})();
(async () => {
  const user: Parse.User = new Parse.User();
  user.set('username', 'A string');
  user.set('email', 'A string');
  user.set('firstName', 'A string');
  user.set('lastName', 'A string');
  user.set('birthDate', new Date());
  user.set('avatarPicture', new Parse.File("resume.txt", { base64: btoa("My file content") }));
  user.set('name', 'A string');
  user.set('imageUrl', 'A string');
  user.set('nativeFirstName', 'A string');
  user.set('nativeLastName', 'A string');
  user.set('mobilePhoneNumber', 'A string');
  user.set('role', 'A string');
  user.set('jobTitle', 'A string');
  user.set('active', true);
  user.set('fullName', 'A string');
  user.set('retypePassword', 'A string');
  user.set('phoneNumber', 'A string');
  user.set('repeatPassword', 'A string');
  user.set('idealCarSpeedRating', 'A string');
  user.set('currentCarYearWasMade', 'A string');
  user.set('idealCarHowMuchToBuyFor', 'A string');
  user.set('currentCarSpeedRating', 'A string');
  user.set('idealCarYearWasMade', 'A string');
  user.set('currentCarSpaceRating', 'A string');
  user.set('currentCarSafetyRating', 'A string');
  user.set('currentCarModel', 'A string');
  user.set('idealNextCarTrim', 'A string');
  user.set('currentCarSuitabilityForEverydayUseRating', 'A string');
  user.set('idealCarSuitabilityForEverydayUseRating', 'A string');
  user.set('idealCarSpaceRating', 'A string');
  user.set('currentCarWhenCarWasBought', 'A string');
  user.set('idealCarModel', 'A string');
  user.set('currentCarManufacturer', 'A string');
  user.set('currentCarTrim', 'A string');
  user.set('idealCarSafetyRating', 'A string');
  user.set('idealCarManufacturer', 'A string');
  user.set('idealCarWhenToPurchase', 'A string');
  user.set('idealCarComfortRating', 'A string');
  user.set('currentCarComfort', 'A string');
  user.set('currentCarHowMuchWasBoughtFor', 'A string');
  user.set('sessionToken', 'A string');
  user.set('currentGeoPoint', new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}));
  user.set('avatar', 'A string');
  user.set('AccountType', 'A string');
  user.set('Provider', 'A string');
  user.set('Name', 'A string');
  user.set('company', 'A string');
  user.set('Full_Name', 'A string');
  user.set('phone', 'A string');
  user.set('currentCarSuitabilityForEverydayUseRatng', 'A string');
  user.set('posters', [1, 'a string']);
  user.set('vip', 'A string');
  user.set('city', 'A string');
  user.set('confirmPassword', 'A string');
  user.set('address', 'A string');
  user.set('repass', 'A string');
  user.set('fisrtName', 'A string');
  user.set('password', '#Password123');

  try {
    let userResult: Parse.User = await user.signUp();
    Parse.User.logOut();
    console.log("User signed up. Please verify your e-mail")
  } catch (error: any) {
    console.error('Error while signing up user', error);
  }
})();

Example Output:

"Please verify your e-mail"
import com.parse.ParseException;
import com.parse.ParseUser;
import com.parse.SignUpCallback;

public void signInWithEmailVerification() {
  ParseUser user = new ParseUser();
  user.setUsername("my name");
  user.setPassword("my pass");
  user.setEmail("email@example.com");

  // Other fields can be set just like any other ParseObject,
  // using the "put" method, like this: user.put("attribute", "its value");
  // If this field does not exists, it will be automatically created

  user.signUpInBackground(e -> {
    if (e == null) {
        // Here you should tell the user to verify the e-mail
        ParseUser.logOut();
    } else {
        // Sign up didn't succeed. Look at the ParseException
        // to figure out what went wrong
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}

func createUser() {
  var user = PFUser()
  user.username = "myUsername"
  user.password = "myPassword"
  user.email = "email@example.com"

  // Other fields can be set just like any other PFObject,
  // like this: user["attribute"] = "its value"
  // If this field does not exists, it will be automatically created

  user.signUpInBackgroundWithBlock {
    (succeeded: Bool, error: NSError?) -> Void in
    if let error = error {
      let errorString = error.userInfo["error"] as? NSString
      // Show the errorString somewhere and let the user try again.
    } else {
      // Here you should tell the user to verify the e-mail
      PFUser.logOut();
    }
  }
}
PFUser *user = [PFUser user];
user.username = @"my name";
user.password = @"my pass";
user.email = @"email@example.com";

// Other fields can be set just like any other PFObject,
// like this: user[@"attribute"] = @"its value";
// If this field does not exists, it will be automatically created

[user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  if (!error) {
    // Here you should tell the user to verify the e-mail
    [PFUser logOut];
  } else {
    // Show the errorString somewhere and let the user try again.
    NSString *errorString = [error userInfo][@"error"];
  }
}];
public async void SignUpButton_Click(object sender, RoutedEventArgs e)
{
    var user = new ParseUser()
    {
        Username = "myname",
        Password = "MyPaSs123#",
        Email = "email@example.com"
    };

    // Other fields can be set just like any other PFObject,
    // like this: user["attribute"] = "its value"
    // If this field does not exists, it will be automatically created

    await user.SignUpAsync();

    // Here you should tell the user to verify the e-mail
    user.LogOut();
}
$user = new ParseUser();
$user->set("username", "my name");
$user->set("password", "my pass");
$user->set("email", "email@example.com");

// Other fields can be set just like any other ParseObject,
// like this: $user->set("attribute", "its value");
// If this field does not exists, it will be automatically created
// other fields can be set just like with ParseObject

try {
  $user->signUp();

  // Here you should tell the user to verify the e-mail
  ParseUser::logOut();
} catch (ParseException $ex) {
  // Show the error message somewhere and let the user try again.
  echo "Error: " . $ex->getCode() . " " . $ex->getMessage();
}

To implement Sign Up with Email Verification, you will use the same method which you used to implement the basic user registration. But this time, instead of making an intent to the next page, you will ask the user to verify his or her email to login

Once the sign up process is completed, the user is automatically added to Parse Dashboard and its emailVerified Boolean attribute is set as true. Email verification is must as only you’ll be allowed to let your users access your app entirely.

Log in

Code:

(async () => {
  try {
    // Pass the username and password to logIn function
    let user = await Parse.User.logIn('newUserName','#Password123');
    if (user.get('emailVerified')) {
      console.log('User logged in', user);
    } else {
      Parse.User.logOut();
      console.log('User logged in. Please verify your email first');
    }
  } catch (error) {
    console.error('Error while logging in user', error);
  }
})();
(async () => {
  try {
    // Pass the username and password to logIn function
    let user: Parse.User = await Parse.User.logIn('newUserName','#Password123');
    if (user.get('emailVerified')) {
      console.log('User logged in', user);
    } else {
      Parse.User.logOut();
      console.log('User logged in. Please verify your email first');
    }
  } catch (error: any) {
    console.error('Error while logging in user', error);
  }
})();

Example Output:

ParseUser { _objCount: 0, className: '_User', id: 'kzunnPFh5i' }

Finally, you may add your own code to provide feedback

import com.parse.LogInCallback;
import com.parse.ParseException;
import com.parse.ParseUser;

public void loginUserWithEmailVerification() {

  ParseUser.logInInBackground("<userName>", "<password>", (user, e) -> {
    if (user != null) {
        Boolean emailVerified = user.getBoolean("emailVerified");
        if (emailVerified == true) {
          // Hooray! The user is logged in.
        } else {
          // User did not confirm the e-mail!!
        }
    } else {
        // Login failed. Look at the ParseException to see what happened.
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
PFUser.logInWithUsernameInBackground("<userName>", password:"<password>") {
  (user: PFUser?, error: NSError?) -> Void in
  if user != nil {
    if user["emailVerified"] != nil && user["emailVerified"] {
      // User logged in successfully :)
    } else {
      // User did not confirm the e-mail!!
    }
  } else {
    // The login failed. Check error to see why.
  }
}
[PFUser logInWithUsernameInBackground:@"myname" password:@"mypass"
  block:^(PFUser *user, NSError *error) {
    if (user && !user[@"emailVerified"]) {
      // User did not confirm the e-mail!!
      [PFUser logOut];
    }
  }
];
try
{
    var user await ParseUser.LogInAsync("myname", "mypass");
    if (user["emailVerified"] == true) {
        // User logged in successfully :)
    } else {
        // User did not confirm the e-mail!!
    }
}
catch (Exception e)
{
    // The login failed. Check the error to see why.
}
try {
  $user = ParseUser::logIn("myname", "mypass");

  if (!($user->get("emailVerified") == true)) {
    // User did not confirm the e-mail!!
    ParseUser::logOut();
  }
} catch (ParseException $error) {
  // The login failed. Check error to see why.
}

To implement Log In with Email Verification, you will use the same method which you used to implement the basic user registration. But this time, you will check the emailVerified boolean before granting further access to the user.

Requesting Password Reset

Example Request:

# Don't forget to set the target e-mail!
curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{"email":"email@example.com"}' \
https://parseapi.back4app.com/requestPasswordReset

Example Response:

{}

Code:

(async () => {
  try {
    // Pass the username and password to logIn function
    let result = await Parse.User.requestPasswordReset("email@example.com");
    // Password reset request was sent successfully
    console.log('Reset password email sent successfully');
  } catch (error) {
    console.error('Error while creating request to reset user password', error);
  }
})();
(async () => {
  try {
    // Pass the username and password to logIn function
    let result: any = await Parse.User.requestPasswordReset("email@example.com");
    // Password reset request was sent successfully
    console.log('Reset password email sent successfully');
  } catch (error: any) {
    console.error('Error while creating request to reset user password', error);
  }
})();

Example Output:

{}
import com.parse.ParseException;
import com.parse.ParseUser;
import com.parse.RequestPasswordResetCallback;

public void passwordReset() {
  // An e-mail will be sent with further instructions
  ParseUser.requestPasswordResetInBackground("myemail@example.com", e -> {
    if (e == null) {
      // An email was successfully sent with reset instructions.
    } else {
      // Something went wrong. Look at the ParseException to see what's up.
    }
  });
}
// An e-mail will be sent with further instructions
PFUser.requestPasswordResetForEmailInBackground("email@example.com")
[PFUser requestPasswordResetForEmailInBackground:@"email@example.com"];
// An e-mail will be sent with further instructions
await ParseUser.RequestPasswordResetAsync("email@example.com");
ParseUser::requestVerificationEmail('email@example.com');

You can initiate password resets for users who have emails associated with their account. To do this, send a POST request to /requestPasswordReset endpoint with email in the body of the request: This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/requestPasswordReset

Method

POST

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Content-Type: application/json

Body

A JSON document with the user's email.

Success Response

Status

200 OK

Body

An empty JSON document.

Error Response

Please check the Errors section.

Retrieving Current User

Example Request:

# Don't forget to set the session token, received
# when you logged in or signed up
curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "X-Parse-Session-Token: <SESSION_TOKEN>" \
https://parseapi.back4app.com/users/me

Example Response:

{
  "username": "myuser123",
  "myCustomKeyName": "myCustomKeyValue",
  "createdAt": "2018-11-07T20:58:34.448Z",
  "updatedAt": "2018-11-07T20:58:34.448Z",
  "objectId": "g7y9tkhB7O",
  "sessionToken":"r:03a4c2d87a63a020a7d737c6fc64fd4c"
}

Code:

(async () => {
  try {
    let user = await Parse.User.logIn('newUserName','#Password123');
    const currentUser = Parse.User.current();
    console.log('Current logged in user', currentUser);
  } catch (error) {
    console.error('Error while logging in user', error);
  }
})();
(async () => {
  try {
    let user: Parse.User = await Parse.User.logIn('newUserName','#Password123');
    const currentUser: Parse.User = Parse.User.current();
    console.log('Current logged in user', currentUser);
  } catch (error: any) {
    console.error('Error while logging in user', error);
  }
})();

Example Output:

ParseUser { _objCount: 0, className: '_User', id: 'hEPjkt4epS' }

Please note that this functionality is disabled by default on Node.js environments (such as React Native) to discourage stateful usages on server-side configurations.

import com.parse.ParseUser;

public void getCurrentUser() {
  // After login, Parse will cache it on disk, so
  // we don't need to login every time we open this
  // application
  ParseUser currentUser = ParseUser.getCurrentUser();
  if (currentUser != null) {
    // do stuff with the user
  } else {
    // show the signup or login screen
  }
}
var currentUser = PFUser.currentUser()
if currentUser != nil {
  // Do stuff with the user
} else {
  // Show the signup or login screen
}
PFUser *currentUser = [PFUser currentUser];
if (currentUser) {
  // do stuff with the user
} else {
  // show the signup or login screen
}
if (ParseUser.CurrentUser != null)
{
    // do stuff with the user
}
else
{
    // show the signup or login screen
}
$currentUser = ParseUser::getCurrentUser();
if ($currentUser) {
  // Do stuff with the user
} else {
  // Show the signup or login page
}

To retrieve the current user, you'll need to send a GET request to users/me endpoint with your app's credentials and the session token in the headers. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/users/me

Method

GET

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

X-Parse-Session-Token: r:03a4c2d87a63a020a7d737c6fc64fd4c

Success Response

Status

200 OK

Body

A JSON document with all the user-provided fields, except password.

Error Response

Please check the Errors section.

Reading Users

Example Request:

# Don't forget to set the USER_OBJECT_ID parameter
curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
https://parseapi.back4app.com/users/<USER_OBJECT_ID>

Example Response:

{
  "username":\"A string\",
  "email":\"A string\",
  "firstName":\"A string\",
  "lastName":\"A string\",
  "birthDate":{ \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },
  "avatarPicture":{ \"__type\": \"File\", \"name\": \"resume.txt\" },
  "name":\"A string\",
  "imageUrl":\"A string\",
  "nativeFirstName":\"A string\",
  "nativeLastName":\"A string\",
  "mobilePhoneNumber":\"A string\",
  "role":\"A string\",
  "jobTitle":\"A string\",
  "active":true,
  "fullName":\"A string\",
  "retypePassword":\"A string\",
  "phoneNumber":\"A string\",
  "repeatPassword":\"A string\",
  "idealCarSpeedRating":\"A string\",
  "currentCarYearWasMade":\"A string\",
  "idealCarHowMuchToBuyFor":\"A string\",
  "currentCarSpeedRating":\"A string\",
  "idealCarYearWasMade":\"A string\",
  "currentCarSpaceRating":\"A string\",
  "currentCarSafetyRating":\"A string\",
  "currentCarModel":\"A string\",
  "idealNextCarTrim":\"A string\",
  "currentCarSuitabilityForEverydayUseRating":\"A string\",
  "idealCarSuitabilityForEverydayUseRating":\"A string\",
  "idealCarSpaceRating":\"A string\",
  "currentCarWhenCarWasBought":\"A string\",
  "idealCarModel":\"A string\",
  "currentCarManufacturer":\"A string\",
  "currentCarTrim":\"A string\",
  "idealCarSafetyRating":\"A string\",
  "idealCarManufacturer":\"A string\",
  "idealCarWhenToPurchase":\"A string\",
  "idealCarComfortRating":\"A string\",
  "currentCarComfort":\"A string\",
  "currentCarHowMuchWasBoughtFor":\"A string\",
  "sessionToken":\"A string\",
  "currentGeoPoint":{ \"__type\": \"GeoPoint\", \"latitude\": 40.0, \"longitude\": -30.0 },
  "avatar":\"A string\",
  "AccountType":\"A string\",
  "Provider":\"A string\",
  "Name":\"A string\",
  "company":\"A string\",
  "Full_Name":\"A string\",
  "phone":\"A string\",
  "currentCarSuitabilityForEverydayUseRatng":\"A string\",
  "posters":[ 1, \"a string\" ],
  "vip":\"A string\",
  "city":\"A string\",
  "confirmPassword":\"A string\",
  "address":\"A string\",
  "repass":\"A string\",
  "fisrtName":\"A string\"

  "createdAt": "2018-11-07T20:58:34.448Z",
  "updatedAt": "2018-11-07T20:58:34.448Z",
  "objectId": "g7y9tkhB7O",
}

Code:

(async () => {
  const User = new Parse.User();
  const query = new Parse.Query(User);

  try {
    let user = await query.get('hEPjkt4epS');
    console.log('User found', user);
  } catch (error) {
    console.error('Error while fetching user', error);
  }
})();
(async () => {
  const User: Parse.User = new Parse.User();
  const query: Parse.Query = new Parse.Query(User);

  try {
    let user: Parse.Object = await query.get('hEPjkt4epS');
    console.log('User found', user);
  } catch (error: any) {
    console.error('Error while fetching user', error);
  }
})();

Example Output:

ParseUser { _objCount: 1, className: '_User', id: 'hEPjkt4epS' }
import java.util.List;

import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseQuery;
import com.parse.ParseUser;

public void findUsers() {
  ParseQuery<ParseUser> query = ParseUser.getQuery();
  query.whereEqualTo("email", "email@example.com");
  query.findInBackground((users, e) -> {
    if (e == null) {
        // The query was successful, returns the users that matches
        // the criteria.
        for(ParseUser user1 : users) {
            Log.d("User List ",(user1.getUsername()));
        }
    } else {
        // Something went wrong.
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
var query = PFUser.query()
query.whereKey("email", equalTo:"email@example.com")
var users = query.findObjects()
PFQuery *query = [PFUser query];
[query whereKey:@"email" equalTo:@"email@example.com"];
NSArray *users = [query findObjects];
var user = await ParseUser.Query
    .WhereEqualTo("Email", "email@example.com")
    .FindAsync();
$query = ParseUser::query();
$query->equalTo("email", "email@example.com");

// Finds all users with the given email
$users = $query->find();

To retrieve users is almost the same way as retrieving a generic Parse.Object, you'll need to send a GET request to its users endpoint with your app's credentials in the headers. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/users/myCurrentUserId

Method

GET

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

Success Response

Status

200 OK

Body

A JSON document with all the user-provided fields except password.

Error Response

Please check the Errors section.

Updating Users

Example Request:

# Don't forget to set the SESSION_TOKEN and USER_OBJECT_ID parameters
curl -X PUT \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "X-Parse-Session-Token: <SESSION_TOKEN>" \
-H "Content-Type: application/json" \
-d "{ \"username\": \"A string\",\"email\": \"A string\",\"firstName\": \"A string\",\"lastName\": \"A string\",\"birthDate\": { \"__type\": \"Date\", \"iso\": \"2018-11-06T18:02:52.249Z\" },\"avatarPicture\": { \"__type\": \"File\", \"name\": \"resume.txt\" },\"name\": \"A string\",\"imageUrl\": \"A string\",\"nativeFirstName\": \"A string\",\"nativeLastName\": \"A string\",\"mobilePhoneNumber\": \"A string\",\"role\": \"A string\",\"jobTitle\": \"A string\",\"active\": true,\"fullName\": \"A string\",\"retypePassword\": \"A string\",\"phoneNumber\": \"A string\",\"repeatPassword\": \"A string\",\"idealCarSpeedRating\": \"A string\",\"currentCarYearWasMade\": \"A string\",\"idealCarHowMuchToBuyFor\": \"A string\",\"currentCarSpeedRating\": \"A string\",\"idealCarYearWasMade\": \"A string\",\"currentCarSpaceRating\": \"A string\",\"currentCarSafetyRating\": \"A string\",\"currentCarModel\": \"A string\",\"idealNextCarTrim\": \"A string\",\"currentCarSuitabilityForEverydayUseRating\": \"A string\",\"idealCarSuitabilityForEverydayUseRating\": \"A string\",\"idealCarSpaceRating\": \"A string\",\"currentCarWhenCarWasBought\": \"A string\",\"idealCarModel\": \"A string\",\"currentCarManufacturer\": \"A string\",\"currentCarTrim\": \"A string\",\"idealCarSafetyRating\": \"A string\",\"idealCarManufacturer\": \"A string\",\"idealCarWhenToPurchase\": \"A string\",\"idealCarComfortRating\": \"A string\",\"currentCarComfort\": \"A string\",\"currentCarHowMuchWasBoughtFor\": \"A string\",\"sessionToken\": \"A string\",\"currentGeoPoint\": { \"__type\": \"GeoPoint\", \"latitude\": 40.0, \"longitude\": -30.0 },\"avatar\": \"A string\",\"AccountType\": \"A string\",\"Provider\": \"A string\",\"Name\": \"A string\",\"company\": \"A string\",\"Full_Name\": \"A string\",\"phone\": \"A string\",\"currentCarSuitabilityForEverydayUseRatng\": \"A string\",\"posters\": [ 1, \"a string\" ],\"vip\": \"A string\",\"city\": \"A string\",\"confirmPassword\": \"A string\",\"address\": \"A string\",\"repass\": \"A string\",\"fisrtName\": \"A string\" }" \
https://parseapi.back4app.com/users/<USER_OBJECT_ID>

Example Response:

{
  "updatedAt": "2011-08-21T18:02:52.248Z"
}

You must provide the X-Parse-Session-Token header to authenticate.

Code:

(async () => {
  const User = new Parse.User();
  const query = new Parse.Query(User);

  try {
    // Finds the user by its ID
    let user = await query.get('hEPjkt4epS');
    // Updates the data we want
    user.set('username', 'A string');
    user.set('email', 'A string');
    user.set('firstName', 'A string');
    user.set('lastName', 'A string');
    user.set('birthDate', new Date());
    user.set('avatarPicture', new Parse.File("resume.txt", { base64: btoa("My file content") }));
    user.set('name', 'A string');
    user.set('imageUrl', 'A string');
    user.set('nativeFirstName', 'A string');
    user.set('nativeLastName', 'A string');
    user.set('mobilePhoneNumber', 'A string');
    user.set('role', 'A string');
    user.set('jobTitle', 'A string');
    user.set('active', true);
    user.set('fullName', 'A string');
    user.set('retypePassword', 'A string');
    user.set('phoneNumber', 'A string');
    user.set('repeatPassword', 'A string');
    user.set('idealCarSpeedRating', 'A string');
    user.set('currentCarYearWasMade', 'A string');
    user.set('idealCarHowMuchToBuyFor', 'A string');
    user.set('currentCarSpeedRating', 'A string');
    user.set('idealCarYearWasMade', 'A string');
    user.set('currentCarSpaceRating', 'A string');
    user.set('currentCarSafetyRating', 'A string');
    user.set('currentCarModel', 'A string');
    user.set('idealNextCarTrim', 'A string');
    user.set('currentCarSuitabilityForEverydayUseRating', 'A string');
    user.set('idealCarSuitabilityForEverydayUseRating', 'A string');
    user.set('idealCarSpaceRating', 'A string');
    user.set('currentCarWhenCarWasBought', 'A string');
    user.set('idealCarModel', 'A string');
    user.set('currentCarManufacturer', 'A string');
    user.set('currentCarTrim', 'A string');
    user.set('idealCarSafetyRating', 'A string');
    user.set('idealCarManufacturer', 'A string');
    user.set('idealCarWhenToPurchase', 'A string');
    user.set('idealCarComfortRating', 'A string');
    user.set('currentCarComfort', 'A string');
    user.set('currentCarHowMuchWasBoughtFor', 'A string');
    user.set('sessionToken', 'A string');
    user.set('currentGeoPoint', new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}));
    user.set('avatar', 'A string');
    user.set('AccountType', 'A string');
    user.set('Provider', 'A string');
    user.set('Name', 'A string');
    user.set('company', 'A string');
    user.set('Full_Name', 'A string');
    user.set('phone', 'A string');
    user.set('currentCarSuitabilityForEverydayUseRatng', 'A string');
    user.set('posters', [1, 'a string']);
    user.set('vip', 'A string');
    user.set('city', 'A string');
    user.set('confirmPassword', 'A string');
    user.set('address', 'A string');
    user.set('repass', 'A string');
    user.set('fisrtName', 'A string');
    try {
      // Saves the user with the updated data
      let response = await user.save();
      console.log('Updated user', response);
    } catch (error) {
      console.error('Error while updating user', error);
    }
  } catch (error) {
    console.error('Error while retrieving user', error);
  }
})();
(async () => {
  const User: Parse.User = new Parse.User();
  const query: Parse.Query = new Parse.Query(User);

  try {
    // Finds the user by its ID
    let user: Parse.Object = await query.get('hEPjkt4epS');
    // Updates the data we want
    user.set('username', 'A string');
    user.set('email', 'A string');
    user.set('firstName', 'A string');
    user.set('lastName', 'A string');
    user.set('birthDate', new Date());
    user.set('avatarPicture', new Parse.File("resume.txt", { base64: btoa("My file content") }));
    user.set('name', 'A string');
    user.set('imageUrl', 'A string');
    user.set('nativeFirstName', 'A string');
    user.set('nativeLastName', 'A string');
    user.set('mobilePhoneNumber', 'A string');
    user.set('role', 'A string');
    user.set('jobTitle', 'A string');
    user.set('active', true);
    user.set('fullName', 'A string');
    user.set('retypePassword', 'A string');
    user.set('phoneNumber', 'A string');
    user.set('repeatPassword', 'A string');
    user.set('idealCarSpeedRating', 'A string');
    user.set('currentCarYearWasMade', 'A string');
    user.set('idealCarHowMuchToBuyFor', 'A string');
    user.set('currentCarSpeedRating', 'A string');
    user.set('idealCarYearWasMade', 'A string');
    user.set('currentCarSpaceRating', 'A string');
    user.set('currentCarSafetyRating', 'A string');
    user.set('currentCarModel', 'A string');
    user.set('idealNextCarTrim', 'A string');
    user.set('currentCarSuitabilityForEverydayUseRating', 'A string');
    user.set('idealCarSuitabilityForEverydayUseRating', 'A string');
    user.set('idealCarSpaceRating', 'A string');
    user.set('currentCarWhenCarWasBought', 'A string');
    user.set('idealCarModel', 'A string');
    user.set('currentCarManufacturer', 'A string');
    user.set('currentCarTrim', 'A string');
    user.set('idealCarSafetyRating', 'A string');
    user.set('idealCarManufacturer', 'A string');
    user.set('idealCarWhenToPurchase', 'A string');
    user.set('idealCarComfortRating', 'A string');
    user.set('currentCarComfort', 'A string');
    user.set('currentCarHowMuchWasBoughtFor', 'A string');
    user.set('sessionToken', 'A string');
    user.set('currentGeoPoint', new Parse.GeoPoint({latitude: 40.0, longitude: -30.0}));
    user.set('avatar', 'A string');
    user.set('AccountType', 'A string');
    user.set('Provider', 'A string');
    user.set('Name', 'A string');
    user.set('company', 'A string');
    user.set('Full_Name', 'A string');
    user.set('phone', 'A string');
    user.set('currentCarSuitabilityForEverydayUseRatng', 'A string');
    user.set('posters', [1, 'a string']);
    user.set('vip', 'A string');
    user.set('city', 'A string');
    user.set('confirmPassword', 'A string');
    user.set('address', 'A string');
    user.set('repass', 'A string');
    user.set('fisrtName', 'A string');
    try {
      // Saves the user with the updated data
      let response: Parse.Object = await user.save();
      console.log('Updated user', response);
    } catch (error: any) {
      console.error('Error while updating user', error);
    }
  } catch (error: any) {
    console.error('Error while retrieving user', error);
  }
})();

Example Output:

ParseObjectSubclass { className: _User, _objCount: 0, id: 'xKue915KBG' }
import com.parse.ParseException;
import com.parse.ParseUser;
import com.parse.SaveCallback;

public void updateUser() {
  ParseUser currentUser = ParseUser.getCurrentUser();
  if (currentUser != null) {
    // Other attributes than "email" will remain unchanged!
    currentUser.put("email", "new_email@example.com");

    // Saves the object.
    currentUser.saveInBackground(e -> {
      if(e==null){
        //Save successfull
        Toast.makeText(this, "Save Successful", Toast.LENGTH_SHORT).show();
      }else{
        // Something went wrong while saving
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
      }
    });
  }
}
var currentUser = PFUser.currentUser()
if currentUser != nil {
  currentUser["email"] = "new_email@example.com"

  currentUser.saveInBackground()
}
PFUser *currentUser = [PFUser currentUser];
if (currentUser) {
  currentUser[@"email"] = @"new_email@example.com";

  [currentUser saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    if (succeeded) {
      // The PFUser has been saved.
    } else {
      // There was a problem, check error.description
    }
  }];
}
var user = await ParseUser.currentUser();
user.Username = "my_new_username"; // attempt to change username
await user.SaveAsync(); // This succeeds, since this user was
                        // authenticated on the device
$currentUser = ParseUser::getCurrentUser();
if ($currentUser) {
  // We can set the fields just like any other ParseObject
  $user->set("email", "new_email@example.com");

  // After we make our changes, we need to save it
  $user->save();
}

To update data on an user that already exists, send a PUT request to this user endpoint with your app's credentials in the headers and the query parameters in the body. Any keys you don’t specify will remain unchanged, so you can update just a subset of the object’s data. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/users/MyUserObjectId

Method

PUT

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

X-Parse-Session-Token: myCurrentSessionToken

Content-Type: application/json

Body

A JSON document with the key-value pairs that represent the user's new data.

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

a JSON object that contains a updatedAt field with the timestamp of the update.

Error Response

Please check the Errors section.

Deleting Users

Example Request:

# Don't forget to set the SESSION_TOKEN and USER_OBJECT_ID parameters
curl -X DELETE \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "X-Parse-Session-Token: <SESSION_TOKEN>" \
https://parseapi.back4app.com/users/<USER_OBJECT_ID>

Example Response:

{}

You must provide the X-Parse-Session-Token header to authenticate.

Code:

(async () => {
  const User = new Parse.User();
  const query = new Parse.Query(User);

  try {
    // Finds the user by its ID
    let user = await query.get('FD2UCUD3t0');
    try {
      // Invokes the "destroy" method to delete the user
      let response = await user.destroy();
      console.log('Deleted user', response);
    } catch (error) {
      console.error('Error while deleting user', error);
    }
  } catch (error) {
    console.error('Error while retrieving user', error);
  }
})();
(async () => {
  const User: Parse.User = new Parse.User();
  const query: Parse.Query = new Parse.Query(User);

  try {
    // Finds the user by its ID
    let user: Parse.Object = await query.get('FD2UCUD3t0');
    try {
      // Invokes the "destroy" method to delete the user
      let response: any = await user.destroy();
      console.log('Deleted user', response);
    } catch (error: any) {
      console.error('Error while deleting user', error);
    }
  } catch (error: any) {
    console.error('Error while retrieving user', error);
  }
})();

Example Output:

ParseObjectSubclass { className: '_User', _objCount: 0, id: 'xKue915KBG' }
import com.parse.DeleteCallback;
import com.parse.ParseException;
import com.parse.ParseUser;

public void deleteUser() {
  // Notice that ParseUser extends ParseObject class, so we can
  // use the "remove" method in order to delete a single attribute.
  ParseUser currentUser = ParseUser.getCurrentUser();

  if (currentUser != null) {
    // Deletes the user.
    // Notice that the DeleteCallback is totally optional!
    currentUser.deleteInBackground(e -> {
      if(e==null){
        //Delete successfull
        Toast.makeText(this, "User was deleted", Toast.LENGTH_SHORT).show();
      }else{
        // Something went wrong while deleting
        Toast.makeText(this,e.getMessage(), Toast.LENGTH_SHORT).show();
      }
    });
  }
}
// Notice that ParseUser extends ParseObject class, so we can use
// the "removeObjectForKey" method in order to delete a single attribute.
var currentUser = PFUser.currentUser()

if currentUser != nil {
  // Deletes the user.
  currentUser.deleteInBackground()
}
PFUser *currentUser = [PFUser currentUser];
if (currentUser) {
  // Deletes the user.
  [currentUser deleteInBackground];
}
var user = await ParseUser.currentUser();
await user.DeleteAsync(); // This succeeds, since this user was
                        // authenticated on the device
$currentUser = ParseUser::getCurrentUser();
if ($currentUser) {
  // Deletes the user.
  $user->destroy();
}

To delete an user send a DELETE request to this user endpoint with your app's credentials in the headers. This task can be easily accomplished just by calling the appropriated method of your preferred Parse SDK. Please check how to do it in the right panel of this documentation.

Request

URL

https://parseapi.back4app.com/users/MyCurrentObjectId

Method

DELETE

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

X-Parse-Session-Token: myCurrentSessionToken

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

An empty JSON object.

Error Response

Please check the Errors section.

Logging Out

Example Request:

# Don't forget to set the SESSION_TOKEN and USER_OBJECT_ID parameters
curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "X-Parse-Session-Token: <SESSION_TOKEN>" \
https://parseapi.back4app.com/logout

Example Response:

{}

You must provide the X-Parse-Session-Token header to authenticate.

Code:

(async () => {
  // Checks if the user is logged in
  const currentUser = Parse.User.current();
  if (currentUser) {
    // Logs out the current user
    await Parse.User.logOut();
    console.log('User logged out');
  } else {
    console.log('No user logged in');
  }
})();
(async () => {
  // Checks if the user is logged in
  const currentUser = Parse.User.current();
  if (currentUser) {
    // Logs out the current user
    await Parse.User.logOut();
    console.log('User logged out');
  } else {
    console.log('No user logged in');
  }
}
})();

Example Output:

User logged out
import com.parse.ParseUser;

private void logoutUser() {
    // Checks if the user is logged in
    ParseUser currentUser = ParseUser.getCurrentUser();
    if (currentUser != null) {
      // Logs out the current user
        ParseUser.logOut();
        Log.d("Logout", "User logged out.");
    } else {
        Log.d("Logout", "No user found.");
    }
}
func logoutUser() {
    // Checks if the user is logged in
    if let currentUser = PFUser.current() {
        // Logs out the current user
        PFUser.logOut()
        print("User logged out.")
    } else {
        print("No user found.")
    }
}
    // Checks if the user is logged in
    PFUser *currentUser = [PFUser currentUser];
    if (currentUser) {
        // Logs out the current user
        [PFUser logOut];
        NSLog(@"User logged out.");
    } else {
        NSLog(@"No user found.");
    }

private async Task LogoutUser()
{
    // Checks if the user is logged in
    ParseUser currentUser = ParseUser.CurrentUser;
    if (currentUser != null)
    {
        // Logs out the current user
        await ParseUser.LogOutAsync();
        Console.WriteLine("User logged out.");
    }
    else
    {
        Console.WriteLine("No user found.");
    }
}
function logoutUser() {
    // Checks if the user is logged in
    $currentUser = ParseUser::getCurrentUser();
    if ($currentUser) {
        // Logs out the current user
        ParseUser::logOut();
        echo 'User logged out.';
    } else {
        echo 'No user found.';
    }
}

Request

URL

https://parseapi.back4app.com/logout

Method

POST

Headers

X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f

X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w

X-Parse-Session-Token: myCurrentSessionToken

Success Response

Status

200 OK

Headers

content-type: application/json;

Body

An empty JSON object.

Error Response

Please check the Errors section.

Queries

A query can be as simple as this, which finds all objects, given a class.

Code:

(async () => {
  // Creates a new Query object to help us fetch MyCustomClass objects
  const query = new Parse.Query('MyCustomClass');
  try {
    // Executes the query, which returns an array of MyCustomClass
    const results = await query.find();
    console.log(`ParseObjects found: ${JSON.stringify(results)}`);
  } catch (error) {
    console.log(`Error: ${JSON.stringify(error)}`);
  }
})();
(async () => {
  // Creates a new Query object to help us fetch MyCustomClass objects
  const query: Parse.Query = new Parse.Query('MyCustomClass');
  try {
    // Executes the query, which returns an array of MyCustomClass
    const results: Parse.Query[] = await query.find();
    console.log(`ParseObjects found: ${JSON.stringify(results)}`);
  } catch (error: any) {
    console.log(`Error: ${JSON.stringify(error)}`);
  }
})();
curl -X GET \
  -H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
  -H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
  https://parseapi.back4app.com/classes/MyCustomClass
import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.util.List;

public void runQuery() {

  // Creates a new ParseQuery object to help us fetch MyCustomClass objects
  ParseQuery<ParseObject> query = ParseQuery.getQuery("MyCustomClass");

  // Fetches data synchronously
  try {
    List<ParseObject> results = query.find();
    for (ParseObject result : results) {
        System.out.println("Object found " + result.getObjectId());
    }
  } catch (ParseException e) {
    e.printStackTrace();
  }

  // Or use the the non-blocking method findInBackground method with a FindCallback
 query.findInBackground((results, e) -> {
    // do some stuff with results
    if (e == null) {
      for (ParseObject result : results) {
        Log.d("Object found",result.getObjectId());
      }
    } else {
        Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
PFQuery *query = [PFQuery queryWithClassName:@"MyCustomClass"];

NSArray* results = [query findObjects];

// or use the the non-blocking method findObjectsInBackgroundWithBlock

[query findObjectsInBackgroundWithBlock:^(NSArray *results, NSError *error) {
  // do some stuff with results
}];
let query = PFQuery(className:"MyCustomClass")

let results = query.findObjects()

// or use the the non-blocking method findObjectsInBackground

query.findObjectsInBackground { (results: [PFObject]?, error: Error?) in
  // do some stuff with results
}

use Parse\ParseQuery;

$query = new ParseQuery("MyCustomClass");
$results = $query->find();
foreach($results as $result) {
  echo 'Object found ' . $result->getObjectId() . '<br>';
}
using Parse;

var query = from myCustomClass in ParseObject.GetQuery("MyCustomClass")
            select myCustomClass;
IEnumerable<ParseObject> results = await query.FindAsync();

// or using LINQ
var query = ParseObject.GetQuery("MyCustomClass");
IEnumerable<ParseObject> results = await query.FindAsync();

Sometimes you will find that the get method from the Parse Object is not enough to retrieve the exact data that you want. In this section, we will explore the Query capabilities, which allows us to fetch an array of objects, apply different constraints to filter our query results, or even get unique results given a specific field.

Counting Objects

Counting objects is as simple as that:

Code:

(async () => {
  const query = new Parse.Query('MyCustomClass');

  try {
    // Uses 'count' instead of 'find' to retrieve the number of objects
    const count = await query.count();
    console.log(`ParseObjects found: ${count}`);
  } catch (error) {
    console.log(`Error: ${error}`);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('MyCustomClass');

  try {
    // Uses 'count' instead of 'find' to retrieve the number of objects
    const count: number = await query.count();
    console.log(`ParseObjects found: ${count}`);
  } catch (error: any) {
    console.log(`Error: ${error}`);
  }
})();
curl -X GET \
  -H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
  -H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
  -G --data-urlencode "count=1" \
  https://parseapi.back4app.com/classes/MyCustomClass
import com.parse.CountCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

public void runQuery() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("MyCustomClass");
  //We can query in two ways

  //Fetches count synchronously,this will block the main thread
  try {
     int count  =  query.count();
     Toast.makeText(this, "Count : "+count, Toast.LENGTH_SHORT).show();
  } catch (ParseException e) {
    e.printStackTrace();
  }

  // Or call it asynchronously 
  query.countInBackground((count, e) -> {
      if (e == null) {
          Toast.makeText(this, "Count : "+count, Toast.LENGTH_SHORT).show();
      } else {
          Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
      }
  });
}
PFQuery *query = [PFQuery queryWithClassName:@"MyCustomClass"];

[query countObjectsInBackgroundWithBlock:^(int count, NSError *error) {
  if (!error) {
    NSLog(@"%d objects found!", count);
  } else {
    // The request failed
  }
}];
let query = PFQuery(className:"MyCustomClass")
query.countObjectsInBackground { (count: Int32, error: Error?) in
    if let error = error {
        // The request failed
        print(error.localizedDescription)
    } else {
        print("\(count) objects found!")
    }
}
use Parse\ParseQuery;

$query = new ParseQuery("MyCustomClass");
$count = $query->count();
// The count request succeeded. Show the count
echo $count . " objects found!";
using Parse;

var query = from myCustomClass in ParseObject.GetQuery("MyCustomClass")
            select myCustomClass;
int count = await query.CountAsync();

// or using LINQ
var query = ParseObject.GetQuery("MyCustomClass");
int count = await query.CountAsync();

If you do not need to retrieve any data from the objects, but count them, we have it covered.

Distinct Results

Code:

(async () => {
  const query = new Parse.Query('User');

  // Returns unique emails
  try {
    const results = await query.distinct('email');
    console.log(`Unique emails: ${JSON.stringify(results)}`);
  } catch (error) {
    console.log(`Error: ${JSON.stringify(error)}`);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('User');

  // Returns unique emails
  try {
    const results: Parse.Object[] = await query.distinct('email');
    console.log(`Unique emails: ${JSON.stringify(results)}`);
  } catch (error: any) {
    console.log(`Error: ${JSON.stringify(error)}`);
  }
})();

Example Request:

curl -X GET \
  -H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
  -H "X-Parse-Master-Key: 5AVAtvlGlG5cEeolatkFDhY5p99PzoBUvm7MBLMo" \
  -H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
  -G --data-urlencode 'distinct=likes' \
  https://parseapi.back4app.com/aggregate/Post
use Parse\ParseQuery;

$query = new ParseQuery('User');
// Returns unique emails
$results = $query->distinct('email');
foreach($results as $email) {
  echo 'Email ' . $email . '<br>';
}

Distinct feature is not yet available for this SDK, but you still can make use of the REST API directly.

The query results should contain only unique emails

It is also possible to fetch unique results for a specific field, like so:

Constraints

Code:

(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const query = new Parse.Query('Post');

  // Finds objects whose title is equal to 'Documentation'
  query.equalTo('title', 'Documentation');

  // Finds objects whose title is not equal to 'No hard feelings'
  query.notEqualTo('title', 'No hard feelings');

  // Finds objects with less than 50 likes
  query.lessThan('likes', 50);

  // Finds objects with less than or equal to 50 likes
  query.lessThanOrEqualTo('likes', 50);

  // Finds objects with more than 50 likes
  query.greaterThan('likes', 50);

  // Finds objects with more than or equal to 50 likes
  query.greaterThanOrEqualTo('likes', 50);

  // Finds objects whose 'category' field is either 'it', 'politics' or 'sports'
  query.containedIn('category', ['it', 'politics', 'sports']);

  // Finds objects whose 'category' field is neither 'music', 'health' or 'trending'
  query.notContainedIn('category', ['music', 'health', 'trending']);

  // Finds objects that have the 'relatedPost' field set
  query.exists('relatedPost');

  // Finds objects that don't have the 'relatedPost' field set
  query.doesNotExist('relatedPost');

  // Find objects where 'tags' field is an array and contains 'books'.
  query.equalTo('tags', 'books');

  // Find objects where 'tags' field is an array and contains all of the elements
  // 'fun', 'recommended', and 'cheap'.
  query.containsAll('tags', ['fun', 'recommended', 'cheap']);

  // Title starts with 'Life'
  query.startsWith('title', 'Life');

  // Title contains 'cat'
  query.fullText('title', 'cat');

  try {
    const results = await query.find();
    console.log(`ParseObjects found: ${JSON.stringify(results)}`);
  } catch (error) {
    console.log(`ParseObjects found: ${JSON.stringify(results)}`);
  }
})();
(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const query: Parse.Query = new Parse.Query('Post');

  // Finds objects whose title is equal to 'Documentation'
  query.equalTo('title', 'Documentation');

  // Finds objects whose title is not equal to 'No hard feelings'
  query.notEqualTo('title', 'No hard feelings');

  // Finds objects with less than 50 likes
  query.lessThan('likes', 50);

  // Finds objects with less than or equal to 50 likes
  query.lessThanOrEqualTo('likes', 50);

  // Finds objects with more than 50 likes
  query.greaterThan('likes', 50);

  // Finds objects with more than or equal to 50 likes
  query.greaterThanOrEqualTo('likes', 50);

  // Finds objects whose 'category' field is either 'it', 'politics' or 'sports'
  query.containedIn('category', ['it', 'politics', 'sports']);

  // Finds objects whose 'category' field is neither 'music', 'health' or 'trending'
  query.notContainedIn('category', ['music', 'health', 'trending']);

  // Finds objects that have the 'relatedPost' field set
  query.exists('relatedPost');

  // Finds objects that don't have the 'relatedPost' field set
  query.doesNotExist('relatedPost');

  // Find objects where 'tags' field is an array and contains 'books'.
  query.equalTo('tags', 'books');

  // Find objects where 'tags' field is an array and contains all of the elements
  // 'fun', 'recommended', and 'cheap'.
  query.containsAll('tags', ['fun', 'recommended', 'cheap']);

  // Title starts with 'Life'
  query.startsWith('title', 'Life');

  // Title contains 'cat'
  query.fullText('title', 'cat');

  try {
    const results: Parse.Query[] = await query.find();
    console.log(`ParseObjects found: ${JSON.stringify(results)}`);
  } catch (error: any) {
    console.log(`ParseObjects found: ${JSON.stringify(results)}`);
  }
})();
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public void runQuery() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");

  // Finds objects whose title is equal to "Documentation"
  query.whereEqualTo("title", "Documentation");

  // Finds objects whose title is not equal to "No hard feelings"
  query.whereNotEqualTo("title", "No hard feelings");

  // Finds objects with less than 50 likes
  query.whereLessThan("likes", 50);

  // Finds objects with less than or equal to 50 likes
  query.whereLessThanOrEqualTo("likes", 50);

  // Finds objects with more than 50 likes
  query.whereGreaterThan("likes", 50);

  // Finds objects with more than or equal to 50 likes
  query.whereGreaterThanOrEqualTo("likes", 50);

  // Finds objects whose "category" field is either "it", "politics" or "sports"
  query.whereContainedIn("category", Arrays.asList("it", "politics", "sports"));

  // Finds objects whose "category" field is neither "music", "health" or "trending"
  query.whereNotContainedIn("category", Arrays.asList("music", "health", "trending"));

  // Finds objects that have the "relatedPost" field set
  query.whereExists("relatedPost");

  // Finds objects that don't have the "relatedPost" field set
  query.whereDoesNotExist("relatedPost");

  // Find objects where "tags" field is an array and contains "books".
  query.whereEqualTo("tags", "books");

  // Find objects where "tags" field is an array and contains all of the elements
  // "fun", "recommended", and "cheap".
  List<String> myTags = new ArrayList<String>();
  myTags.add("fun");
  myTags.add("recommended");
  myTags.add("cheap");
  query.whereContainsAll("tags", myTags);

  // Title starts with "Life"
  query.whereStartsWith("title", "Life");

  // Title contains "cat"
  query.whereFullText("title", "cat");

  query.findInBackground((objects, e) -> {
    if(e == null){
        for (ParseObject result : objects) {
            Log.d("Object found ",result.getObjectId());
        }
    }else{
        Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
// "Post" is just an arbitrary class, replace it with your custom class
PFQuery *query = [PFQuery queryWithClassName:@"Post"];

// Finds objects whose title is equal to "Documentation"
[query whereKey:@"title" equalTo:@"Documentation"];

// Finds objects whose title is not equal to "No hard feelings"
[query whereKey:@"title" equalTo:@"No hard feelings"];

// Finds objects with less than 50 likes
[query whereKey:@"likes" lessThan:@50];

// Finds objects with less than or equal to 50 likes
[query whereKey:@"likes" lessThanOrEqualTo:@50];

// Finds objects with more than 50 likes
[query whereKey:@"likes" greaterThan:@50];

// Finds objects with more than or equal to 50 likes
[query whereKey:@"likes" greaterThanOrEqualTo:@50];

// Finds objects whose "category" field is either "it", "politics" or "sports"
[query whereKey:@"category" containedIn:@[@"it", @"politics", @"sports"]];

// Finds objects whose "category" field is neither "music", "health" or "trending"
[query whereKey:@"category" containedIn:@[@"music", @"health", @"trending"]];

// Finds objects that have the "relatedPost" field set
[query whereKeyExists:@"relatedPost"];

// Finds objects that don't have the "relatedPost" field set
[query doesNotExist:@"relatedPost"];

// Find objects where "tags" field is an array and contains "books".
[query whereKey:@"tags" equalTo:@"books"];

// Find objects where "tags" field is an array and contains all of the elements
// "fun", "recommended", and "cheap".
[query whereKey:@"tags" containsAllObjectsInArray:@[@"fun", @"recommended", @"cheap"]];

// Title starts with "Life"
[query whereKey:@"title" hasPrefix:@"Life"];

// Title contains "cat"
[query whereKey:@"title" matchesText:@"cat"];

NSArray* results = [query findObjects];
// "Post" is just an arbitrary class, replace it with your custom class
let query = PFQuery(className:"Post")

// Finds objects whose title is equal to "Documentation"
query.whereKey("title", equalTo: "Documentation");

// Finds objects whose title is not equal to "No hard feelings"
query.whereKey("title", notEqualTo: "No hard feelings");

// Finds objects with less than 50 likes
query.whereKey("likes", lessThan: 50);

// Finds objects with less than or equal to 50 likes
query.whereKey("likes", lessThanOrEqualTo: 50);

// Finds objects with more than 50 likes
query.whereKey("likes", greaterThan: 50);

// Finds objects with more than or equal to 50 likes
query.whereKey("likes", greaterThanOrEqualTo: 50);

// Finds objects whose "category" field is either "it", "politics" or "sports"
query.whereKey("category", containedIn: ["it", "politics", "sports"]);

// Finds objects whose "category" field is neither "music", "health" or "trending"
query.whereKey("category", notContainedIn: ["music", "health", "trending"]);

// Finds objects that have the "relatedPost" field set
query.whereKeyExists("relatedPost");

// Finds objects that don't have the "relatedPost" field set
query.whereKeyDoesNotExist("relatedPost");

// Find objects where "tags" field is an array and contains "books".
query.whereKey("tags", equalTo: "books");

// Find objects where "tags" field is an array and contains all of the elements
// "fun", "recommended", and "cheap".
query.whereKey("tags", containsAllObjectsIn: ["fun", "recommended", "cheap"]);

// Title starts with "Life"
query.whereKey("title", hasPrefix: "Life");

// Title contains "cat"
query.whereKey('title', matchesText: 'cat');

let results = query.findObjects()
use Parse\ParseQuery;

$query = new ParseQuery('Post');

// Finds objects whose title is equal to "Documentation"
$query->equalTo("title", "Documentation");

// Finds objects whose title is not equal to "No hard feelings"
$query->notEqualTo("title", "No hard feelings");

// Finds objects with less than 50 likes
$query->lessThan("likes", 50);

// Finds objects with less than or equal to 50 likes
$query->lessThanOrEqualTo("likes", 50);

// Finds objects with more than 50 likes
$query->greaterThan("likes", 50);

// Finds objects with more than or equal to 50 likes
$query->greaterThanOrEqualTo("likes", 50);

// Finds objects whose "category" field is either "it", "politics" or "sports"
$query->containedIn("category", ["it", "politics", "sports"]);

// Finds objects whose "category" field is neither "music", "health" or "trending"
$query->notContainedIn("category", ["music", "health", "trending"]);

// Finds objects that have the "relatedPost" field set
$query->exists("relatedPost");

// Finds objects that don't have the "relatedPost" field set
$query->doesNotExist("relatedPost");

// Find objects where "tags" field is an array and contains "books".
$query->equalTo("tags", "books");

// Find objects where "tags" field is an array and contains all of the elements
// "fun", "recommended", and "cheap".
$query->containsAll("tags", ["fun", "recommended", "cheap"]);

// Title starts with "Life"
$query->startsWith("name", "Life");

// Title contains "cat"
$query->fullText('title', 'cat');

$results = $query->find();
foreach($results as $result) {
  echo 'Object found ' . $result->getObjectId() . '<br>';
}
using Parse;

// "Post" is just an arbitrary class, replace it with your custom class
var query = from post in ParseObject.GetQuery("Post")
            // Finds objects whose title is equal to "Documentation"
            where post.Get<string>("title") == "Documentation"

            // Finds objects whose title is not equal to "No hard feelings"
            where post.Get<string>("title") != "No hard feelings"

            // Finds objects with less than 50 likes
            where post.Get<int>("likes") < 50

            // Finds objects with less than or equal to 50 likes
            where post.Get<int>("likes") <= 50

            // Finds objects with more than 50 likes
            where post.Get<int>("likes") > 50

            // Finds objects with more than or equal to 50 likes
            where post.Get<int>("likes") >= 50

            // Finds objects whose "category" field is either "it", "politics" or "sports"
            where (new[] {"it", "politics", "sports"}).Contains(post.Get<string>("category"))

            // Finds objects whose "category" field is neither "music", "health" or "trending"
            where (new[] {"music", "health", "trending"}).Contains(post.Get<string>("category"))

            // Finds objects that have the "relatedPost" field set
            where post.ContainsKey("relatedPost")

            // Finds objects that don't have the "relatedPost" field set
            where !post.ContainsKey("relatedPost")

            // Find objects where "tags" field is an array and contains "books".
            where post.Get<IList<string>>("tags").Contains("books")

            // Title starts with "Life"
            where post.Get<string>("title").StartsWith("Life")

            select post;

// or using LINQ
// "Post" is just an arbitrary class, replace it with your custom class
var query = ParseObject.GetQuery("Post")
    // Finds objects whose title is equal to "Documentation"
    .WhereEqualTo("title", "Documentation")

    // Finds objects whose title is not equal to "No hard feelings"
    .WhereNotEqualTo("title", "No hard feelings")

    // Finds objects with less than 50 likes
    .WhereLessThan("likes", 50)

    // Finds objects with less than or equal to 50 likes
    .WhereLessThanOrEqualTo("likes", 50)

    // Finds objects with more than 50 likes
    .WhereGreaterThan("likes", 50)

    // Finds objects with more than or equal to 50 likes
    .WhereGreaterThanOrEqualTo("likes", 50)

    // Finds objects whose "category" field is either "it", "politics" or "sports"
    .WhereContainedIn("category", (new[] {"it", "politics", "sports"}))

    // Finds objects whose "category" field is neither "music", "health" or "trending"
    .WhereNotContainedIn("category", (new[] {"music", "health", "trending"}))

    // Finds objects that have the "relatedPost" field set
    .WhereExists("relatedPost")

    // Finds objects that don't have the "relatedPost" field set
    .WhereDoesNotExist("relatedPost")

    // Find objects where "tags" field is an array and contains "books".
    .WhereEqualTo("tags", "books")

    // Title starts with "Life"
    .WhereStartsWith("title", "Life");

Example Request:

# Finds the Posts with title equal to "My post title" and
# with likes greater than 100
curl -X GET \
  -H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
  -H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
  -G \
  --data-urlencode 'where={"title": "My post title", "likes": { "$gt": 100 }}' \
  https://parseapi.back4app.com/classes/Post

There are other operators than the $gt used above. Check the list below:

# Key - Operation

# $lt - Less Than
# $lte - Less Than Or Equal To
# $gt - Greater Than
# $gte - Greater Than Or Equal To
# $ne - Not Equal To
# $in - Contained In
# $nin - Not Contained in
# $exists - A value is set for the key
# $select - This matches a value for a key in the result of a different query
# $dontSelect - Requires that a key’s value not match a value for a key in the result of a different query
# $all - Contains all of the given values
# $regex - Requires that a key’s value match a regular expression
# $text - Performs a full text search on indexed fields

# Example request using multiple operators
# Finds all Posts with likes between 50 and 400
# and with title starting with "Parse"
curl -X GET \
  -H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
  -H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
  -G \
  --data-urlencode 'where={"likes":{"$gte":50,"$lte":400}, "title":{"$regex": "^Parse"}}' \
  https://parseapi.back4app.com/classes/Post

You can apply multiple constraints on a query, which will filter all the objects that do not match the conditions. It will be like an AND operator of constraints.

Ordering

Code:

(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const query = new Parse.Query('Post');

  // Sorts the results in ascending order by the likes field
  query.ascending('likes');

  // Sorts the results in descending order by the views field
  query.descending('views');

  try {
    const results = await query.find();
    console.log(`Posts found: ${JSON.stringify(results)}`);
  } catch (error) {
    console.log(`Error: ${JSON.stringify(error)}`);
  }
})();
(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const query: Parse.Query = new Parse.Query('Post');

  // Sorts the results in ascending order by the likes field
  query.ascending('likes');

  // Sorts the results in descending order by the views field
  query.descending('views');

  try {
    const results: Parse.Query[] = await query.find();
    console.log(`Posts found: ${JSON.stringify(results)}`);
  } catch (error: any) {
    console.log(`Error: ${JSON.stringify(error)}`);
  }
})();

Example Request:

curl -X GET \
  -H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
  -H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
  -G \
  --data-urlencode 'order=likes' \
  https://parseapi.back4app.com/classes/Post
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.util.List;

public void runQuery() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");

  // Sorts the results in ascending order by the 'likes' field
  query.orderByAscending("likes");

  // Sorts the results in descending order by the 'views' field
  query.orderByDescending("views");

  query.findInBackground((objects, e) -> {
    if(e == null){
      for (ParseObject result : objects) {
          String res = "Likes " + result.get("likes").toString() + " Views " + result.get("views");
          Log.d("Fetch Results",res);
      }
    }else{
        Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
PFQuery *query = [PFQuery queryWithClassName:@"Post"];

// Sorts the results in ascending order by the 'likes' field
[query orderByAscending:@"likes"];

// Sorts the results in descending order by the 'views' field
[query orderByDescending:@"views"];

NSArray* results = [query findObjects];
let query = PFQuery(className:"Post")

// Sorts the results in ascending order by the 'likes' field
query.order(byAscending: "likes")

// Sorts the results in descending order by the 'views' field
query.order(byDescending: "views")

let results = quer.findObjects();
use Parse\ParseQuery;

// "Post" is just an arbitrary class, replace it with your custom class
$query = new ParseQuery("Post");

// Sorts the results in ascending order by the likes field
$query->ascending("likes");

// Sorts the results in descending order by the views field
$query->descending("views");

$results = $query->find();
foreach($results as $result) {
  echo 'Object found ' . $result->getObjectId() . '<br>';
}
using Parse;

// Sorts the results in ascending order by likes and descending order by title
var query = from post in ParseObject.GetQuery("Post")
            orderby post.Get<int>("likes"), post.Get<string>("title") descending
            select post;

// or using LINQ
// Sorts the results in ascending order by likes and descending order by title
var query = ParseObject.GetQuery("Post")
    .OrderBy("likes")
    .ThenByDescending("title");

It is also possible to sort the query results by a specific field:

Limit and Skip

Code:

(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const query = new Parse.Query('Post');

  query.limit(10); // limit to at most 10 results

  query.skip(10); // skip the first 10 results

  try {
    const results = await query.find();
    console.log(`Posts found: ${JSON.stringify(results)}`);
  } catch (error) {
    console.log(`Error: ${JSON.stringify(error)}`);
  }
})();
(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const query: Parse.Query = new Parse.Query('Post');

  query.limit(10); // limit to at most 10 results

  query.skip(10); // skip the first 10 results

  try {
    const results: Parse.Query[] = await query.find();
    console.log(`Posts found: ${JSON.stringify(results)}`);
  } catch (error: any) {
    console.log(`Error: ${JSON.stringify(error)}`);
  }
})();
# Finds 10 Posts, skipping the first 100 results
curl -X GET \
  -H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
  -H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
  -G \
  --data-urlencode 'limit=10' \
  --data-urlencode 'skip=100' \
  https://parseapi.back4app.com/classes/Post
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.util.List;

public void runQuery() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");

  query.setLimit(10); // limit to at most 10 results
  query.setSkip(10); // skip the first 10 results

  query.findInBackground((objects, e) -> {
    if(e == null){
      for (ParseObject result : objects) {
        Log.d("Object found ",result.getObjectId());
      }
    }else{
        Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
PFQuery *query = [PFQuery queryWithClassName:@"Post"];

query.limit = 10; // limit to at most 10 results

query.skip = 10; // skip the first 10 results

NSArray* results = [query findObjects];
let query = PFQuery(className:"Post")

query.limit = 10; // limit to at most 10 results

query.skip = 10; // skip the first 10 results

let results = query.findObjects();
use Parse\ParseQuery;

// "Post" is just an arbitrary class, replace it with your custom class
$query = new ParseQuery("Post");

$query->limit(10); // limit to at most 10 results

$query->skip(10); // skip the first 10 results

$results = $query->find();
foreach($results as $result) {
  echo 'Object found ' . $result->getObjectId() . '<br>';
}
using Parse;

var query = from post in ParseObject.GetQuery("Post")
            // limit to at most 10 results
            .Limit(10)

            // skip the first 10 results
            .Skip(10)

            select post;

// or using LINQ
var query = ParseObject.GetQuery("Post")
    .Limit(10) // limit to at most 10 results
    .Skip(10); // skip the first 10 results

If you need to limit the number of results or skip the first N results (useful when implementing pagination), you can do like so:

Relational Queries

Using object reference as a constraint:

(async () => {
  // Creates the Post
  const myPostObject = new Parse.Object('Post');

  myPostObject.set('content', 'First post! Yay!');
  try {
    const myPost = await myPostObject.save();
    // Creates the Comment
    const myCommentObject = new Parse.Object('Comment');

    myCommentObject.set('content', 'Congrats!');
    myCommentObject.set('post', myPost); // Sets 'myPost' and its post
    try {
      const myComment = await myCommentObject.save();
      // Finds only the comments that has 'myPost' as a post
      const query = new Parse.Query(Comment);
      query.equalTo('post', myPost);

      query.find().then((comments) => {
        console.log(`Comments found: ${JSON.stringify(comments)}`);
      });
    } catch (error) {
      console.log(`Error saving object: ${error}`);
    }
  } catch (error) {
    console.log(`Error saving object: ${error}`);
  }
})();
(async () => {
  // Creates the Post
  const myPostObject: Parse.Object = new Parse.Object('Post');

  myPostObject.set('content', 'First post! Yay!');
  try {
    const myPost: Parse.Object = await myPostObject.save();
    // Creates the Comment
    const myCommentObject: Parse.Object = new Parse.Object('Comment');

    myCommentObject.set('content', 'Congrats!');
    myCommentObject.set('post', myPost); // Sets 'myPost' and its post
    try {
      const myComment: Parse.Object = await myCommentObject.save();
      // Finds only the comments that has 'myPost' as a post
      const query: Parse.Object = new Parse.Query(Comment);
      query.equalTo('post', myPost);

      try {
        const comments: Parse.Object[] = await query.find();
        console.log(`Comments found: ${JSON.stringify(comments)}`);
      } catch (error: any) {
        console.log(`Error fetching objects: ${error}`);  
      }
    } catch (error: any) {
      console.log(`Error saving object: ${error}`);
    }
  } catch (error: any) {
    console.log(`Error saving object: ${error}`);
  }
})();
# Creates the Post
curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{"content":"First post ! Yay!"}' \
https://parseapi.back4app.com/classes/Post

# Creates the Comment
curl -X POST \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "Content-Type: application/json" \
-d '{"content":"Congrats!", "post":{"__type":"Pointer","className":"Post","objectId":"<OBJECT_ID>"}}' \
https://parseapi.back4app.com/classes/Comment

# Finds only the comments related to the newly created post
curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode 'where={"post":{"__type":"Pointer","className":"Post","objectId":"<OBJECT_ID>"}}' \
https://parseapi.back4app.com/classes/Comment
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.util.List;

public void runQuery() throws ParseException {
  // Creates the Post
  ParseObject myPost = new ParseObject("Post");
  myPost.put("content", "First post! Yay!");
  myPost.save();

  // Creates the Comment
  ParseObject myComment = new ParseObject("Comment");
  myComment.put("content", "Congrats!");
  myComment.put("post", myPost); // Sets "myPost" and its post
  myComment.save();

  ParseQuery<ParseObject> query = ParseQuery.getQuery("Comment");

  // Finds only the comments that has "myPost" as a post
  query.whereEqualTo("post", myPost);

  query.findInBackground((objects, e) -> {
    if(e == null){
      for (ParseObject result : objects) {
        Log.d("Object found ",result.getObjectId());
      }
    }else{
        Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
// Creates the Post
PFObject *myPost = [PFObject objectWithClassName:@"Post"];
myPost[@"content"] = @"First post! Yay!";
[myPost save];

// Creates the Comment
PFObject *myComment = [PFObject objectWithClassName:@"Comment"];
myComment[@"content"] = @"Congrats!";
myComment[@"post"] = myPost;
[myComment save];

PFQuery *query = [PFQuery queryWithClassName:@"Comment"];
// Finds only the comments that has "myPost" as a post
[query whereKey:@"post" equalTo:myPost];

[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
    // comments now contains the comments for myPost
}];
// Creates the Post
var myPost = PFObject(className:"Post")
myPost["content"] = "First post! Yay!"
myPost.save();

var myComment = PFObject(className:"Comment")
myComment["content"] = "Congrats!"
myComment["post"] = myPost
myComment.save()

let query = PFQuery(className:"Post")
query.whereKey("post", equalTo: myPost)

let results = query.findObjects();
use Parse\ParseObject;
use Parse\ParseQuery;

// Creates the Post
$myPost = new ParseObject("Post");
$myPost->set('content', 'First post! Yay!');
$myPost.save();

// Creates the Comment
$myComment = new ParseObject("Comment");
$myComment->set('content', 'Congrats!');
$myComment->set('post', myPost); // Sets "myPost" and its post
$myComment.save();

// Finds only the comments that has "myPost" as a post
$query = new ParseQuery("Comment");
$query->equalTo("post", myPost);
$comments = $query->find();
foreach($comments as $result) {
  echo 'Object found ' . $result->getObjectId() . '<br>';
}
using Parse;

// Creates the Post
ParseObject myPost = new ParseObject("Post");
myPost["content"] = "First post! Yay!";
await myPost.SaveAsync();

// Creates the Comment
ParseObject myComment = new ParseObject("Comment");
myComment["content"] = "Congrats!";
await myComment.SaveAsync();

// Finds only the comments that has "myPost" as a post
var query = from comment in ParseObject.GetQuery("Comment")
            where comment["post"] == myPost
            select comment;

// or using LINQ
var query = ParseObject.GetQuery("Comment")
    .WhereEqualTo("post", myPost);

var comments = await query.FindAsync();
//comments now contains the comments for myPost

Alternatively, you can create relational queries using the objectId:

(async () => {
  // ... creates the query out of a class that have a relation with Post
  const query = new Parse.Query('Blog');

  const myPost = new Parse.Object('Post');
  myPost.id = '<OBJECT_ID>';

  // Just the objectId is enough to compare the object
  query.equalTo('post', myPost);

  try {
    const results = await query.find();
    console.log(`Comments found: ${JSON.stringify(results)}`);
  } catch (error) {
    console.log(`Error: ${error}`);
  }
})();
(async () => {
  // ... creates the query out of a class that have a relation with Post
  const query: Parse.Query = new Parse.Query('Blog');

  const myPost: Parse.Object = new Parse.Object('Post');
  myPost.id = '<OBJECT_ID>';

  // Just the objectId is enough to compare the object
  query.equalTo('post', myPost);

  try {
    const results: Parse.Object[] = await query.find();
    console.log(`Comments found: ${JSON.stringify(results)}`);
  } catch (error: any) {
    console.log(`Error: ${error}`);
  }
})();
// ... creates the query out of a class that have a relation with Post

// Just the objectId is enough to compare the object
[query whereKey:@"post" equalTo:[PFObject objectWithoutDataWithClassName:@"Post" objectId:@"<OBJECT_ID>"]];

// ... runs the query
// ... creates the query out of a class that have a relation with Post

// Just the objectId is enough to compare the object
query.whereKey("post", equalTo: PFObject(withoutDataWithClassName: "Post", objectId: "<OBJECT_ID>"))
// ... runs the query
use Parse\ParseObject;

// ... creates the query out of a class that have a relation with Post
$post = new ParseObject("Post", "<OBJECT_ID>");
$query->equalTo("post", $post);
// ... runs the query
using Parse;

var query = from comment in ParseObject.GetQuery("Comment")
            where comment["post"] == ParseObject.CreateWithoutData("Post", "<OBJECT_ID>")
            select comment;

// or using LINQ
var query = ParseObject.GetQuery("Comment")
    .WhereEqualTo("post", ParseObject.CreateWithoutData("Post", "<OBJECT_ID>"));

Creating relational constraints:

(async () => {
  const innerQuery = new Parse.Query('Post');

  innerQuery.exists('content');

const query = new Parse.Query('Comment');
  query.matchesQuery('post', innerQuery); // Uses the innerQuery to apply constraints to the 'post' field

  try {
    // Fetches only the comments whose posts contains content
    const comments = await query.find();
    console.log(`Comments found: ${JSON.stringify(comments)}`);
  } catch (error) {
    console.log(`Error: ${error}`);
  }
})();
(async () => {
  const innerQuery: Parse.Query = new Parse.Query('Post');

  innerQuery.exists('content');

  const query: Parse.Query = new Parse.Query('Comment');
    query.matchesQuery('post', innerQuery); // Uses the innerQuery to apply constraints to the 'post' field

    try {
      // Fetches only the comments whose posts contains content
      const comments: Parse.Object[] = await query.find();
      console.log(`Comments found: ${JSON.stringify(comments)}`);
    } catch (error: any) {
      console.log(`Error: ${error}`);
    }
  }
)();
# Fetches only the comments whose posts contains image
curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode 'where={"post":{"$inQuery":{"where":{"image":{"$exists":true}},"className":"Post"}}}' \
https://parseapi.back4app.com/classes/Comment

import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.util.List;

public void runQuery() {
  ParseQuery<ParseObject> innerQuery = ParseQuery.getQuery("Post");
  innerQuery.whereExists("image");

  ParseQuery<ParseObject> query = ParseQuery.getQuery("Comment");
  query.whereMatchesQuery("post", innerQuery);

  query.findInBackground((commentList, e) -> {
    if(e == null){
      for (ParseObject comment : commentList) {
        ParseObject post = comment.getParseObject("post");
        Log.d("Object found ",post.getObjectId());
      }
    }else{
        Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
PFQuery *innerQuery = [PFQuery queryWithClassName:@"Post"];
[innerQuery whereKeyExists:@"image"];
PFQuery *query = [PFQuery queryWithClassName:@"Comment"];
[query whereKey:@"post" matchesQuery:innerQuery];
[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
    // comments now contains the comments for posts with images
}];
let innerQuery = PFQuery(className: "Post")
innerQuery.whereKeyExists("image")
let query = PFQuery(className: "Comment")
query.whereKey("post", matchesQuery: innerQuery)
query.findObjectsInBackground { (comments: [PFObject]?, error: Error?) in
    if let error = error {
        // The request failed
        print(error.localizedDescription)
    } else {
        // comments now contains the comments for posts with images

    }
}
use Parse\ParseQuery;

$innerQuery = new ParseQuery("Post");
$innerQuery->exists("image");

$query = new ParseQuery("Comment");
$query->matchesQuery("post", $innerQuery);

// comments now contains the comments for posts with images.
$comments = $query->find();
foreach($comments as $result) {
  echo 'Object found ' . $result->getObjectId() . '<br>';
}
using Parse;

var innerQuery = from post in ParseObject.GetQuery("Post")
                 where post.ContainsKey("image")
                 select post;
var query = from comment in ParseObject.GetQuery("Comment")
            join post in innerQuery on comment["post"] equals post
            select comment;

var comments = await query.FindAsync();
// comments now contains the comments for posts with images

// or using LINQ
var innerQuery = ParseObject.GetQuery("Post")
    .WhereExists("image");
var query = ParseObject.GetQuery("Comment")
    .WhereMatchesQuery("post", innerQuery);

var comments = await query.FindAsync();
// comments now contains the comments for posts with images

Creating relational constraints (negation):

(async () => {
  const innerQuery = new Parse.Query('Post');
  innerQuery.greaterThan('likes', 50);

  const query = new Parse.Query('Comment');
  // Uses the innerQuery to apply constraints to the 'post' field
  query.doesNotMatchQuery('post', innerQuery);

  try {
    // Fetches only the comments whose posts does NOT contains more than 50 likes
    const comments = await query.find();
    console.log(`Comments found: ${JSON.stringify(comments)}`);
  } catch (error) {
    console.log(`Error: ${error}`);
  }
})();
(async () => {
  const innerQuery: Parse.Query = new Parse.Query('Post');
  innerQuery.greaterThan('likes', 50);

  const query: Parse.Query = new Parse.Query('Comment');
  // Uses the innerQuery to apply constraints to the 'post' field
  query.doesNotMatchQuery('post', innerQuery);

  try {
    // Fetches only the comments whose posts does NOT contains more than 50 likes
    const comments: Parse.Object[] = await query.find();
    console.log(`Comments found: ${JSON.stringify(comments)}`);
  } catch (error: any) {
    console.log(`Error: ${error}`);
  }
})();
# Fetches only the comments whose posts does NOT contains more than 50 likes
curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode 'where={"post":{"$notInQuery":{"where":{"likes":{"$gt":50}},"className":"Post"}}}' \
https://parseapi.back4app.com/classes/Comment
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.util.List;

public void runQuery() {
  ParseQuery<ParseObject> innerQuery = ParseQuery.getQuery("Post");
  innerQuery.whereGreaterThan("likes", 50);

  ParseQuery<ParseObject> query = ParseQuery.getQuery("Comment");
  query.whereDoesNotMatchQuery("post", innerQuery);

  query.findInBackground((commentList, e) -> {
    if(e == null){
      for (ParseObject comment : commentList) {
        ParseObject post = comment.getParseObject("post");
        Log.d("Object found ",post.getObjectId());
      }
    }else{
        Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
PFQuery *innerQuery = [PFQuery queryWithClassName:@"Post"];
[innerQuery whereKey:@"likes" greaterThan:@50];
PFQuery *query = [PFQuery queryWithClassName:@"Comment"];
[query whereKey:@"post" doesNotMatchQuery:innerQuery];
[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
  // Fetches only the comments whose posts does NOT contains more than 50 likes
}];
let innerQuery = PFQuery(className: "Post")
innerQuery.whereKey("image", greaterThan: 50)
let query = PFQuery(className: "Comment")
query.whereKey("post", doesNotMatch: innerQuery)
query.findObjectsInBackground { (comments: [PFObject]?, error: Error?) in
  if let error = error {
    // The request failed
    print(error.localizedDescription)
  } else {
    // Fetches only the comments whose posts does NOT contains more than 50 likes
  }
}
use Parse\ParseQuery;

$innerQuery = new ParseQuery("Post");
$innerQuery->greaterThan("likes", 50);

$query = new ParseQuery("Comment");
$query->doesNotMatchQuery("post", $innerQuery);

// Fetches only the comments whose posts does NOT contains more than 50 likes
$results = $query->find();
foreach($results as $result) {
  echo 'Object found ' . $result->getObjectId() . '<br>';
}
using Parse;

var innerQuery = from post in ParseObject.GetQuery("Post")
                 where post.ContainsKey("image")
                 select post;
var query = ParseObject.GetQuery("Comment")
    .WhereDoesNotMatchQuery("post", innerQuery);

var comments = await query.FindAsync();
// comments now contains the comments for posts without images

// or using LINQ
var innerQuery = ParseObject.GetQuery("Post")
    .WhereExists("image");
var query = ParseObject.GetQuery("Comment")
    .WhereDoesNotMatchQuery("post", innerQuery);

var comments = await query.FindAsync();
// comments now contains the comments for posts without images

Initializing a related object:

(async () => {
  const query = new Parse.Query('Comment');

  // Include the post data with each comment
  query.include('post');

  // You also can initialize multiple levels of relations
  // query.include(['post.author']); // Initializes the post and its author

  try {
    // Comments now contains the 'post' field initialized!
    const comments = await query.find();
    const posts = comments.map(function (comment) {
      return comment.get('post');
    });
    console.log(`Posts found: ${JSON.stringify(posts)}`);
  } catch (error) {
    console.log(`Error: ${error}`);
  }
})();
(async () => {
  const query: Parse.Query = new Parse.Query('Comment');

  // Include the post data with each comment
  query.include('post');

  // You also can initialize multiple levels of relations
  // query.include(['post.author']); // Initializes the post and its author

  try {
    // Comments now contains the 'post' field initialized!
    const comments: Parse.Object[] = await query.find();
    const posts: Parse.Object[] = comments.map(function (comment) {
      return comment.get('post');
    });
    console.log(`Posts found: ${JSON.stringify(posts)}`);
  } catch (error: any) {
    console.log(`Error: ${error}`);
  }
})();
curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode 'include=post' \
https://parseapi.back4app.com/classes/Comment

# You can also do multi level includes using dot notation. ex: include=post.author
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.util.List;

public void runQuery() {
  ParseQuery<ParseObject> query = ParseQuery.getQuery("Comment");

  // Include the post data with each comment
  query.include("post");

  // You also can initialize multiple levels of relations
  // query.include("post.author");

  query.findInBackground((commentList, e) -> {
    if(e == null){
      for (ParseObject comment : commentList) {
        // This does not require a network access.
        ParseObject post = comment.getParseObject("post");
        Log.d("Object found ",post.getObjectId());
      }
    }else{
        Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
PFQuery *query = [PFQuery queryWithClassName:@"Comment"];

// Include the post data with each comment
[query includeKey:@"post"];

// You also can initialize multiple levels of relations
// [query includeKey:@"post.author"];

[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
    // Comments now contains the "post" field
    // has been populated. For example:
    for (PFObject *comment in comments) {
         // This does not require a network access.
         PFObject *post = comment[@"post"];
         NSLog(@"retrieved related post: %@", post);
    }
}];
let query = PFQuery(className:"Comment")

// Include the post data with each comment
query.includeKey("post")

// You also can initialize multiple levels of relations
// query.includeKey("post.author")

query.findObjectsInBackground { (comments: [PFObject]?, error: Error?) in
  if let error = error {
    // The request failed
    print(error.localizedDescription)
  } else if let comments = comments {
    // Comments now contains the "post" field
    for comment in comments {
      // This does not require a network access.
      let post = comment["post"] as? PFObject
      print("retrieved related post: \(String(describing: post))")
    }
  }
}
use Parse\ParseQuery;

$query = new ParseQuery("Comment");

// Include the post data with each comment
query->includeKey("post");

// You also can initialize multiple levels of relations
// query->include("post.author"); // Initializes the post and its author

// Comments now contains the "post" field initialized!
$comments = query->find();
foreach($comments as $comment) {
  $post = $comment->get("post");
  echo 'Object found ' . $post->getObjectId() . '<br>';
}
using Parse;

var query = from comment in ParseObject.GetQuery("Comment")
            // Include the post data with each comment
            .Include("post")
            // You also can initialize multiple levels of relations
            // .Include("post.author")
            select comment;

var comments = await query.FindAsync();
// Comments now contains the "post" field

// or using LINQ
var query = ParseObject.GetQuery("Comment")
    // Include the post data with each comment
    .Include("post");
    // You also can initialize multiple levels of relations
    // .Include("post.author");

var comments = await query.FindAsync();
// Comments now contains the "post" field

Query supports creating constraints that evaluates if a field matches a particular Parse Object. It allows you to fetch only the objects that contains a specific relation with another object.

There are cases when you need to evaluate some related object fields in order to build a query with refined results.

That can be done by creating a inner query whose constraints will be applied only on the related field you want to evaluate, those are known as relational constraints and are also demonstrated in this section.

Using AND / OR operators

OR operator:

(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const manyLikesQuery = new Parse.Query('Post');
  manyLikesQuery.greaterThan('likes', 1000);

  const specificPostQuery = new Parse.Query(Post);
  specificPostQuery.equalTo('title', 'My great post');

  // The query is satisfied when one of the constraints matches
  const composedQuery = Parse.Query.or(manyLikesQuery, specificPostQuery);

  try {
    // Fetches the posts with more than 1000 likes OR posts with the title 'My great post'
    const posts = await composedQuery.find();
    console.log(`Posts found: ${JSON.stringify(posts)}`);
  } catch (error) {
    console.log(`Error: ${error}`);
  }
})();
(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const manyLikesQuery: Parse.Query = new Parse.Query('Post');
  manyLikesQuery.greaterThan('likes', 1000);

  const specificPostQuery: Parse.Query = new Parse.Query(Post);
  specificPostQuery.equalTo('title', 'My great post');

  // The query is satisfied when one of the constraints matches
  const composedQuery: Parse.Query = Parse.Query.or(manyLikesQuery, specificPostQuery);

  try {
    // Fetches the posts with more than 1000 likes OR posts with the title 'My great post'
    const posts: Parse.Object[] = await composedQuery.find();
    console.log(`Posts found: ${JSON.stringify(posts)}`);
  } catch (error: any) {
    console.log(`Error: ${error}`);
  }
})();
curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode 'where={"$or":[{"likes":{"$gt":1000}},{"title":"My great post"}]}' \
https://parseapi.back4app.com/classes/Comment
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import java.util.ArrayList;
import java.util.List;

public void runQuery() {
  ParseQuery<ParseObject> manyLikesQuery = ParseQuery.getQuery("Post");
  manyLikesQuery.whereGreaterThan("likes", 1000);

  ParseQuery<ParseObject> specificPostQuery = ParseQuery.getQuery("Post");
  specificPostQuery.whereEqualTo("title", "My great post");

  List<ParseQuery<ParseObject>> queries = new ArrayList<ParseQuery<ParseObject>>();
  queries.add(manyLikesQuery);
  queries.add(specificPostQuery);

  ParseQuery<ParseObject> mainQuery = ParseQuery.or(queries);

  // Fetches the posts with more than 1000 likes OR posts with the title "My great post"
  mainQuery.findInBackground((postList, e) -> {
    if(e == null){
      for (ParseObject post : postList) {
        Log.d("Object found ",post.getObjectId());
      }
    }else{
        Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
PFQuery *manyLikesQuery = [PFQuery queryWithClassName:@"Post"];
[manyLikesQuery whereKey:@"likes" greaterThan:@1000];

PFQuery *specificPostQuery = [PFQuery queryWithClassName:@"Post"];
[specificPostQuery whereKey:@"title" equalTo:@"My great post"];

PFQuery *query = [PFQuery orQueryWithSubqueries:@[manyLikesQuery,specificPostQuery]];
[query findObjectsInBackgroundWithBlock:^(NSArray *results, NSError *error) {
  // Fetches the posts with more than 1000 likes OR posts with the title "My great post"
}];
let manyLikesQuery = PFQuery(className:"Post")
manyLikesQuery.whereKey("likes", greaterThan:1000)

let specificPostQuery = PFQuery(className:"Player")
specificPostQuery.whereKey("title", equalTo:"My great post")

let query = PFQuery.orQuery(withSubqueries: [manyLikesQuery, specificPostQuery])
query.findObjectsInBackground { (results: [PFObject]?, error: Error?) in
  if let error = error {
    // The request failed
    print(error.localizedDescription)
  } else {
    // Fetches the posts with more than 1000 likes OR posts with the title "My great post"
  }
}
use Parse\ParseQuery;

$manyLikesQuery = new ParseQuery("Post");
$manyLikesQuery->greaterThan("likes", 1000);

$specificPostQuery = new ParseQuery("Player");
$specificPostQuery->equalTo("title", "My great post");

// The query is satisfied when one of the constraints matches
$mainQuery = ParseQuery::orQueries([$manyLikesQuery, $specificPostQuery]);

// Fetches the posts with more than 1000 likes OR posts with the title "My great post"
$results = $mainQuery->find();
foreach($results as $result) {
  echo 'Object found ' . $result->getObjectId() . '<br>';
}
using Parse;

var manyLikesQuery = from post in ParseObject.GetQuery("Post")
                 where post.Get<int>("likes") > 1000
                 select post;

var specificPostQuery = from post in ParseObject.GetQuery("Post")
              where post.Get<string>("title") == "My great post"
              select post;

ParseQuery<ParseObject> query = manyLikesQuery.Or(specificPostQuery);

var results = await query.FindAsync();
// Fetches the posts with more than 1000 likes OR posts with the title "My great post"

// or using LINQ
var manyLikesQuery = ParseObject.GetQuery("Post")
    .WhereGreaterThan("likes", 1000);

var specificPostQuery = ParseObject.GetQuery("Post")
    .WhereEqualTo("title", "My great post");

ParseQuery<ParseObject> query = manyLikesQuery.Or(specificPostQuery);
// Fetches the posts with more than 1000 likes OR posts with the title "My great post"

AND operator:

(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const manyLikesQuery = new Parse.Query('Post');
  manyLikesQuery.greaterThan('likes', 1000);

  const specificPostQuery = new Parse.Query(Post);
  specificPostQuery.equalTo('title', 'My great post');

  const loggedUser = Parse.User.current();
  const authorQuery = new Parse.Query(Post);
  authorQuery.equalTo('author', loggedUser);

  // The query is satisfied when both of the constraints matches.
  // You can combine multiple AND and OR operators in order to create
  // even more complex queries
  const composedQuery = Parse.Query.and(
    Parse.Query.or(manyLikesQuery, specificPostQuery),
    authorQuery
  );

  try {
    // Fetches the posts with more than 1000 likes OR posts with the title 'My great post',
    // and the logged user is the author of the post
    const posts = await composedQuery.find();
    console.log(`Posts found: ${JSON.stringify(posts)}`);
  } catch (error) {
    console.log(`Error: ${error}`);
  }
})();
(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const manyLikesQuery: Parse.Query = new Parse.Query('Post');
  manyLikesQuery.greaterThan('likes', 1000);

  const specificPostQuery: Parse.Query = new Parse.Query(Post);
  specificPostQuery.equalTo('title', 'My great post');

  const loggedUser: Parse.User = Parse.User.current();
  const authorQuery: Parse.Query = new Parse.Query(Post);
  authorQuery.equalTo('author', loggedUser);

  // The query is satisfied when both of the constraints matches.
  // You can combine multiple AND and OR operators in order to create
  // even more complex queries
  const composedQuery: Parse.Query = Parse.Query.and(
    Parse.Query.or(manyLikesQuery, specificPostQuery),
    authorQuery
  );

  try {
    // Fetches the posts with more than 1000 likes OR posts with the title 'My great post',
    // and the logged user is the author of the post
    const posts: Parse.Object[] = await composedQuery.find();
    console.log(`Posts found: ${JSON.stringify(posts)}`);
  } catch (error: any) {
    console.log(`Error: ${error}`);
  }
})();
# Fetches the posts with more than 1000 likes OR posts with the title "My great post",
# and a specific user is the author of the post
curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-G \
--data-urlencode 'where={"$or":[{"likes":{"$gt":1000}}, {"title":"My great post"}], "author": {"__type":"Pointer","className":"_User","objectId":"kzunnPFh5i"}}' \
https://parseapi.back4app.com/classes/Post

import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseUser;

import java.util.ArrayList;
import java.util.List;

public void runQuery() {
  String className = "Post";

  ParseQuery<ParseObject> manyLikesQuery = ParseQuery.getQuery(className);
  manyLikesQuery.whereGreaterThan("likes", 1000);

  ParseUser loggedUser = ParseUser.getCurrentUser();
  ParseQuery<ParseObject> specificPostQuery = ParseQuery.getQuery(className);
  specificPostQuery.whereEqualTo("title", "My great post"); // title equals to "My great post"
  specificPostQuery.whereEqualTo("author", loggedUser); // AND author equals loggedUser

  List<ParseQuery<ParseObject>> queries = new ArrayList<ParseQuery<ParseObject>>();
  queries.add(manyLikesQuery);
  queries.add(specificPostQuery);

  ParseQuery<ParseObject> mainQuery = ParseQuery.or(queries);

  // The query is satisfied when both of the constraints matches.
  // You can combine multiple AND and OR operators in order to create
  // even more complex queries

  // Fetches the posts with more than 1000 likes OR posts with the title "My great post"
  // and the logged user is the author of the post
  mainQuery.findInBackground((postList, e) -> {
    if(e == null){
      for (ParseObject post : postList) {
        Log.d("Object found ",post.getObjectId());
      }
    }else{
        Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  });
}
PFQuery *manyLikesQuery = [PFQuery queryWithClassName:@"Post"];
[manyLikesQuery whereKey:@"likes" greaterThan:@1000];

PFQuery *specificPostQuery = [PFQuery queryWithClassName:@"Post"];
[specificPostQuery whereKey:@"title" equalTo:@"My great post"];

PFUser *loggedUser = [PFUser loggedUser];

PFQuery *query = [PFQuery orQueryWithSubqueries:@[manyLikesQuery,specificPostQuery]];
[query whereKey:@"author" equalTo:@loggedUser];

[query findObjectsInBackgroundWithBlock:^(NSArray *results, NSError *error) {
  // Fetches the posts with more than 1000 likes OR posts with the title "My great post",
  // and the logged user is the author of the post
}];
let manyLikesQuery = PFQuery(className:"Post")
manyLikesQuery.whereKey("likes", greaterThan:1000)

let specificPostQuery = PFQuery(className:"Post")
specificPostQuery.whereKey("title", equalTo:"My great post")

let loggedUser = PFUser.loggedUser()

let query = PFQuery.orQuery(withSubqueries: [manyLikesQuery, specificPostQuery])
query.whereKey("author", equalTo:loggedUser)

query.findObjectsInBackground { (results: [PFObject]?, error: Error?) in
  if let error = error {
    // The request failed
    print(error.localizedDescription)
  } else {
    // Fetches the posts with more than 1000 likes OR posts with the title "My great post",
    // and the logged user is the author of the post
  }
}
use Parse\ParseQuery;

$manyLikesQuery = new ParseQuery("Post");
$manyLikesQuery->greaterThan("likes", 1000);

$specificPostQuery = new ParseQuery("Player");
$specificPostQuery->equalTo("title", "My great post");

$loggedUser = ParseUser::getCurrentUser();

// The query is satisfied when one of the constraints matches
$mainQuery = ParseQuery::orQueries([$manyLikesQuery, $specificPostQuery]);

$mainQuery->equalTo("author", $loggedUser)

// Fetches the posts with more than 1000 likes OR posts with the title "My great post",
// and the logged user is the author of the post
$results = $mainQuery->find();
foreach($results as $result) {
  echo 'Object found ' . $result->getObjectId() . '<br>';
}

In order to create more complex queries, you will often need to create multiple constraints and combining them using logical operators OR and AND.

By using both operators, Query enables us to combine multiple subqueries, thus applying different sets of constraints. This way, we can achieve a higher level of complexity but also get even more refined results from our queries.

Aggregation

Grouping the results using a field value:

(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const query = new Parse.Query('Post');

  // Grouping the results by the number of likes.
  // We need to use $ to indicate 'tags' is the name of the field
  // we want to use as our objectId
  const pipeline = {
    group: { objectId: '$tags' },
  };

  try {
    // results contains unique content values
    // The results are similar to the distinct feature
    const results = await query.aggregate(pipeline);
    console.log(`Posts grouped by tags found: ${JSON.stringify(results)}`);
  } catch (error) {
    console.log(`Error: ${error}`);
  }
})();
(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const query: Parse.Query = new Parse.Query('Post');

  // Grouping the results by the number of likes.
  // We need to use $ to indicate 'tags' is the name of the field
  // we want to use as our objectId
  const pipeline: any = {
    group: { objectId: '$tags' },
  };

  try {
    // results contains unique content values
    // The results are similar to the distinct feature
    const results: Parse.Object[] = await query.aggregate(pipeline);
    console.log(`Posts grouped by tags found: ${JSON.stringify(results)}`);
  } catch (error: any) {
    console.log(`Error: ${error}`);
  }
})();
# Grouping the results by the number of likes.
# We need to use $ to indicate "content" is the name of the field
# we want to use as our objectId

curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "X-Parse-Master-Key: 5AVAtvlGlG5cEeolatkFDhY5p99PzoBUvm7MBLMo" \
-G \
--data-urlencode 'group={"objectId": "$content" }' \
https://parseapi.back4app.com/aggregate/Post

# The results are similar to the distinct feature
use Parse\ParseQuery;

// "Post" is just an arbitrary class, replace it with your custom class
$query = new ParseQuery("Post");

// Grouping the results by the number of likes.
// We need to use $ to indicate "content" is the name of the field
// we want to use as our objectId
$pipeline = [
  'group' => [ 'objectId' => '$content' ]
];

$results = $query->aggregate($pipeline);
// results contains unique likes values
// The results are similar to the distinct feature

Aggregating values:

(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const query = new Parse.Query('Post');

  const pipeline = {
    group: {
      objectId: null,
      total: { $sum: '$likes' }, // 'total' will be a created field to hold the sum of likes field
      average: { $avg: '$likes' }, // 'average' will be a created field to hold the average of likes field
      maxLikes: { $max: '$likes' }, // 'maxLikes' will be a created field to hold the maximum value of likes field
      minLikes: { $min: '$likes' }, // 'minLikes' will be a created field to hold the minimum value of likes field
    },
  };
  // Notice that 'total', 'average', 'maxLikes', 'minLikes' are just arbitrary names,
  // and could be anything you want

  try {
    // results[0] should contain 'total', 'average', 'maxLikes' and 'minLikes' as attribute
    // You can access them like this: results[0].total
    const results = await query.aggregate(pipeline);
    console.log(`Aggregated results: ${JSON.stringify(results)}`);
  } catch (error) {
    console.log(`Error: ${error}`);
  }
})();
(async () => {
  // 'Post' is just an arbitrary class, replace it with your custom class
  const query: Parse.Query = new Parse.Query('Post');

  const pipeline: any = {
    group: {
      objectId: null,
      total: { $sum: '$likes' }, // 'total' will be a created field to hold the sum of likes field
      average: { $avg: '$likes' }, // 'average' will be a created field to hold the average of likes field
      maxLikes: { $max: '$likes' }, // 'maxLikes' will be a created field to hold the maximum value of likes field
      minLikes: { $min: '$likes' }, // 'minLikes' will be a created field to hold the minimum value of likes field
    },
  };
  // Notice that 'total', 'average', 'maxLikes', 'minLikes' are just arbitrary names,
  // and could be anything you want

  try {
    // results[0] should contain 'total', 'average', 'maxLikes' and 'minLikes' as attribute
    // You can access them like this: results[0].total
    const results: Parse.Object[] = await query.aggregate(pipeline);
    console.log(`Aggregated results: ${JSON.stringify(results)}`);
  } catch (error: any) {
    console.log(`Error: ${error}`);
  }
})();
curl -X GET \
-H "X-Parse-Application-Id: BCrUQVkk80pCdeImSXoKXL5ZCtyyEZwbN7mAb11f" \
-H "X-Parse-REST-API-Key: swrFFIXJlFudtF3HkZPtfybDFRTmS7sPwvGUzQ9w" \
-H "X-Parse-Master-Key: 5AVAtvlGlG5cEeolatkFDhY5p99PzoBUvm7MBLMo" \
-G \
--data-urlencode 'group={"objectId":null,"total":{"$sum":"$likes"},"average":{"$avg": "$likes"},"maxLikes":{"$max": "$likes"},"minLikes":{"$min": "$likes"}}'
https://parseapi.back4app.com/aggregate/Post
use Parse\ParseQuery;

// "Post" is just an arbitrary class, replace it with your custom class
$query = new ParseQuery("Post");

$pipeline = [
  'group' => [
    'objectId' => null,
    'total' => [ '$sum' => '$likes' ], // "total" will be a created field to hold the sum of likes field
    'average' => [ '$avg' => '$likes' ], // "average" will be a created field to hold the average of likes field
    'maxLikes' => [ '$max' => '$likes' ], // "maxLikes" will be a created field to hold the maximum value of likes field
    'minLikes' => [ '$min' => '$likes' ], // "minLikes" will be a created field to hold the minimum value of likes field
  ]
];
// Notice that "total", "average", "maxLikes", "minLikes" are just arbitrary names,
// and could be anything you want

$results = $query->aggregate($pipeline);
// results[0] should contain "total", "average", "maxLikes" and "minLikes" as attribute
// You can access them like this: results[0].total

For a more complete list of operators, please check the MongoDB documentation.

The aggregate operation is not available for this SDK yet. To execute this operation you could call REST API directly.

It is also possible to aggregate data into our queries. This is done by adding a pipeline of aggregations, where each aggregation can apply a transformation on the query results. In these aggregations, you can also apply calculations such as retrieving the average, minimum, maximum, and the sum of values.

Errors

This section provides a list of the Back4App API errors, with the error code and name, as well as brief details on how to properly handle errors. Make sure to inspect the returned error message for more specific information.

API Issues

Code Name Meaning
101 UserInvalidLoginParams Invalid login parameters. Check error message for more details.
101 ObjectNotFound The specified object or session doesn’t exist or could not be found. Can also indicate that you do not have the necessary permissions to read or write this object. Check error message for more details.
102 InvalidQuery There is a problem with the parameters used to construct this query. This could be an invalid field name or an invalid field type for a specific constraint. Check error message for more details.
105 InvalidFieldName An invalid field name. Keys are case-sensitive. They must start with a letter, and a-zA-Z0-9_ are the only valid characters. Some field names may be reserved. Check error message for more details.
107 InvalidJSON Badly formed JSON was received upstream. This either indicates you have done something unusual with modifying how things encode to JSON, or the network is failing badly. Can also indicate an invalid utf-8 string or use of multiple form encoded values. Check error message for more details.
109 NotInitialized You must call Parse.initialize before using the Parse library. Check the Quick Start guide for your platform.
116 ObjectTooLarge The object is too large. Parse Objects have a max size of 128 kilobytes.
116 ExceededConfigParamsError You have reached the limit of 100 config parameters.
117 InvalidLimitError An invalid value was set for the limit. Check error message for more details.
118 InvalidSkipError An invalid value was set for skip. Check error message for more details.
119 OperationForbidden The operation isn’t allowed for clients due to class-level permissions. Check error message for more details.
120 CacheMiss The result was not found in the cache.
121 InvalidNestedKey An invalid key was used in a nested JSONObject. Check error message for more details.
123 InvalidACL An invalid ACL was provided.
125 InvalidEmailAddress The email address was invalid.
137 DuplicateValue Unique field was given a value that is already taken.
139 InvalidRoleName Role’s name is invalid.
139 ReservedValue Field value is reserved.
140 ExceededCollectionQuota You have reached the quota on the number of classes in your app. Please delete some classes if you need to add a new class.
141 ScriptFailed Cloud Code script failed. Usually points to a JavaScript error. Check error message for more details.
141 FunctionNotFound Cloud function not found. Check that the specified Cloud function is present in your Cloud Code script and has been deployed.
141 JobNotFound Background job not found. Check that the specified job is present in your Cloud Code script and has been deployed.
141 SuccessErrorNotCalled success/error was not called. A cloud function will return once response.success() or response.error() is called. A background job will similarly finish execution once status.success() or status.error() is called. If a function or job never reaches either of the success/error methods, this error will be returned. This may happen when a function does not handle an error response correctly, preventing code execution from reaching the success() method call.
141 MultupleSuccessErrorCalls Can’t call success/error multiple times. A cloud function will return once response.success() or response.error() is called. A background job will similarly finish execution once status.success() or status.error() is called. If a function or job calls success() and/or error() more than once in a single execution path, this error will be returned.
142 ValidationFailed Cloud Code validation failed.
143 WebhookError Webhook error.
150 InvalidImageData Invalid image data.
151 UnsavedFileError An unsaved file.
152 InvalidPushTimeError An invalid push time was specified.
158 HostingError Hosting error.
160 InvalidEventName The provided analytics event name is invalid.
255 ClassNotEmpty Class is not empty and cannot be dropped.
256 AppNameInvalid App name is invalid.
902 MissingAPIKeyError The request is missing an API key.
903 InvalidAPIKeyError The request is using an invalid API key.
Code Name Meaning
200 UsernameMissing Invalid login parameters. Check error message for more details.
201 PasswordMissing The specified object or session doesn’t exist or could not be found. Can also indicate that you do not have the necessary permissions to read or write this object. Check error message for more details.
202 UsernameTaken There is a problem with the parameters used to construct this query. This could be an invalid field name or an invalid field type for a specific constraint. Check error message for more details.
203 UserEmailTaken An invalid field name. Keys are case-sensitive. They must start with a letter, and a-zA-Z0-9_ are the only valid characters. Some field names may be reserved. Check error message for more details.
204 UserEmailMissing Badly formed JSON was received upstream. This either indicates you have done something unusual with modifying how things encode to JSON, or the network is failing badly. Can also indicate an invalid utf-8 string or use of multiple form encoded values. Check error message for more details.
205 UserWithEmailNotFound You must call Parse.initialize before using the Parse library. Check the Quick Start guide for your platform.
206 SessionMissing A user object without a valid session could not be altered.
207 MustCreateUserThroughSignup A user can only be created through signup.
208 AccountAlreadyLinked An account being linked is already linked to another user.
209 InvalidSessionToken The device’s session token is no longer valid. The application should ask the user to log in again.

General Issues

Code Name Meaning
-1 OtherCause Invalid login parameters. Check error message for more details.
1 InternalServerError The specified object or session doesn’t exist or could not be found. Can also indicate that you do not have the necessary permissions to read or write this object. Check error message for more details.
2 ServiceUnavailable There is a problem with the parameters used to construct this query. This could be an invalid field name or an invalid field type for a specific constraint. Check error message for more details.
4 ClientDisconnected An invalid field name. Keys are case-sensitive. They must start with a letter, and a-zA-Z0-9_ are the only valid characters. Some field names may be reserved. Check error message for more details.

Learning More

Since this documentation is not yet exhaustive and the team is still working to make it complete, you can find below a set of useful links through which you can learn about the APIs that are not yet documented here:

Back4App Documentation

Parse Open Source Documentation