The main difference is semantical. A page is something that stands by itself, while a post type in a categorization of content. This semantical difference results in different admin flow for both.
The only other difference is that pages can have flexible URLs and you can basically put a page anywhere.
As far as core API goes, you can do everything in any of them.
So to answer your question directly, when to use one over the other depends on how you think the admin will use it. For example for most sites there is only one contact page, using a CPT for that will just clutter the admin UI. OTOH plugins that enable you to create many forms will use a CPT as it is results in a more organized admin for them
Related Posts:
- Make parts of your wordpress website completely built with data from external APIs?
- Database to page routing API?
- Hook for post and page load
- Searching multiple custom post types and pages
- Fetch All Posts (Including Those Using a Custom Post Type) With WordPress API
- Return current page type
- get post type plural
- Get page by template?
- Page as child in custom post type slug?
- Is it proper to create a page just to generate a listing page (eg. for a custom post type)
- TV Show database – Best way for structuring it?
- How to Add Pages Under Custom Post Type URL Structure?
- How to create user personal pages with information from their meta profile fields?
- Exclude Custom Post Type & Pages From Auto-Tag Function
- Display “Post 2 of 4” on single post page?
- Custom Post Type Name Causing Problem
- Make custom post type display as a page
- wp_list_pages doesn’t work in hierarchical custom post type
- Multiple portfolios with one custom post type?
- Making pages also serve as taxonomies? Or give full pages to taxonomies?
- Share parent path between Custom Post Types and Pages?
- ‘Pages’ widget alternative for custom post types?
- Check if admin is editing page or custom post type
- remove child post from custom post type archive
- custom posts on different page
- Trying to edit the single page from a Custom Post
- Custom Post-to-Post with multiple parents?
- How do I fix permalinks for custom post types that has the same slug as a page?
- Create custom PAGE with register_post_type
- How do I get the intended post type of a revision post?
- Making a custom help center page
- How i can add ‘N’ page of ‘N’ pages under posts loop?
- create a template page for a post
- Page vs Custom Post Types Differences/Issues
- Exclude pages in archives results
- Trouble with CPT Child 404
- Assign same parrent Page to pages AND custom post types
- No Permission to add new Page, Post or CPT with Admin role
- Static page determines as home, but it is not
- Show Custom Post Type meta boxes only on Page Edit
- How to use Custom Page Templates for hierarchical Custom Post Type
- Top Level pages in wordpress giving 404, but child pages working fine
- Why does not this wp_redirect work in is_single()?
- Why is get_pages() returning a boolean?
- Including link to custom post type in ‘wp_list_pages’ function
- Creating tags via API
- the_content(); of custom post type treated as an array or object
- Multiple pages per post (not pagination)
- Display an authors post on a single page only when they are logged in
- Merge page with custom post type
- Conflict between wp_list_pages and get_posts – list pages not displaying
- Custom REST endpoint not working to retrieve single posts (“rest_no_route”)
- WordPress as a backend for external service? [closed]
- URL Rewrite – Page Archive
- How to set the mainpage of a custom post type?
- Render a Post or Page using the correct file
- Setting a homepage – doesn’t seem to work
- Under What Conditions Can I name my CPT the same as my CPT Page?
- custom post creation on front page – on submit a search is done
- How to setup different permlalinks for posts and pages?
- Getting subpage of subpage – Custom posts
- Sets post_parent in custom post type posts automatically based on cpt->page name
- Does “Custom Post Type” can have page hierarhy option?
- Use Gravity Forms and a Shopping Cart for output to Freshbooks for an Estimate [closed]
- How do I disable the built-in editor and automatically configure the properties of new pages?
- Use a template for a specific url slug without creating a page
- Add custom template ‘sub-page’ to Custom Post type?
- Custom Post Type Single Page and Archive Page redirects to Home Page
- Create Custom page with custom domain
- Do not show child pages within a file page
- Disable Sidebar on certain pages
- Populating Custom Fields from live JSON
- Cannot save pages after migration
- Displaying posts inside table having issues
- Show posts from custom post type sorted by category/taxonomy on a one-pager/page
- Custom post types & Pages hierarchy – Error 404
- WordPress API only returning HTML
- How to manage a custom post type archive as a page?
- Creating Slider in wordpress theme with custom post
- One Post with different content, depending on a Page
- Cannot use pages created on WP
- Different post types arranged on one page
- How to display data with pagaination on backend?
- Insert custom post data in to MailChimp campaign email
- Pulling Content from Existing Database
- Is it possible to make one of two custom fields in Custom Post Type UI Required but not the other?
- Excerpt for each post type and for is_front_page
- How to Associate Posts with Pages
- Programmatically Split A Post Into Multiple Pages
- Why are my wp urls showing page not found?
- query_post while (have post) get_template_part()?
- “regular” pages not found after changing permalink
- Custom Post Type Slug / Page Slug Conflict – Prevent use of reserved slug on page save?
- Using custom post types within a section of a template
- How to store queried custom data and use it in multiple pages?
- Highlight specific menu item when custom post is page
- wp_insert_post not working for custom post type?
- How to add a regular page under a custom post type?
- An script/Plugin for automatic page creation per term
- How to consume external API from WordPress post editor and display the response data in the custom field?