Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (2023)

Custom Actions are one of the most useful methods of creating custom messages in Dynamics 365 CRM. Custom Actions enables us to create our own messages where we could register the plugin step the same way we register the Plugin step on Create, Update, Qualify Lead, etc. messages.

Microsoft has now brought an extension for Custom Action called Custom API which is in preview (at the time of writing this blog). As a developer, we should always be aware of what is coming in the future and how & where we can use it. In our quest of exploring something new, we stumbled across Custom APIs and this entire blog post is dedicated on creating a custom action from scratch.

Custom API is a new way of creating Custom Action Messages in Dynamics 365 CRM. For many years, we were used to creating a Custom Action for Custom Messages. An example of which is seen in the below screenshot

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (1)

Now with the Custom API we get some more advanced capabilities such as,

  • PrivateCustom API: It makes the Custom API available only to the owner and the users the owner has shared it with. As per the Microsoft document, Microsoft itself uses this functionality to hide the internal actions and functions.
  • API Type: we can define our Custom API to run as Functionor as an Action. For the Function Type, we need to execute it using GET Method and for Action Type, we can execute it using POST Method.
  • Code First Approach: Custom API supports Code first approach.

Custom API does not require us to create the custom messages the same way as we do for Custom Action but we need to create the simple records in Custom APIentity (as explained in the blog). In addition, we get more types of parameters and response types including the types we use in the Custom Action.

Let us see an example of how we can use the Custom API and register a plugin on it.

Just for the purpose of the example, we are creating a Custom API with one required parameter and two output properties.

In the Input parameter, we will be providing the lead data and the response of it the Custom API should bring to us the record ID which just created or updated the status message.

We will write the plugin code first and then associate our plugin to the Custom API.

Plugin Code:

publicvoid Execute(IServiceProviderserviceProvider)

{

try

{ // tracing object

ITracingService tracing = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

// ExecutionContext object

IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

// object Organization service factory object

IOrganizationServiceFactoryserviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));

// object organization object

IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

GuidrecordId = Guid.Empty;

string message = string.Empty;

//check the key is present

if (context.InputParameters.Contains("lead"))

{

//

EntityleadRef = context.InputParameters["lead"] asEntity;

tracing.Trace($"Lead Reference value : {(leadRef != null ? leadRef.Id.ToString() : "is null")}");

if (leadRef != null&&leadRef.Attributes.Contains("leadid"))

{

(Video) Custom API in Microsoft Dataverse or Dynamics 365 Configuration and Demo | Postman call Custom API

recordId = leadRef.GetAttributeValue("leadid");

service.Update(leadRef);

//pass output parameter

message = "Application has been successfully updated!";

}

else

{

recordId = service.Create(leadRef);

message = "Application is successfully submitted!"; ;

}

context.OutputParameters["recordid"] = recordId;

context.OutputParameters["message"] = message;

}

}

catch (Exception ex)

{

thrownewInvalidPluginExecutionException(ex.InnerException != null&&ex.InnerExceptio n.Message != null ? ex.InnerException.Message : ex.Message);

}

}

After completing the plugin code, register the plugin assembly on the CRM using Plugin Registration Tool. If you are new to this then you can follow the steps from here.

Now start creating Custom API using the below steps.

Step 1: Create Custom API Record

Move to your solution in the power platform, add a new item, and select the Custom API.

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (2)

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (3)

It will open up a new form of Custom API where we need to specify its name and some properties.

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (4)

Unique Name: Unique name for the Custom API (Start with the publisher’s prefix which you have specified on your solution).

Name: Name for the Custom API.

Display Name: Display Name for this Custom API. In case we have enabled multi-languages on the System, we can provide a specific name for the custom API based on the language.

Description: This field is to store the description of this Custom API.

Binding Type: The Binding Type is the Options set field and could be set as Global, Entity, and Entity Collection. This should be specified as per your operation requirement (Entity Collection is only supported in Function Type Custom API).

(Video) Custom Actions Lesson 1: Create your first Unbound Action for use later in conjunction with C# logic

Bound Entity Logical Name: This field is required when we select the Binding Type as Entity or Entity Collection. For the binding type as Global, it can be empty.

Is Function: It defines whether your custom API is a Function (this can only be called using Get Method) or Action (this can only be called using POST method).

Is Private: To define the Custom API is private or public (setting it private makes it accessible to only the owner of the Custom API).

Allowed Custom Processing Step Type: Allowed Custom Processing Step Type is another Option set field with options like None, Async Only, Sync, and Async. These options let you define whether the other plugins could be registered on this Custom Message and also lets you define its behavior. Like Async Only allows the plugins to register only onPost operation with Execution Mode to Asynchronous, and same for the Sync and Async option.

Execute Privilege Name: We can define the privilege that allows execution of the custom API. As per Microsoft docs, we can also create custom privileges and it is currently in development. We can use OOB privileges, for example,prvCreateLead, prvWriteLead, etc.

Plugin Type: Set the reference of your plugin for this API.

Step 2: Create Custom API Request Parameter record

The request parameter is optional for Custom API to be executed. In our case, we are passing the record data to the Custom API.

Move to your solution in Power Platform, add a new item, and select the Custom API Request Parameter.

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (5)

It will open up a new form of Custom API Request Parameter. Set the required properties for the parameter as name and type, below is the detail of each property of the Custom API Request Parameter record.

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (6)Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (7)

Custom API: Set the reference of your Custom API record.

Unique Name: Set the unique name for the parameter.

Name:Name of the custom API Request Parameter that shall be visible on the solution.

Display Name: Display Name for this Custom API Request Parameter which shall be used to called this Custom API from the App.

Description: This field is to store a description of this Parameter.

Type: Set the type of the parameter as per your requirement. Here, we get a rich set of data types. Below are the currently available data type options for Custom API.

  • Boolean
  • Date and Time
  • Decimal
  • Entity
  • Entity Collection
  • Entity Reference
  • Float
  • Integer
  • Money
  • Picklist
  • String
  • String Array
  • GUID

Logical Entity Name: Set Logical Entity Name if you want to use parameter bounded with any specified entity. You can set this field only with Entity and Entity Reference Type of Parameter.

Is Optional: Define your parameter is optional or required.

Step3: Create a Response Property for Custom API that will you get in your success response

Move to your solution in Power Platform, add a new item, and select the Custom API Response Property.

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (8)

Properties are similar to Custom API Request Parameter, there is only one difference, here we do not need to define the response is optional or required.

We have two output parameters -one for getting the record, which was just created or updated in the CRM. Second for messages which we shall receive once our Custom API is executed successfully.

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (9)

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (10)

Step 4:- Here we are done with Custom API configuration, we can now execute it using the Execution function of Xrm.WebApi, Fetch API, and XML HTTP Request.

Execute it using Fetch API:

// Create a variable to point to a contact record and with specific data in the needed fields

varleadData = {

"@odata.type": "Microsoft.Dynamics.CRM.lead",

(Video) Custom Actions Lesson 3: Bringing it all together - Plugins, Unbound Actions, and Power Automate!

"firstname": "Mike",

"lastname": "Staurt",

"subject":"Interested in Car",

"telephone1":"+973426536"

}

asyncfunctionGetResult(leadData) {

var result = await (await fetch('/api/data/v9.2/new_addlead', {

method: 'POST', // *GET, POST, PUT, DELETE, etc.

cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached

headers: {

'Content-Type': 'application/json'

},

referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url

body: JSON.stringify({ "lead":leadData}) // body data type must match "Content-Type" header

})).json();

console.log(result.message);

returnresult.message;

}

Execution using Xrm.WebApi.Online

// Create a variable to point to a lead record and with specific data in the needed fields

varleadRecord = {

"@odata.type": "Microsoft.Dynamics.CRM.lead",

"firstname": "Mark",

"lastname": "Smith",

"subject":"Interested in Car Insurance",

"telephone1":"+947766467"

}

var result= asyncfunction(leadRecord){

var Request = {};

/**

* Request to Get All Relationship Count

* @param {String} EntityName - Entity Logical Name.

(Video) Custom Connectors – Deep Dive & Demo

*/

Request = function(lead) {

this.lead = lead;

};

// NOTE: The getMetadata property should be attached to the function prototype instead of the

// function object itself.

Request.prototype.getMetadata = function () {

return {

boundParameter: null,

parameterTypes: {

"lead": {

"typeName": "mscrm.crmbaseentity",

"structuralProperty": 5 // Entity Type

}

},

operationType: 0, // This is an action. Use '1' for functions and '2' for CRUD

operationName: "new_addlead"

};

};

// Construct a request object from the metadata

varreq = new Request(leadRecord);

result = await Xrm.WebApi.online.execute(req);

return (await result.json()).message;

}

await result(leadRecord);

Result: Lead Record is created in the CRM, as seen below

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (11)

NOTE: As this feature is in preview, do not use it for production use.

Conclusion

Custom API is the new and advanced way of registering the Custom Message on Dynamics CRM with the Code First approach.

Introducing Custom API – The New Way of Creating Custom Actions in Dataverse (12)

FAQs

Which of the following describes how custom actions differ from custom API? ›

Custom Process Actions are always Actions. Custom API provides the option to define custom Functions. Both provide the ability to define a global message not bound to a table. Both provide the ability to pass a reference to a specific table record by binding it to a table.

How do I create a custom API in Dynamics 365? ›

Open the Plugin Registration Tool and log into your environment. Then, Register the Assembly itself. Once your plugin has been registered, you'll need to open the Custom API record again and associate this registered plugin on the Custom API record.

What is a custom API? ›

Custom APIs are an alternative to Custom process actions. Custom process actions provide a no-code way to include custom messages but has some limitations for developers. Custom APIs provide capabilities specifically for developers to define their logic in code with more options.

How do I create a custom action in Dynamics CRM? ›

Activated custom actions are available to processes by selecting the Perform Action item in the Add Step drop down of the web application process form. After the step is added to your process, you can select your new custom action (or any action) from the Action list provided in the step.

What is the use of custom actions? ›

Custom actions are a more technical complement to functions. They allow developers to build an application that combines integration activities in specific ways. Custom actions are used to provide a single prescriptive solution that might have more capability but usually gives the administrator less flexibility.

Where do custom actions execute? ›

Because a custom action can be scheduled in both the UI and execute sequence tables, and can be executed either in the service or client process, a custom action can potentially execute multiple times. Note that the installer: Executes actions in a sequence table immediately by default.

How can I register my custom API in PowerApps? ›

You can register a new custom API from powerapps.com. Go to “Connections” under the “Manage” section in the left navigation menu. And click on “New Connection” on the top right. Switch to the “Custom” tab and click “New Custom API”.

How do I create a custom REST API? ›

How to Create a Custom Endpoint for the REST API (In 4 Steps)
  1. Create a Child Theme. Whenever you want to customize a theme, it's recommended that you create a child theme and apply your changes to it. ...
  2. Define Your Route. ...
  3. Implement the Callback Function for Your Custom REST Endpoint. ...
  4. Test Your Endpoint.
23 Jun 2021

How can I build my own API? ›

How to Build an API: a Comprehensive Guide
  1. Start with your goals and intended users.
  2. Design the API architecture.
  3. Develop your API.
  4. Test your API.
  5. Monitor your API and iterate on feedback.

What are the 3 types of APIs? ›

Today, there are three categories of API protocols or architectures: REST, RPC and SOAP. These may be dubbed "formats," each with unique characteristics and tradeoffs and employed for different purposes. REST. The representational state transfer (REST) architecture is perhaps the most popular approach to building APIs.

What are 3 most common APIs? ›

There are also three common types of API architectures: REST, a collection of guidelines for lightweight, scalable web APIs. SOAP, a stricter protocol for more secure APIs. RPC, a protocol for invoking processes that can be written with XML (XML-RPC) or JSON (JSON-RPC).

Can we create custom API? ›

You can create custom REST APIs to build up a library of services that can be used by your mobile apps and intelligent bots. Custom APIs are particularly useful for aggregating data from other sources, adding any relevant business logic, and returning results in a mobile-friendly way.

How do I create a custom action? ›

To create a custom action:
  1. Add a new event by clicking the Add event button at the bottom of the Events panel.
  2. Select the target and the event.
  3. For the action, select Custom > Add custom action. ...
  4. Name the action in the field above the code box (after the gwd. ...
  5. Define the function in the code box. ...
  6. Click OK.

What are the different types of custom actions? ›

In this article
Basic custom action typeType
Custom Action Type 1DLL file stored in a Binary table stream.1
Custom Action Type 2EXE file stored in a Binary table stream.2
Custom Action Type 5JScript file stored in a Binary table stream.5
Custom Action Type 6VBScript file stored in a Binary table stream.6
13 more rows
7 Jan 2021

How do I add custom actions in setup project? ›

Add the custom action
  1. Switch back to your installer project and select the gadget installer project in Solution Explorer.
  2. On the View menu, point to Editor, and then click Custom Actions. ...
  3. In the Custom Actions Editor, select Install. ...
  4. In the Select Item in Project dialog box, double-click the Application Folder.
12 Jun 2009

What is a custom action? ›

Custom actions are actions entirely defined by the user. They can be executable files, dynamic linked libraries, Visual Basic scripts or JavaScript files. They can be scheduled at any time during the installation.

How do I add custom action buttons? ›

Select Settings | Custom Actions. Select Create. Then give your custom action button a name and select whether you want the button to appear on selected base objects and on desktop and mobile apps.

How do I activate custom action groups? ›

Click on the Hammer & Spanner icon to access Action Groups. An action group is a group of part actions that can be triggered using certain buttons or keys. They can be configured under the Action Groups tab in the VAB or SPH.

How do I debug custom action? ›

From the menu bar select Tools -> Attach to Process option. In the newly opened dialog enable the Show processes from all users checkbox. In the Available Processes list select the process with the ID displayed by the custom action dialog. Click on [ Attach ] button to start debugging.

How do I create a custom action in MSI? ›

To add a custom action: 1. In the View List under Behavior and Logic, click Custom Actions and Sequences (in Basic MSI, InstallScript MSI, MSI Database, and Transform projects) or Custom Actions (in DIM, Merge Module, and MSM Database projects).

How do I add actions to an object in Salesforce? ›

Required Editions and User Permissions
  1. In Setup, in the Quick Find box, enter the name of the object that you want to add actions to. ...
  2. Click New Action to see which types of actions are available.
  3. From the Action Type dropdown list, select the action to add. ...
  4. Enter a label and description for the action.
  5. Click Save.

What is Power Apps custom API? ›

Custom APIs are a powerful way to connect to any existing API, hosted anywhere, from PowerApps. You do not need a PowerApps Enterprise subscription to register or use a Custom API. Custom APIs are RESTful endpoints that you can connect to and use from PowerApps.

Can we call API from Power Apps? ›

Usually we need to create a Custom connector if we need to call API and get the return value. Hi @Maxwell454 : Usually we need to create a Custom connector if we need to call API and get the return value.

What is Dataverse in Microsoft? ›

Dataverse lets you securely store and manage data that's used by business applications. Data within Dataverse is stored within a set of tables. A table is a set of rows (formerly referred to as records) and columns (formerly referred to as fields/attributes).

What are the 4 most common REST API operations? ›

Review these five common RESTful API HTTP methods that developers need to know. Use this guide to understand the differences and uses for each of the methods.
  • HTTP resources vs. resource collections. ...
  • Method 1: POST. ...
  • Method 2: PUT. ...
  • Method 3: PATCH. ...
  • Method 4: GET. ...
  • Method 5: DELETE.
16 Jul 2021

Which tool can be used to generate REST API? ›

DreamFactory is a REST API management platform. In addition to providing all the tools businesses need to create and manage multiple REST APIs, DreamFactory will also automatically create Swagger documentation for every API it generates.

What is an API and how is it built? ›

API is the acronym for Application Programming Interface, which is a software intermediary that allows two applications to talk to each other. Each time you use an app like Facebook, send an instant message, or check the weather on your phone, you're using an API.

What is an example of an API? ›

APIs are mechanisms that enable two software components to communicate with each other using a set of definitions and protocols. For example, the weather bureau's software system contains daily weather data. The weather app on your phone “talks” to this system via APIs and shows you daily weather updates on your phone.

Why should you create your own API? ›

You Should Probably Build an API If:

You want to access the same data in many different places or ways (eg: an internal dashboard and a customer-facing web app) You want to allow customers or partners limited or complete access to your data. You want to upsell your customers on direct API access.

What tools are needed to build API? ›

Swagger editor is the leading API design tool on the market. It allows you to design and document APIs using a free web-based open-source editor. Also it is designed solely for creating OpenAPI-based APIs. It provides options to work web-based or in a local environment.

What is the purpose of APIs? ›

Application programming interfaces, or APIs, simplify software development and innovation by enabling applications to exchange data and functionality easily and securely.

What API is most used? ›

Most Popular API Integrations
  • Skyscanner Flight Search – Learn More.
  • Open Weather Map – Learn More.
  • API-FOOTBALL – Learn More.
  • The Cocktail DB – Learn More.
  • REST Countries v1 – Learn More.
  • Yahoo Finance – Learn More.
  • Love Calculator – Learn More.
  • URL Shortener Service – Learn More.
20 Aug 2022

What are API best practices? ›

Collections, Resources, and their URLs
  • Understanding resources and collections. Resources are fundamental to the concept of REST. ...
  • Nouns describe URLs better. ...
  • Describe resource functionality with HTTP methods. ...
  • Give feedback to help developers succeed. ...
  • Give examples for all your GET responses. ...
  • Handle complexity elegantly.

Which is the best example of an API? ›

The Google Maps API and Twitter API may be among the most widely used API examples, but most software-as-a-service (SaaS) providers offer APIs that let developers write code that posts data to and retrieves data from the provider's site as well.

What is a custom API key? ›

Custom API keys – and the associated custom security roles – allow you to provide access to only the data and functions that a given user is allowed to work with. By adjusting the security policy in Backendless, you do not need to implement any custom safeguards in your code.

Can we create API for free? ›

The AWS Free Tier provides developers with no-cost access to most of the services AWS offers—including Amazon API Gateway. Your free Amazon API Gateway maxes out at one million API calls per month, and only lasts one year, but it's enough to get you started.

How much does a custom API cost? ›

An API app usually costs $5,199 to build. However, the total cost can be as low as $2,600 or as high as $7,799. An API app with a low number of features (also known as a "minimum viable product", or MVP) will be more affordable than an app that includes all intended functionality.

What is custom actions in application packaging? ›

The custom actions are the actions that can be performed together with the MSI package install and/or uninstall process. They can be used, for example, to prepare the system for installation of the package, to check prerequisites, to start the application on installation completion, etc.

How do you call an action in workflow? ›

Invoke a custom action from a workflow

Go to Settings > Processes. On the Nav bar, choose New. Give the process a name and choose the Workflow category.

How do I make an action widget? ›

Setup
  1. Select a Widget Event using the drop-down menus under IF. a. Select the widget that you want to create actions for. b. Select the event that the actions will respond to.
  2. Select actions to take using the drop-down menus under THEN. a. Select the widget that should take an action when the event occurs. b.
21 Apr 2022

What are the 3 types of actions? ›

3 Types of Action
  • Daily Habits. There are some actions that we take daily that support us and move us toward our goals. ...
  • Planned Actions. Planned actions are the specific tasks that we identify that we need to do to accomplish something or move towards our goals. ...
  • Inspired Actions.

What are the two types of actions? ›

There are two types of action verbs; transitive and intransitive.

What are action types? ›

An action type refers to a category of actions that can be associated with a policy. For use in the framework, an action type must be registered with the following information: Location of the code that handles the design-time and runtime aspects of the action type.

Where are custom actions in Salesforce? ›

Custom actions are buttons that sales reps can click to perform an action in the quote line editor, configurator, or several other detail pages. For example, sales reps can select to show a filtered section of your price book or to direct users to an internal or external URL.

How do I deploy custom actions in Salesforce? ›

From Setup, in the Quick Find box, enter Actions & Recommendations , and select Actions & Recommendations. Click New Deployment. Name your deployment. Select at least one type of guidance to show, for example, Flows and quick actions.

What is custom action in MS CRM? ›

Custom Actions are one of the most useful methods of creating custom messages in Dynamics 365 CRM. Custom Actions enables us to create our own messages where we could register the plugin step the same way we register the Plugin step on Create, Update, Qualify Lead, etc. messages.

What is custom action in Salesforce? ›

Custom actions are buttons that sales reps can click to perform an action in the quote line editor, configurator, or several other detail pages. For example, sales reps can select to show a filtered section of your price book or to direct users to an internal or external URL.

What are custom actions in MSI? ›

The custom actions are the actions that can be performed together with the MSI package install and/or uninstall process. They can be used, for example, to prepare the system for installation of the package, to check prerequisites, to start the application on installation completion, etc.

How do I Create a custom action? ›

To create a custom action:
  1. Add a new event by clicking the Add event button at the bottom of the Events panel.
  2. Select the target and the event.
  3. For the action, select Custom > Add custom action. ...
  4. Name the action in the field above the code box (after the gwd. ...
  5. Define the function in the code box. ...
  6. Click OK.

What are the types of custom actions? ›

In this article
Basic custom action typeType
Custom Action Type 1DLL file stored in a Binary table stream.1
Custom Action Type 2EXE file stored in a Binary table stream.2
Custom Action Type 5JScript file stored in a Binary table stream.5
Custom Action Type 6VBScript file stored in a Binary table stream.6
13 more rows
7 Jan 2021

How do I create a custom action in Salesforce? ›

Click Configure next to the Salesforce Maps package. Select Settings | Custom Actions. Select Create. Then give your custom action button a name and select whether you want the button to appear on selected base objects and on desktop and mobile apps.

How do I add actions to layout? ›

From Setup, click the Object Manager tab. Select Cases, and then open the Case Page Layouts setup page. Select the page layout that you want to add the action to, and then click Edit. Add quick actions to the case page layout.

How do I add a custom action to Visual Studio setup project? ›

To create the custom action, open the gadget project in Visual Studio. On the Project menu, select Add Class, select Installer Class in the Add New Item dialog box. Accept the default name of Installer1. cs, and then click Add.

Where do custom actions execute in Appdynamics? ›

A custom action differs from other actions on its singular execution on the controller instance. The custom action is made up of a custom action script and a custom. xml file (you must create the file before you create an action that uses them).

What is the difference between a workflow and an action? ›

in an action you are full in control. The advantage of an action is that you can register plugin steps on it. That means that you can write your own handling the way you want. Using workflows means that you are more limited to the tools CRM is providing.

Videos

1. Dynamics CRM Custom Actions
(Power Platform and Dynamics 365 Tip Of The Day)
2. Dynamics CRM Custom Actions
(Khaja)
3. Zero to Hero - Session 4 - Lesson 8 - Mike Ochs - Dataverse Plugin Development.
(Victor Dantas)
4. Get started using Postman with Microsoft Dataverse Web API
(Microsoft Power Apps)
5. Power Automate - How to Create custom connector
(M365 Tech Help)
6. How to Use Custom API Action to Call an API Endpoint
(Okta)
Top Articles
Latest Posts
Article information

Author: Reed Wilderman

Last Updated: 02/26/2023

Views: 6097

Rating: 4.1 / 5 (52 voted)

Reviews: 83% of readers found this page helpful

Author information

Name: Reed Wilderman

Birthday: 1992-06-14

Address: 998 Estell Village, Lake Oscarberg, SD 48713-6877

Phone: +21813267449721

Job: Technology Engineer

Hobby: Swimming, Do it yourself, Beekeeping, Lapidary, Cosplaying, Hiking, Graffiti

Introduction: My name is Reed Wilderman, I am a faithful, bright, lucky, adventurous, lively, rich, vast person who loves writing and wants to share my knowledge and understanding with you.