Disclaimer: There are a few steps required to get this done, but the reward at the end is worth the effort.
Get Created By field GUID
To update the Created By column, we need to first find it’s Field GUID. Because the Created By column is set to read only, we will query our list for all fields but filter them to only show ones set ReadOnlyField = true
- Create a new Send HTTP Request to SharePoint action. Fill in, adjust according to your tenant / match the rest.

URI: _api/web/lists/getbytitle('Your%20List%20Name')/fields?$filter=ReadOnlyField eq true
- Run your flow and open the run history, we want to get at the Outputs from the action we created in step 1.

Copy the body content and paste it into a text editor of your choice.
- Search for Created By in your text editor, and just a few lines up from where it appears is your Created By Field GUID. Note this because we are going to need it later.

You can remove the Send HTTP Request action we created in step 1 – no longer required.
Get UserID Number to write to Created By column
Created By is a person column that has an associated AuthorId field. The AuthorId field contains a numeric value (ie: 11) which is used to populate the Created By person data. Our end goal (soon)-- to simply update this field to the numeric value of the user we want listed in the Created By column.
First we need to get our replacement numeric value from somewhere. In the following example I look up a sharepoint users numeric value, simply by supplying their email address (in the example this was dynamic content supplied by a person column in my list called 'EmployeeName')
- Create a new Send HTTP Request to SharePoint action. Fill in, adjust according to your tenant / match the rest. Let’s get some user data we can pull details from.

Uri: _api/web/siteusers/getByEmail('[USER@EMAIL.ADDRESS]')
Plug in any dynamic content that will provide you with an email address

- Now that we have this collection of user data, instead of messing around with formulas to isolate the Users ID #, it’s JSON… let’s parse it. Create a new Parse JSON action and plug in Body from the dynamic content provided by the Send HTTP Request of the step above.


This guide is long enough, if you don’t know how to use a Parse JSON action / generate from sample – it’s super easy to find a how-to on the net. Go check that out and come back. Forgive me.
The Parse JSON action will now create a schwack of dynamic content that can be selectable in future actions. One dynamic content entry called 'Id', is the numeric value associated to the email address we provided above and exactly what we are going to plug into the AuthorId field! But, first we must...
Unlock the Created By column
Now that we have taken care of all the prerequisites, let’s get on with unlocking the column for manual updating. The column is locked by SharePoint automatically after a record gets updated - if you don't unlock it before attempting to update it's contents, the column doesn't get changed.
Create a new Send HTTP Request to SharePoint action. Fill in, adjust according to your tenant/list/Created By fields GUID, match the rest.

Uri: _api/web/lists/getbytitle('Your%20List%20Name')/fields(guid'Your-GUID-goes-here-yasss')
Body: { '__metadata': { 'type': 'SP.Field' }, 'ReadOnlyField': false }
Update the Created By field
Now that the Created By column is unlocked, we can update its fields.
Create a new Send HTTP Request to SharePoint action. Fill in, adjust accordingly to your tenant/list, match the rest.

Uri: _api/web/lists/getbytitle('Your%20List%20Name')/items('[ID]')
The ID you should be able to plug in from dynamic content from other actions (ie: Get Items, When a New Item is Created, etc)
Body: { '__metadata': { 'type': 'SP.Data.Your_x0020_List_x0020_NameListItem' }, 'AuthorId': [Id] }
For the [Id] shown, we plug in some dynamic content from our Parse JSON Action. Note: !pay attention here to cAse. Use the dynamic content Id (uppercase i lowercase d) -- and not id (all lowercase) when you choose.

Re-lock the Created By column
Now we can set the Created By column back to read-only.
Create a new Send HTTP Request to SharePoint action. Fill in, adjust according to your tenant/list/Created By fields GUID, match the rest.

Uri: _api/web/lists/getbytitle('Your%20List%20Name')/fields(guid'Your-GUID-goes-here-yasss')
Body: { '__metadata': { 'type': 'SP.Field' }, 'ReadOnlyField': true }
I spent the better part of a day sifting through bits and pieces from various forums -- most of them producing more questions than solutions. Hopefully, you find this helpful (and save yourself some time).
-F