I can find a map of all String -> Schema.SObjectType types by invoking Schema.getGlobalDescribe().

However, that includes a lot of object types I'm not interested in (like casecomment, processinstance or apexlog)

How can I find only those that are available in the Schema Builder?

3 Answers 3


In short after taking a deeper looker at this for you, I have to conclude the answer to your question is that you can only be partially successful in emulating the filters used by Schema Builder...

enter image description here

enter image description here

enter image description here

The isCustom method will help with the first obviously, the second two are harder to separate. The following uses the fact that Schema Builder seems to favour objects with Record Types (via getRecordTypeInfos). So I based further filtering on this. Note that this is governed method so some filtering on isCreateable objects was also needed. Thus some accessible (but not createable objects) are eliminated sadly.

Anyway, since I spent some time on this for you, I thought I would share anyway. Hopefully this gives you some thoughts and if nothing else a conclusion you can move forward with some other approach or variation on this on. Enjoy!

Following is the best I think you will achieve to cover Custom vs Standard.

Map<String, Schema.SObjectType> gd = Schema.getGlobalDescribe(); 
Set<String> standardObjects = new Set<String>();
Set<String> customObjects = new Set<String>();
for(Schema.SObjectType d : gd.values())
    Schema.DescribeSObjectResult ds = d.getDescribe();
    if(ds.isCustom() == false && ds.getRecordTypeInfos().size() > 0)
    else if(ds.isCustom())
List<String> sortedNames = new List<String>(customObjects);
for(String name : sortedNames)
  System.debug('Custom object: ' + name);
sortedNames = new List<String>(standardObjects);
for(String name : sortedNames)
  System.debug('Standard object: ' + name);

This results in the following, which gets pretty close, but no cigar....

01:53:17.135 (135755000)|USER_DEBUG|[21]|DEBUG|Standard object: Account

01:53:17.135 (135835000)|USER_DEBUG|[21]|DEBUG|Standard object: Campaign

01:53:17.135 (135903000)|USER_DEBUG|[21]|DEBUG|Standard object: CampaignMember

01:53:17.135 (135972000)|USER_DEBUG|[21]|DEBUG|Standard object: Case

01:53:17.136 (136045000)|USER_DEBUG|[21]|DEBUG|Standard object: Contact

01:53:17.136 (136117000)|USER_DEBUG|[21]|DEBUG|Standard object: ContentVersion

01:53:17.136 (136188000)|USER_DEBUG|[21]|DEBUG|Standard object: Contract

01:53:17.136 (136259000)|USER_DEBUG|[21]|DEBUG|Standard object: Event

01:53:17.136 (136326000)|USER_DEBUG|[21]|DEBUG|Standard object: Idea

01:53:17.136 (136393000)|USER_DEBUG|[21]|DEBUG|Standard object: Lead

01:53:17.136 (136465000)|USER_DEBUG|[21]|DEBUG|Standard object: Opportunity

01:53:17.136 (136534000)|USER_DEBUG|[21]|DEBUG|Standard object: Product2

01:53:17.136 (136601000)|USER_DEBUG|[21]|DEBUG|Standard object: Solution

01:53:17.136 (136668000)|USER_DEBUG|[21]|DEBUG|Standard object: Task

enter image description here


Please have a look at https://salesforce.stackexchange.com/a/59925/352 (solution to list all standard and custom objects ignoring system objects)


What I first used is to check for objects that have a Name field.

Using that you will get the objects that also appear in the Schema Builder and (from what I can see) not the objects that we're not interested in.

However, that will result in too many Object describes , so that won't really work. (edit: describe limits have been lifted since Summer14, so this will work!)

I ended up using

 sObjectType == 'Account' || sObjectType == 'Lead' 
 || sObjectType == 'Opportunity' || sObjectType == 'Contact' 
 || schema.getDescribe().isCustom()

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .