openapi: 3.1.0 info: version: v1 title: MongoDB Atlas Data API description: | A fully-managed API to read, write, and aggregate data in MongoDB Atlas. The Data API is powered by serverless Atlas Functions and secured with user authentication and role-based permissions. To learn more about the Data API, see [Atlas Data API](https://www.mongodb.com/docs/atlas/app-services/data-api/). ## Set Up the Data API Before you can use the Data API, you must enable and configure it in an Atlas App Services App. The configuration controls how the App's users authenticate, authorize requests, and interact with the API. To learn how to start using the Data API in your App, see [Set up the Data API](https://www.mongodb.com/docs/atlas/app-services/data-api/generated-endpoints/#set-up-the-data-api). ## Authenticate Requests Your Data API configuration in App Services controls how users authenticate their API requests. In most cases, you will use Application authentication, which lets users log in with one of the App's authentication providers. Users can either provide their login credentials directly in every request or provide a reusable access token for an authenticated session. To learn more, see [Authenticate Data API Requests](https://www.mongodb.com/docs/atlas/app-services/data-api/authenticate/). servers: - description: Global App url: https://data.mongodb-api.com/app/{appId}/endpoint/data/v1 variables: appId: description: Your App's Client App ID. default: your-app-id - description: Local App url: https://{region}.data.mongodb-api.com/app/{appId}/endpoint/data/v1 variables: appId: description: Your App's Client App ID. default: your-app-id region: description: | The sub-domain for the cloud region where your App is deployed. Uses the format `.`. For example, `us-east-1.aws` or `eastus2.azure`. To learn more about deployment regions, see [Deployment Models & Regions](https://www.mongodb.com/docs/atlas/app-services/apps/deployment-models-and-regions/). default: us-east-1.aws enum: - us-east-1.aws - us-east-2.aws - us-west-2.aws - eu-central-1.aws - eu-west-1.aws - eu-west-2.aws - ap-southeast-1.aws - ap-southeast-2.aws - ap-south-1.aws - sa-east-1.aws - eastus2.azure - westus.azure - westeurope.azure - eastasia.azure - southeastasia.azure - us-central1.gcp - us-east4.gcp - us-west1.gcp - europe-west1.gcp - asia-south1.gcp security: - AccessToken: [] - Email: [] Password: [] - ApiKey: [] - CustomJwt: [] paths: /action/findOne: post: operationId: findOne summary: Find One Document description: Find a single document that matches a query. x-codeSamples: - lang: cURL label: cURL source: | curl -s "https://data.mongodb-api.com/app/$CLIENT_APP_ID/endpoint/data/v1/action/findOne" \ -X POST \ -H "apiKey: $API_KEY" \ -H 'Content-Type: application/ejson' \ -H "Accept: application/json" \ -d '{ "dataSource": "mongodb-atlas", "database": "learn-data-api", "collection": "tasks", "filter": { "text": "Do the dishes" } }' requestBody: content: application/json: schema: allOf: - $ref: '#/components/schemas/FindOneRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: text: Do the dishes projection: status: 1 text: 1 application/ejson: schema: allOf: - $ref: '#/components/schemas/FindOneRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: text: Do the dishes projection: status: 1 text: 1 responses: '200': description: Found content: application/json: schema: $ref: '#/components/schemas/FindOneResponseBody' example: document: _id: 6193504e1be4ab27791c8133 status: open text: Do the dishes application/ejson: schema: $ref: '#/components/schemas/FindOneResponseBody' example: document: _id: $oid: 6193504e1be4ab27791c8133 status: open text: Do the dishes '400': description: Bad Request $ref: '#/components/responses/BadRequestError' '401': description: Unauthorized $ref: '#/components/responses/UnauthorizedRequestError' /action/find: post: operationId: find summary: Find Documents description: Find multiple documents that match a query. x-codeSamples: - lang: cURL label: cURL source: | curl -s "https://data.mongodb-api.com/app/$CLIENT_APP_ID/endpoint/data/v1/action/find" \ -X POST \ -H "apiKey: $API_KEY" \ -H 'Content-Type: application/ejson' \ -H "Accept: application/json" \ -d '{ "dataSource": "mongodb-atlas", "database": "learn-data-api", "collection": "tasks", "filter": { "status": "complete" }, "sort": { "completedAt": 1 }, "limit": 10 }' requestBody: content: application/json: schema: allOf: - $ref: '#/components/schemas/FindManyRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: status: complete projection: text: 1 completedAt: 1 sort: completedAt: 1 limit: 10 application/ejson: schema: allOf: - $ref: '#/components/schemas/FindManyRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: status: complete projection: text: 1 completedAt: 1 sort: completedAt: 1 limit: 10 responses: '200': description: Found content: application/json: schema: $ref: '#/components/schemas/FindManyResponseBody' example: documents: - _id: 6193504e1be4ab27791c8133 text: Do the dishes completedAt: '2022-05-16T20:22:01.104Z' - _id: 6194604e1d38dc33792d8257 text: Feed the dog completedAt: '2022-05-17T05:12:42.828Z' application/ejson: schema: $ref: '#/components/schemas/FindManyResponseBody' example: documents: - _id: $oid: 6193504e1be4ab27791c8133 text: Do the dishes completedAt: $date: $numberLong: '1652732521104' - _id: $oid: 6194604e1d38dc33792d8257 text: Feed the dog completedAt: $date: $numberLong: '1652764362828' '400': description: Bad Request $ref: '#/components/responses/BadRequestError' '401': description: Unauthorized $ref: '#/components/responses/UnauthorizedRequestError' /action/insertOne: post: operationId: insertOne summary: Insert One Document description: Insert a single document into a collection. x-codeSamples: - lang: cURL label: cURL source: | curl -s "https://data.mongodb-api.com/app/$CLIENT_APP_ID/endpoint/data/v1/action/insertOne" \ -X POST \ -H "apiKey: $API_KEY" \ -H 'Content-Type: application/ejson' \ -H "Accept: application/json" \ -d '{ "dataSource": "mongodb-atlas", "database": "learn-data-api", "collection": "tasks", "document": { "status": "open", "text": "Do the dishes" } }' requestBody: content: application/json: schema: allOf: - $ref: '#/components/schemas/InsertOneRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks document: status: open${{ env.BUNDLED_SPEC_FILEPATH }} text: Do the dishes application/ejson: schema: allOf: - $ref: '#/components/schemas/InsertOneRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks document: status: open text: Do the dishes responses: '200': description: Inserted content: application/json: schema: allOf: - $ref: '#/components/schemas/InsertOneResponseBody' - properties: insertedId: type: string example: insertedId: 6193504e1be4ab27791c8133 application/ejson: schema: allOf: - $ref: '#/components/schemas/InsertOneResponseBody' - properties: insertedId: type: object example: insertedId: $oid: 6193504e1be4ab27791c8133 '400': description: Bad Request $ref: '#/components/responses/BadRequestError' '401': description: Unauthorized $ref: '#/components/responses/UnauthorizedRequestError' /action/insertMany: post: operationId: insertMany summary: Insert Documents description: Insert multiple documents into a collection. x-codeSamples: - lang: cURL label: cURL source: | curl -s "https://data.mongodb-api.com/app/$CLIENT_APP_ID/endpoint/data/v1/action/insertMany" \ -X POST \ -H "apiKey: $API_KEY" \ -H 'Content-Type: application/ejson' \ -H "Accept: application/json" \ -d '{ "dataSource": "mongodb-atlas", "database": "learn-data-api", "collection": "tasks", "documents": [ { "status": "open", "text": "Mop the floor" }, { "status": "open", "text": "Clean the windows" } ] }' requestBody: content: application/json: schema: allOf: - $ref: '#/components/schemas/InsertManyRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks documents: - status: open text: Mop the floor - status: open text: Clean the windows application/ejson: schema: allOf: - $ref: '#/components/schemas/InsertManyRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks documents: - status: open text: Mop the floor - status: open text: Clean the windows responses: '200': description: Inserted content: application/json: schema: allOf: - $ref: '#/components/schemas/InsertManyResponseBody' - properties: insertedIds: type: array items: type: string example: insertedIds: - 61935189ec53247016a623c9 - 61935189ec53247016a623ca application/ejson: schema: allOf: - $ref: '#/components/schemas/InsertManyResponseBody' - properties: insertedIds: type: array items: type: object example: insertedIds: - $oid: 61935189ec53247016a623c9 - $oid: 61935189ec53247016a623ca '400': description: Bad Request $ref: '#/components/responses/BadRequestError' '401': description: Unauthorized $ref: '#/components/responses/UnauthorizedRequestError' /action/updateOne: post: operationId: updateOne summary: Update One Document description: Update a single document in a collection. x-codeSamples: - lang: cURL label: cURL source: | curl -s "https://data.mongodb-api.com/app/$CLIENT_APP_ID/endpoint/data/v1/action/updateOne" \ -X POST \ -H "apiKey: $API_KEY" \ -H 'Content-Type: application/ejson' \ -H "Accept: application/json" \ -d '{ "dataSource": "mongodb-atlas", "database": "learn-data-api", "collection": "tasks", "filter": { "_id": { "$oid": "64224f4d089104f1766116a5" } }, "update": { "$set": { "status": "complete", "completedAt": { "$date": { "$numberLong": "1680105272788" } } } } }' requestBody: content: application/json: schema: allOf: - $ref: '#/components/schemas/UpdateRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: _id: $oid: 642f1bb5cee4111898828bf6 update: $set: status: complete upsert: false application/ejson: schema: allOf: - $ref: '#/components/schemas/UpdateRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: _id: $oid: 642f1bb5cee4111898828bf6 update: $set: status: complete upsert: false responses: '200': description: Updated content: application/json: schema: allOf: - $ref: '#/components/schemas/UpdateResponseBody' - properties: matchedCount: type: number modifiedCount: type: number example: matchedCount: 1 modifiedCount: 1 application/ejson: schema: allOf: - $ref: '#/components/schemas/UpdateResponseBody' - properties: matchedCount: type: object modifiedCount: type: object example: matchedCount: $numberInt: '1' modifiedCount: $numberInt: '1' '400': description: Bad Request $ref: '#/components/responses/BadRequestError' '401': description: Unauthorized $ref: '#/components/responses/UnauthorizedRequestError' /action/updateMany: post: operationId: updateMany summary: Update Documents description: Update multiple documents in a collection. x-codeSamples: - lang: cURL label: cURL source: | curl -s "https://data.mongodb-api.com/app/$CLIENT_APP_ID/endpoint/data/v1/action/updateMany" \ -X POST \ -H "apiKey: $API_KEY" \ -H 'Content-Type: application/ejson' \ -H "Accept: application/json" \ -d '{ "dataSource": "mongodb-atlas", "database": "learn-data-api", "collection": "tasks", "filter": { "status": "open" }, "update": { "$set": { "status": "complete", "completedAt": { "$date": { "$numberLong": "1680105287069" } } } } }' requestBody: content: application/json: schema: allOf: - $ref: '#/components/schemas/UpdateRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: status: open update: $set: status: complete application/ejson: schema: allOf: - $ref: '#/components/schemas/UpdateRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: status: open update: $set: status: complete responses: '200': description: Updated content: application/json: schema: allOf: - $ref: '#/components/schemas/UpdateResponseBody' - properties: matchedCount: type: number modifiedCount: type: number example: matchedCount: 12 modifiedCount: 12 application/ejson: schema: allOf: - $ref: '#/components/schemas/UpdateResponseBody' - properties: matchedCount: type: object modifiedCount: type: object example: matchedCount: $numberInt: '12' modifiedCount: $numberInt: '12' '400': description: Bad Request $ref: '#/components/responses/BadRequestError' '401': description: Unauthorized $ref: '#/components/responses/UnauthorizedRequestError' /action/deleteOne: post: operationId: deleteOne summary: Delete One Document description: Delete a single document that matches a query. x-codeSamples: - lang: cURL label: cURL source: | curl -s "https://data.mongodb-api.com/app/$CLIENT_APP_ID/endpoint/data/v1/action/deleteOne" \ -X POST \ -H "apiKey: $API_KEY" \ -H 'Content-Type: application/ejson' \ -H "Accept: application/json" \ -d '{ "dataSource": "mongodb-atlas", "database": "learn-data-api", "collection": "tasks", "filter": { "_id": { "$oid": "64224f3cd79f54ad342dd9b2" } } }' requestBody: content: application/json: schema: allOf: - $ref: '#/components/schemas/DeleteRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: text: Do the dishes application/ejson: schema: allOf: - $ref: '#/components/schemas/DeleteRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: text: Do the dishes responses: '200': description: Deleted content: application/json: schema: allOf: - $ref: '#/components/schemas/DeleteResponseBody' - properties: deletedCount: type: number example: deletedCount: 1 application/ejson: schema: allOf: - $ref: '#/components/schemas/DeleteResponseBody' - properties: deletedCount: type: object example: deletedCount: $numberInt: 1 '400': description: Bad Request $ref: '#/components/responses/BadRequestError' '401': description: Unauthorized $ref: '#/components/responses/UnauthorizedRequestError' /action/deleteMany: post: operationId: deleteMany summary: Delete Documents description: Delete multiple documents that match a query. x-codeSamples: - lang: cURL label: cURL source: | curl -s "https://data.mongodb-api.com/app/$CLIENT_APP_ID/endpoint/data/v1/action/deleteMany" \ -X POST \ -H "apiKey: $API_KEY" \ -H 'Content-Type: application/ejson' \ -H "Accept: application/json" \ -d '{ "dataSource": "mongodb-atlas", "database": "learn-data-api", "collection": "tasks", "filter": { "status": "complete" } }' requestBody: content: application/json: schema: allOf: - $ref: '#/components/schemas/DeleteRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: status: complete application/ejson: schema: allOf: - $ref: '#/components/schemas/DeleteRequestBody' example: dataSource: mongodb-atlas database: todo collection: tasks filter: status: complete responses: '200': description: Deleted content: application/json: schema: allOf: - $ref: '#/components/schemas/DeleteResponseBody' - properties: deletedCount: type: number example: deletedCount: 12 application/ejson: schema: allOf: - $ref: '#/components/schemas/DeleteResponseBody' - properties: deletedCount: type: object example: deletedCount: $numberInt: 12 '400': description: Bad Request $ref: '#/components/responses/BadRequestError' '401': description: Unauthorized $ref: '#/components/responses/UnauthorizedRequestError' /action/aggregate: post: operationId: aggregate summary: Aggregate Documents description: Run an aggregation pipeline. x-codeSamples: - lang: cURL label: cURL source: | curl -s "https://data.mongodb-api.com/app/$CLIENT_APP_ID/endpoint/data/v1/action/aggregate" \ -X POST \ -H "apiKey: $API_KEY" \ -H 'Content-Type: application/ejson' \ -H "Accept: application/json" \ -d '{ "dataSource": "mongodb-atlas", "database": "learn-data-api", "collection": "tasks", "pipeline": [ { "$match": { "status": "complete" } }, { "$group": { "_id": "$status", "count": { "$sum": 1 }, "tasks": { "$push": "$text" } } }, { "$sort": { "count": -1 } } ] }' requestBody: content: application/json: schema: allOf: - $ref: '#/components/schemas/AggregateRequestBody' example: - $groupBy: _id: $status count: $sum: 1 tasks: $push: $text - $sort: count: 1 application/ejson: schema: allOf: - $ref: '#/components/schemas/AggregateRequestBody' example: - $groupBy: _id: $status count: $sum: 1 tasks: $push: $text - $sort: count: 1 responses: '200': description: Success content: application/json: schema: allOf: - $ref: '#/components/schemas/AggregateResponseBody' example: - $groupBy: _id: $status count: $sum: 1 tasks: $push: $text - $sort: count: 1 application/ejson: schema: allOf: - $ref: '#/components/schemas/AggregateResponseBody' example: - $groupBy: _id: $status count: $sum: 1 tasks: $push: $text - $sort: count: 1 '400': description: Bad Request $ref: '#/components/responses/BadRequestError' '401': description: Unauthorized $ref: '#/components/responses/UnauthorizedRequestError' components: securitySchemes: AccessToken: type: apiKey in: header name: Authorization description: |- A [user access token](https://www.mongodb.com/docs/atlas/app-services/users/sessions/) specified as a Bearer token in the Authorization header. **Example:** `Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...` Email: type: apiKey in: header name: email description: |- A registered email/password user's email address. Must be used together with the ``password`` header. **Example:** `email: someone@example.com` Password: type: apiKey in: header name: password description: |- A registered email/password user's password. Must be used together with the ``email`` header. **Example:** `password: Pa55w0rd!` ApiKey: type: apiKey in: header name: apiKey description: |- A server or user API key. **Example:** `apiKey: A1g70fN7oKMNCnDRNeyou20Wd24rD6QNmXWYMPwz0SnDRQRQSYwGPdC3y44aJN3H` CustomJwt: type: apiKey in: header name: jwtTokenString description: |- A custom JSON web token string that the App is configured to support. **Example:** `jwtTokenString: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJteWFwcC1hYmNkZSIsInN1YiI6IjY0MzZlMDZiZGU1YzQ2ZGQ5MTQwZWFlOSIsIm5hbWUiOiJKb2huIERvZSIsImlhdCI6MTUxNjIzOTAyMn0.Y_6JR4ocrqoCEY3yOZlEqhxtAsSpvlzrXc9uvTSJA0k` schemas: Namespace: type: object required: - dataSource - database - collection properties: dataSource: type: string description: | The name of a linked MongoDB Atlas data source. This is commonly `"mongodb-atlas"` though it may be different in your App if you chose a different name when you created the data source. database: type: string description: The name of a database in the specified data source. collection: type: string description: The name of a collection in the specified database. Filter: type: object properties: filter: type: object description: A MongoDB query filter that matches documents. For a list of all query operators that the Data API supports, see [Query Operators](https://www.mongodb.com/docs/atlas/app-services/mongodb/crud-and-aggregation-apis/#query-operators). Projection: type: object properties: projection: type: object additionalProperties: type: number enum: - 0 - 1 description: A [MongoDB projection](https://www.mongodb.com/docs/manual/tutorial/project-fields-from-query-results/) for matched documents returned by the operation. FindOneRequestBody: title: FindOneRequestBody required: - filter allOf: - $ref: '#/components/schemas/Namespace' - $ref: '#/components/schemas/Filter' - $ref: '#/components/schemas/Projection' FindOneResponseBody: title: FindOneResponseBody type: object description: The result of a findOne operation. properties: document: type: - object - 'null' description: A document that matches the specified filter. If no documents match, this is `null`. Error: type: object properties: error: type: string description: A message that describes the error. error_code: type: string description: The error type. link: type: string description: A link to a [log entry](https://www.mongodb.com/docs/atlas/app-services/logs/endpoint/) for the failed operation. ErrorNoAuthenticationSpecified: description: |- Indicates that the request did not include any authentication credentials. allOf: - $ref: '#/components/schemas/Error' - properties: error: const: no authentication methods were specified error_code: const: InvalidParameter ErrorMissingAuthenticationParameter: description: |- Indicates that an authentication parameter is missing from the request body or headers. For example, the request might include an `email` header but no corresponding `password` header. allOf: - $ref: '#/components/schemas/Error' - properties: error: const: must specify some form of authentication (either email+password, api-key, or jwt) in the request header or body error_code: const: MissingParameter ErrorUserNotFound: description: |- Indicates that no user matched the provided authentication credentials. allOf: - $ref: '#/components/schemas/Error' - properties: error: const: 'invalid session: error finding user for endpoint' error_code: const: InvalidSession Sort: type: object properties: sort: type: object description: A [MongoDB sort expression](https://www.mongodb.com/docs/manual/reference/method/cursor.sort/) that indicates sorted field names and directions. Limit: type: object properties: limit: type: number description: The maximum number of matching documents to include the in the response. Skip: type: object properties: skip: type: number description: The number of matching documents to omit from the response. FindManyRequestBody: title: FindManyRequestBody required: - filter allOf: - $ref: '#/components/schemas/Namespace' - $ref: '#/components/schemas/Filter' - $ref: '#/components/schemas/Projection' - $ref: '#/components/schemas/Sort' - $ref: '#/components/schemas/Limit' - $ref: '#/components/schemas/Skip' FindManyResponseBody: title: FindManyResponseBody type: object description: The result of a find operation. properties: documents: type: array items: type: object description: A list of documents that match the specified filter. InsertOneRequestBody: title: InsertOneRequestBody allOf: - $ref: '#/components/schemas/Namespace' - type: object required: - document properties: document: type: object description: A document to insert into the collection. InsertOneResponseBody: title: InsertOneResponseBody description: The result of an insertOne operation. type: object properties: insertedId: description: The `_id` value of the inserted document. InsertManyRequestBody: title: InsertManyRequestBody allOf: - $ref: '#/components/schemas/Namespace' - type: object required: - documents properties: documents: type: array items: type: object description: A list of documents to insert into the collection. InsertManyResponseBody: title: InsertManyResponseBody description: The result of an insertMany operation. type: object properties: insertedIds: type: array description: A list of the `_id` values of the inserted documents. items: type: string description: The `_id` value of an inserted document. UpdateRequestBody: title: UpdateRequestBody allOf: - $ref: '#/components/schemas/Namespace' - $ref: '#/components/schemas/Filter' - type: object required: - filter - update properties: update: type: object description: A MongoDB update expression to apply to matching documents. For a list of all update operators that the Data API supports, see [Update Operators](https://www.mongodb.com/docs/atlas/app-services/mongodb/crud-and-aggregation-apis/#update-operators). upsert: type: boolean default: false description: | When `true`, if the update filter does not match any existing documents, then insert a new document based on the filter and the specified update operation. UpdateResponseBody: title: UpdateResponseBody type: object required: - matchedCount - modifiedCount properties: matchedCount: description: The number of documents matched by the query filter. modifiedCount: description: The number of matched documents that were modified. upsertedId: type: string description: The `_id` value of the upserted document. DeleteRequestBody: title: DeleteRequestBody allOf: - $ref: '#/components/schemas/Namespace' - $ref: '#/components/schemas/Filter' DeleteResponseBody: title: DeleteResponseBody type: object required: - deletedCount properties: deletedCount: description: The number of documents that were deleted. AggregateRequestBody: title: AggregateRequestBody required: - pipeline allOf: - $ref: '#/components/schemas/Namespace' - properties: pipeline: type: array description: An array of aggregation stages. items: type: object description: A MongoDB aggregation stage. For a list of all aggregation stages that the Data API supports, see [Aggregation Pipeline Stage Availability](https://www.mongodb.com/docs/atlas/app-services/mongodb/crud-and-aggregation-apis/#aggregation). AggregateResponseBody: title: AggregateResponseBody required: - documents properties: documents: description: An array that contains the result set of the aggregation. type: array items: type: object description: A document included in the result set of the aggregation. responses: BadRequestError: description: The request was malformed or incomplete. content: application/json: schema: oneOf: - $ref: '#/components/schemas/ErrorNoAuthenticationSpecified' - $ref: '#/components/schemas/ErrorMissingAuthenticationParameter' UnauthorizedRequestError: description: The authenticated user does not have permission to access this endpoint. content: application/json: schema: $ref: '#/components/schemas/ErrorUserNotFound'