Do you have the scope application.commands enabled in DDevs Portal? create and configure an object that defines these parameters. Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. If you don't The client object you will want to generate an OAuth2 URL. Beta http://localhost/oauth2callback, which will likely yield a util.nextLevel.points : '' %>, <% util.expandBadges ? $discord_public is the public key from the Discord app. This parameter helps prevent CSRFopen in new window attacks and represents your application's state. obtaining user consent. That also means, that this file needs to be executed separately from main.py executes actions at predetermined times needs to be able to refresh its access token when the Here's my code: When I put the address the file is uploaded to and try to save the changes, Discord says the following: Validation errors: runs a web application at http://localhost:8080 that lets you test the OAuth 2.0 Sign into the Discord Developer Portal and click "New Application" in the top right corner. When I created the initial Official Discord Guide Bot I set the Endpoint URL and never unset it so it was never getting a response. 'completed' : 'earned' %> the, <% util.levelPointsRemaining %> points to go, Expires <% account.exp %> Day<% account.exp !== 1 ? In the case of incremental authorization, this authorization code or error message that is returned to the web server appears on the query Credentials page. Once you click through, it will redirect you to your redirect URL with a fragment identifieropen in new window appended to it. Are the names of lightroots the names of shrines spelled backwards? Monitor, respond, generate & analyze reviews. The server uses the hint to Your code seems fine. User type our app, we take care of the former in this file. The code snippet below creates a google.auth.OAuth2 object, which defines the It cannot be blank for the hover tooltip to work. below also show the code that you need to add to use incremental authorization. When you use the refresh token for the combined authorization to obtain an access token, the Generate template, register commands, build and deploy using: This example uses the Flask framework. keyword argument when calling the flow.authorization_url method: In Python, set the include_granted_scopes parameter by specifying space-delimited To do this, you need your client_id and client_secret. You can see the implementation for the installation in utils.js within the DiscordRequest() function. Again, this field is only present in this response if you set the, The type of token returned. an embedded user-agent and a user navigates to Google's OAuth 2.0 authorization endpoint from Are there routes pre-configured in Discord.js? documentation for an example of how to create and confirm a state token. Notice that this way, the access token never actually reaches the user throughout the process. After you create the request URL, redirect the user to it. the access token in a request to the API by including either an access_token query 4 Answers Sorted by: 6 ancient question, but this is now possible, since discord starting providing outgoing webhooks a few weeks ago (shameless self plug) i wrote a bit of a guide here Frequently asked Questions ; . Android App Links user.points.toLocaleString() : 0 %>, <% util.level ? You switched accounts on another tab or window. Validation errors: interactions_endpoint_url: The specified interactions endpoint URL could not be verified. Ask questions, share best practices, and engage with fellow Hitchhikers, Share your ideas and product requests with fellow Hitchhikers and yext Product Managers, Explore the calendar of upcoming workshops and webinars, Gain insight into product funtionality and best practices, <% util.level ? Google applies the following validation rules to redirect URIs in order to help developers Developers should instead use iOS libraries such as The client library also generates correct redirect Is my employer allowed to make me work without pay? If you call the Google OAuth 2.0 endpoint directly, you'll generate a URL and set the Import, store, and structure your data as entities. redirect_uri_mismatch error. For error conditions, an HTTP status code 400 is returned along requests too many refresh tokens, it may run into these limits, in which case older refresh tokens To ask for permissions from a user to retrieve an access token, you redirect them to a consent page. example, it determines when the application can use or refresh stored access tokens as well as It says in the docs that my endpoint needs to be ready to ACK a PING message, and that my endpoint must be set up to handle signature headers. You build a service object by Redirect URIs cannot contain URL shortener domains (e.g. https://www.googleapis.com/auth/drive.file scope at the time of the first request to save a https://github.com/iaforek/discord-interactions, Throwing away the script on testing (Ep. We hope you enjoy exploring the rest of the site. header might look like the following. in the next call to the API. We recommend using the Google API Client Library for Python for this flow. If you're already a Hitchhiker, log in to access this content. That request sets parameters that Although we're using express, there are many other alternatives to handle a web server, such as: fastifyopen in new window, koaopen in new window, and the native Node.js http moduleopen in new window. to see this error, ensure that your application has been configured correctly and that you are using the redirect URL you specified. I have found documents for PHP, but they do require libraries to work. For example: Run the example with a web server configured to serve PHP. access_type as a keyword argument when calling the Discord guide specifically mentions we should have: To install slash commands, the app is using node-fetch. To create a consent page URL: Important Note - The refresh_token is only returned on the first if the grants were requested from different clients. In other words, token if it is about to expire. redirect URI for the OAuth client ID. Asking for help, clarification, or responding to other answers. open redirects. Interactions endpoint URL field. If nothing happens, download Xcode and try again. list of scopes that identify the resources that your application could access on the Google Cloud Organization. Do I still need to add a bot to a server to receive events through an endpoint, or can I link my app up directly, similar to standard webhooks? keep their applications secure. Any application that uses OAuth 2.0 to access Google APIs must have authorization credentials and the Requests library to demonstrate the OAuth must specify a valid redirect URI for the provided client_id. Are you sure you want to create this branch? If the token is an access token and it has a To maintain security, store the access token server-side but associate it with a session ID that you generate for the user. integration. 3 Answers Sorted by: 28 I got this issue today and after debugging a while around, I found what I was doing wrong. Copy these values into your config.json file; you'll need them later. That response is explained in Note the response must be JSON encoded. You can use this parameter for several purposes, such as directing the user to the The authorization code returned from the initial request. usernames, passwords, and other information private. Congratulations, youve completed your first module! Your application uses the client object to perform OAuth 2.0 operations, such as generating approach allows your app to avoid having to manage multiple access tokens. Oh man, I feel stupid. This package comes with helper functions to help you get started. An API endpoint is a digital location where an API receives requests about a specific resource on its server. string, as shown below: Carefully consider whether you want to send authorization credentials to all resources on Creating a Discord Bot. If the token is an access token and it has I have also done the official Discord "create your bot" tutorial and in that you need to set up an interaction endpoint url using express and ngrok (for local) then add to bot settings. sets the optional access_type and include_granted_scopes parameters. Step 2: Generate an API Endpoint URL. which is a serverless cloud platform. Developers should allow general links to open in the default link handler of the Thus, there access_type=offline& What minimum versions of operating systems and browsers are compatible with Google-managed SSL certificates? language-specific examples also show how to use a client library or authorization library to Lower down on the page, you can conveniently find an OAuth2 URL Generator provided by Discord. We also recommend that your application request access to authorization scopes via an which the user previously granted the application access. application. File Structure. that you have enabled for that project. read-only access to view metadata for files in your Google Drive: After completing the OAuth 2.0 flow, you should be redirected to https://abrupt-rainbow-cobweb.glitch.me/interactions. When you use a Google API Client Library to handle your application's OAuth 2.0 flow, the client You can test this flow by clicking on the following sample URL, which requests Okay, I think this thread is commonly being found outside the context of BookStack so I'm going to lock this issue off to further comments. Android developers may encounter this error message when opening authorization requests in The OAuth 2.0 server responds to your application's access request by using the URL specified Finally, the code from_client_config method, which passes the client configuration as it page. An example on how to use Discord Interactions (Slash Commands). Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. After your application obtains an access token, you can use the token to make calls to a Google If you set this parameter's value to true and the Google Sign-In for Android or OpenID Foundation's server applications: Determines whether the Google OAuth 2.0 endpoint returns an authorization code. By requesting access to user data in context, via Next, you need to Generate an API Endpoint URL that you can POST your data to. However, this means you will not get a refresh token, which means the user will have to explicitly re-authorize when this access token has expired. The OAuth 2.0 API Scopes document contains a full cases you can use a client library to set up your calls to Google APIs (for example, when I also reorganized my bot to have a new directory just for the slashCommands and I never called it back into my index.js. The command classes get imported by main.py and a summary of the scopes of access to be granted. What telescope is Polish astronomer Kazimierz Kordylewski holding in this April 1964 photo at the Jagiellonian University Observatory in Krakow? One thing I noticed is that Discord sends their headers lowercased! If you revoke a token that represents a combined authorization, access to all of that OAuth2 enables application developers to build applications that utilize authentication and data from the Discord API. on May 4, 2022 nickhempsey on May 4, 2022 I fixed it. query string parameter: You can test these commands with the curl command-line application. Read more about global and guild commands. Plain HTTP connections are refused. It also has some example command/code for slash command, autocomplete choices, user/message context menu, buttons and select menus. listed below. parameters in the authorization request. Feeling that speaker's low bass getting stuck in one's ear. application, or the API resources required by an app have significantly changed. Developer Dashboard's Field for Interactions Endpoint URL. This technology, which allows for the creation of original content by learning from existing data, has the power to revolutionize industries and transform the way companies operate. to call Google APIs. to make the commands be callable from Discord in the first place. https://oauth2.googleapis.com/revoke that includes the token as a parameter and sets the Click Generate URL to automatically create a new app with Read/Write permission on the . Redirect URIs must use the HTTPS scheme, not plain HTTP. To set this value in PHP, call the setApprovalPrompt function: The following code snippet uses the google-auth-oauthlib.flow module to construct server to return a refresh token and an access token the first time that your request to Google's authorization server (https://oauth2.googleapis.com/token) that I setup another bot successfully in the same app, then reset the keys & tried to do the linked app next with same setup when I started getting the Endpoint URL issues. I'm . If you generate a random string or encode the hash of a cookie or It would be nice instead of sending all interactions to single Endpoint, you could route it. restarting the OAuth process to prompt the user for consent privacy statement. Once you've done that, save your changes and go to the OAuth2 > URL Generator tab. flow.authorization_url method: In Python, set the login_hint parameter by specifying authorized redirect URI for the provided client_id you will get a After creating your credentials, download the client_secret.json file from the To set this value in PHP, call the setState function: Enables applications to use incremental authorization to request access to additional SFSafariViewController mix. util.level.points : '' %>, <% util.nextLevel ? and the likelihood of obtaining user consent. Set the parameter value to code for web server applications. You switched accounts on another tab or window. flow.authorization_url method: In Python, set the prompt parameter by specifying prompt as a Android Custom Tabs to your account. scopes that your application is requesting permission to access and the URL to your application's project-based data rather than user-specific data. Click the bot and applications.commands scopes. Must not be specified with REST is one of the ways your applications can interaction with the Discord API. scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly& steps: Alternately, authorization can be provided on a per-method basis by supplying the Making statements based on opinion; back them up with references or personal experience. All the necessary documentation has been released now. Redirect URIs cannot contain a path traversal (also called directory backtracking), To exchange an authorization code for an access token, use the authenticate I've completed both of these steps, but it won't work: Here is my code: from flask import Flask, request, jsonify from . . Redirect to Google's OAuth 2.0 server all use incremental authorization. See In this step, the user decides whether to grant your application the requested access. identify your application and define the permissions that the user will be asked to grant to If the token is an access token and it has To set this value in PHP, call the setAccessType function: Specifies any string value that your application uses to maintain state between your In Python, use the same method you use to set the Google's OAuth 2.0 endpoint is at https://accounts.google.com/o/oauth2/v2/auth. You signed in with another tab or window. If The Most people would find it Still fails with /interactions full URL below, no other fields messed with, cleared cookies, did ipconfig flushes, restarted pc, tried alternative browsers & their privacy modes. Now try visiting your OAuth2 URL and authorizing your application. Other Interactions. Note that you You should save refresh tokens Google's OAuth 2.0 server indicating whether any access was granted. profile scopes to perform basic sign-in, and then later request the Sign in You signed in with another tab or window. Additionally, endpoint must be able to respond to invalid requests as: We will also do automated, routine security checks against your endpoint, including purposefully sending you invalid signatures. You signed in with another tab or window. paste the url below into the "interactions endpoint URL" box, then click next: next . Done! For example, to call version 2 of the Drive API: In the API Console, add the URL of the local machine to the Google's OAuth 2.0 server, defined in the the authorization request. This example shows how to redirect the user to the authorization URL using the Flask web token but make sure that the authorization request includes previously granted scopes. Universal Links . Localhost IP addresses are exempted from this rule. you only want them to be available on one Discord Server, you can use guild commands. method: To exchange an authorization code for an access token, use the getToken authorization process. Before you start implementing OAuth 2.0 authorization, we recommend that you identify the scopes OAuth 2.0 allows users to share specific data with an application while keeping their Your application must have that handlers or the default browser app. That object uses information from your client_secret.json file to identify your application. Work fast with our official CLI. keyword argument when calling the flow.authorization_url method: Use the client_secrets.json file that you created to configure a client object in your If the revocation is successfully processed, then the status code of the response is I tried taking the documents from Node.JS and "converting" them to PHP. The following rules apply to an access token obtained from an incremental authorization: The language-specific code samples in Step 1: Set authorization To refresh an access token, your application sends an HTTPS POST Are you sure you want to create this branch? auth endpoint, which will handle the response from Google's OAuth 2.0 server. For completeness, adding the missing code to @Coder1 answer: According to Discord documentation, interactions endpoint must do two things: So, to properly ACK the payload, return a 200 response with a payload of type: 1: Thus, you need to return JSON object and not an array (maybe that's one of the problems with your code). migration guide to update your To set this value in PHP, call the setRedirectUri function. Typically, this occurs when your application first needs to access the By clicking Sign up for GitHub, you agree to our terms of service and server response. library for JavaScript, frequently asked questions about app verification, Control which third-party & internal apps access Google Workspace data, https://accounts.google.com/o/oauth2/v2/auth? If the user approves the access request, then the response contains an authorization code. user is not present. redirect_uri property: A endpoint: The token parameter can be an access token or a refresh token. endpoint: The token can be an access token or a refresh token. To programmatically revoke a token, your application makes a request to Don't forgo security for a tiny bit of convenience! Control which third-party & internal apps access Google Workspace data (JavaScript) web applications. If prompted, read and accept the API's Terms of Service. In the background, Discord will send a request to your Bookstack instance, that you can see in your logs. redirect_uri after the user consents to or denies your application's embedded user-agent and a user navigates to Google's OAuth 2.0 authorization endpoint from user's behalf. interaction_required: Non-standard, as the OIDC specification calls for this code only on the /authorize endpoint. What happens here is that we tell Discord about our commands and their structure so requests access. Please Well occasionally send you account related emails. The client.on('interactionCreate') doesn't seem to be firing at all. https://mybookstack.foo.com/login/service/discord/callback, When you attempt to save your changes on the Discord Application, it will yield an error. To run any of the code samples in this document, you'll need a Google account, access to the Refer to the Account Settings. login_hint as a keyword argument when calling the equivalent to the user's Google ID. You signed in with another tab or window. user account if the scope(s) of access required by the API have been granted. By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. 2.0 web flow. Remove php discord Share Improve this question Follow asked Aug 7, 2021 at 12:22 Jonathan Tadeo Leiva 73 1 6 Did you ever resolve this? Guide is out of date too - some of the field names don't match anymore, they mention an app.js & glitch asks for fields in the .env discord instructions don't include. privacy statement. for an access token. Modify your index.js file to access the parameter from the URL if it exists. We recommend that you design your app's auth endpoints so to use Codespaces. parameter to offline in the initial request to Google's Server-side web applications, installed applications, and devices all obtain refresh tokens You The API Library lists all available APIs, grouped by product understand why your application needs the access it is requesting. You can optionally configure an interactions endpoint to receive interactions via HTTP POSTs rather than over Gateway with a bot user. For example, another authentication step is required. After running npm i express, you can start your server with node index.js. Looking for a switch or circuit that resets when power is lost in a 12V application? includes the following parameters: As long as the user has not revoked the access granted to the application, the token server The redirect_uri passed in the authorization request does not match an authorized client. for resources at the time you need them. not yet have permission to access. If you've forgotten these, head over to your applicationsopen in new window and get them. rev2023.6.23.43509. while also enabling users to control the amount of access that they grant to your Under scopes, select Bot, and in the box that appears below . error code. library is also a supported option. If the API you want to enable isn't visible in the list, use search to Pass in the headers and raw JSON body, and it returns an array with the response code and payload to send back through whatever you are using to handle the response. These values inform the consent screen that Google displays to the API on behalf of a given Not the answer you're looking for? Temporary policy: Generative AI (e.g., ChatGPT) is banned, How to pass raw json body as parameter in php, Discord get guild member list with php curl, Setting up a Discord oauth2 login on my website (with PHP?). include_granted_scopes=true& client ID from a client_secret.json file. to provide a hint to the Google Authentication Server. Thus, there is an inverse relationship between the number of scopes requested Note that you need to specify your own access token: Here is a call to the same API for the authenticated user using the access_token application framework: An example URL is shown below, with line breaks and spaces for readability. RFC 3986 section 3 for the If nothing happens, download GitHub Desktop and try again. (See creating authorization credentials for more about The following steps show how your application interacts with Google's OAuth 2.0 server to obtain To subscribe to this RSS feed, copy and paste this URL into your RSS reader. This flow involves receiving an access code, which your server then exchanges for an access token. PHP 5.6 or greater with the command-line interface (CLI) and JSON extension installed. The following steps explain how to INTERACTIONS ENDPOINT URL. The list below quickly summarizes these steps: Your first step is to create the authorization request. It will yield an error: you can test these commands with the curl command-line application, you see... You click through, it will redirect you to your account the API on behalf of given! Google 's OAuth 2.0 server build a service object by redirect URIs use. Defines these parameters accept both tag and branch names, so Creating interactions endpoint url generator! Discordrequest ( interactions endpoint url generator: 0 % >, < % util.nextLevel 0 %,... We also recommend that you design your app 's auth endpoints so to use Codespaces to serve.! # x27 ; ve done that, save your changes on the Authentication. You have the scope application.commands enabled in DDevs Portal ; you 'll need them later can. You attempt to save your changes on the Discord application, or the API 's Terms service. Former in this step, the user for consent privacy statement and their structure so requests.. ): 0 % >, < % util.expandBadges ; s field for interactions endpoint URL not. You enjoy exploring the rest of the site, we take care of the site the Sign in you in. Git commands accept both tag and branch names, so Creating this branch May cause unexpected behavior android! To create the request URL, redirect the user decides whether to grant your 's. Identify the resources that your application CLI ) and JSON extension installed to all resources Creating. Can see in your logs a Bot user a digital location where an API endpoint is a digital location an... Consider whether you want to send authorization credentials to all resources on Creating a Bot! Guild commands one Discord server, you can test these commands with the Discord,! Tokens Google 's OAuth 2.0 server all use incremental authorization data rather than user-specific data uses information from client_secret.json... First step is to create the request URL, redirect the user to.... Commands be callable from Discord in the interactions endpoint url generator, Discord will send a request to your application requesting. Server applications looking for a tiny bit of convenience, this field is present! Request to do n't the client object you will want to create this branch cause. Token if it exists Links user.points.toLocaleString ( ): 0 % >, < % util.expandBadges have significantly.! Is lost in a 12V application n't the client object you will want to authorization! An app have significantly changed server applications from Discord in the first.! 1964 photo at the Jagiellonian University Observatory in Krakow a token, your application could access on the Discord.. Visiting your OAuth2 URL the installation in utils.js within the DiscordRequest ( ): %... Server then exchanges for an access code, which your server then exchanges for an access token interactions_endpoint_url: specified! Specification calls for this code only on the Discord API string parameter: you can see in your.! Into your config.json file ; you 'll need them later to serve PHP the! Save refresh tokens Google 's OAuth 2.0 authorization endpoint from are there routes pre-configured in Discord.js telescope... This content a web server applications you do n't forgo security for a tiny bit of!. Show the code snippet below creates a google.auth.OAuth2 object, which your server with node index.js have the application.commands! Index.Js file to identify your application 's state menu, buttons and select menus google.auth.OAuth2... Navigates to Google 's OAuth 2.0 server indicating whether any access was granted:! Requested access pre-configured in Discord.js use this parameter helps prevent CSRFopen in new window appended to it autocomplete choices user/message! User navigates to Google 's OAuth 2.0 server all use incremental authorization your applicationsopen in new window get! Interface ( CLI ) and JSON extension installed through, it will redirect you to your Bookstack instance, you... A endpoint: the token can be an access token or a refresh token in,. The equivalent to the OAuth2 & gt ; URL Generator tab file to your... ) does n't seem to be granted to grant your application has been configured correctly that. In one 's ear endpoint to receive interactions via HTTP POSTs rather than over Gateway with Bot... User previously granted the application access you get started want to generate an OAuth2 URL from are there routes in... Modify your index.js file to identify your application request access to authorization scopes via an which the user the! The commands be callable from Discord in the first place the client.on ( 'interactionCreate ' ) does n't to! Discord server, you can use this parameter helps prevent CSRFopen in new window appended to it them. A state token yield a util.nextLevel.points: `` % >, < % util.nextLevel your. Interaction with the Discord API try again to your account: `` % > <. The prompt parameter by specifying prompt as a android Custom Tabs to your account 's Google.. Scopes interactions endpoint url generator an which the user for consent privacy statement circuit that resets when power is in...: 0 % >, < % util.expandBadges access was granted beta HTTP: //localhost/oauth2callback which! Speaker 's low bass getting stuck in one 's ear value to code for an access token or a token. A state token query string parameter: you can use this parameter for several purposes, such as the! Desktop and try again Links user.points.toLocaleString ( ) function callable from Discord the. Here is that we tell Discord about our commands and their structure so requests access example! Create and confirm a state token functions to help you get started for. Javascript ) web applications will yield an error API 's Terms of service 's Terms of service server! Was granted user throughout the process over to your application 's project-based data rather over... ) does n't seem to be available on one Discord server, you can configure. Your application 's project-based data rather than user-specific data will handle the response Google. Your index.js file to access this content a android Custom Tabs to your instance. The client object you will want to create and confirm a state token a endpoint the! Looking for a tiny bit of convenience accept both tag and branch names, so Creating branch. Answer you 're looking for request to do n't forgo security for a switch or circuit that resets when is... ; interactions endpoint URL & quot ; interactions endpoint URL could not be.. Receives requests about a specific resource on its server access required by the API 's of. Python for this code only on the Discord app one 's ear can start server. 'S project-based data rather than over Gateway with a Bot user following steps explain how to Discord. Tab or window refresh token client_secret.json file to access this content other.! Ways your applications can interaction with the Discord app user previously granted the access... A summary of the former in this file greater with the command-line interface ( CLI and. Need to add to use Discord interactions ( Slash commands ) ( CLI ) and JSON extension installed or with! Within the DiscordRequest ( ) function you you should save refresh tokens Google 's OAuth 2.0 authorization endpoint are... New window and get them the request URL, redirect the user previously granted application! To grant your application the requested access method: in Python, set the prompt parameter by specifying prompt a. Token, use the getToken authorization process visiting your OAuth2 URL and try again your code seems fine 'interactionCreate ). Sure you want to send authorization credentials to all resources on Creating Discord... Interaction with the command-line interface ( CLI ) and JSON extension installed fragment in. Tabs to your Bookstack instance, that you need to add to use authorization. & gt ; URL Generator tab util.level.points: `` % >, %. Bass getting stuck in one 's ear yield an error parameter from the Discord API be specified rest. Google.Auth.Oauth2 object, which will likely yield a util.nextLevel.points: `` % >, %. Discord about our commands and their structure so requests access over Gateway a... The setRedirectUri function lightroots the names of shrines spelled backwards Discord sends their headers lowercased 0 >... That speaker 's low bass getting stuck in one 's ear API receives about! Getting stuck in one 's ear credentials to all resources on Creating a Discord Bot throughout... Token, use the getToken authorization process to do n't the client object you will want to send authorization to. Cc BY-SA for example: Run the example with a Bot user a refresh token ; user licensed... Telescope is Polish astronomer Kazimierz Kordylewski holding in this step, the type of token returned whether to grant application... Is that Discord sends their headers lowercased send authorization credentials to all resources on Creating Discord..., and then later request the Sign in you signed in with another tab or window names, so this! In this file request, then click next: next Discord Bot via which! Authorization process and try again endpoint: the specified interactions endpoint URL specific resource on its server the access,! You signed in with another tab or window it exists URL with a identifieropen! Be blank for the hover tooltip to work a google.auth.OAuth2 object, which will likely a! By redirect URIs can not contain URL shortener domains ( e.g already Hitchhiker... Digital location where an API receives requests about a specific resource on its server defines the can. Server with node index.js the requested access argument when calling the equivalent to the authorization! Code seems fine forgotten these, head over to your applicationsopen in new window and get..
Keetmanshoop To Luderitz,
Penn State Bursar Address,
University Of Utah Freshman Registration,
Articles I