介绍
# Salesforce
通过托管的 OAuth 身份验证访问 Salesforce REST API。使用 SOQL 查询记录,管理 sObjects,并对您的 Salesforce 数据执行 CRUD 操作。
## Quick Start
```bash # Query contacts python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/salesforce/services/data/v59.0/query?q=SELECT+Id,Name,Email+FROM+Contact+LIMIT+10') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF ```
## Base URL
``` https://gateway.maton.ai/salesforce/{native-api-path} ```
将 `{native-api-path}` 替换为实际的 Salesforce REST API 端点路径。网关将请求代理到 `{instance}.salesforce.com`(自动替换为您的连接配置)并注入您的访问令牌。
## Authentication
所有请求都需要在 Authorization 头中包含 Maton API 密钥:
``` Authorization: Bearer $MATON_API_KEY ```
**Environment Variable:** 将您的 API 密钥设置为 `MATON_API_KEY`:
```bash export MATON_API_KEY="YOUR_API_KEY" ```
### Getting Your API Key
1. 在 [maton.ai](https://maton.ai) 登录或创建账户 2. 前往 [maton.ai/settings](https://maton.ai/settings) 3. 复制您的 API 密钥
## Connection Management
在 `https://ctrl.maton.ai` 管理您的 Salesforce OAuth 连接。
### List Connections
```bash python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections?app=salesforce&status=ACTIVE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF ```
### Create Connection
```bash python <<'EOF' import urllib.request, os, json data = json.dumps({'app': 'salesforce'}).encode() req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF ```
### Get Connection
```bash python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF ```
**Response:** ```json { "connection": { "connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80", "status": "ACTIVE", "creation_time": "2025-12-08T07:20:53.488460Z", "last_updated_time": "2026-01-31T20:03:32.593153Z", "url": "https://connect.maton.ai/?session_token=...", "app": "salesforce", "metadata": {} } } ```
在浏览器中打开返回的 `url` 以完成 OAuth 授权。
### Delete Connection
```bash python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF ```
### Specifying Connection
如果您有多个 Salesforce 连接,请使用 `Maton-Connection` 头指定使用哪一个:
```bash python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://gateway.maton.ai/salesforce/services/data/v59.0/sobjects') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF ```
如果省略,网关将使用默认(最旧)的活动连接。
## API Reference
### SOQL Query
```bash GET /salesforce/services/data/v59.0/query?q=SELECT+Id,Name+FROM+Contact+LIMIT+10 ```
复杂查询:
```bash GET /salesforce/services/data/v59.0/query?q=SELECT+Id,Name,Email+FROM+Contact+WHERE+Email+LIKE+'%example.com'+ORDER+BY+CreatedDate+DESC ```
### Get Object
```bash GET /salesforce/services/data/v59.0/sobjects/{objectType}/{recordId} ```
示例:
```bash GET /salesforce/services/data/v59.0/sobjects/Contact/003XXXXXXXXXXXXXXX ```
### Create Object
```bash POST /salesforce/services/data/v59.0/sobjects/{objectType} Content-Type: application/json
{ "FirstName": "John", "LastName": "Doe", "Email": "[email protected]" } ```
### Update Object
```bash PATCH /salesforce/services/data/v59.0/sobjects/{objectType}/{recordId} Content-Type: application/json
{ "Phone": "+1234567890" } ```
### Delete Object
```bash DELETE /salesforce/services/data/v59.0/sobjects/{objectType}/{recordId} ```
### Describe Object (get schema)
```bash GET /salesforce/services/data/v59.0/sobjects/{objectType}/describe ```
### List Objects
```bash GET /salesforce/services/data/v59.0/sobjects ```
### Search (SOSL)
```bash GET /salesforce/services/data/v59.0/search?q=FIND+{searchTerm}+IN+ALL+FIELDS+RETURNING+Contact(Id,Name) ```
### Composite Request (batch multiple operations)
```bash POST /salesforce/services/data/v59.0/composite Content-Type: application/json
{ "compositeRequest": [ { "method": "GET", "url": "/services/data/v59.0/sobjects/Contact/003XXXXXXX", "referenceId": "contact1" }, { "method": "GET", "url": "/services/data/v59.0/sobjects/Account/001XXXXXXX", "referenceId": "account1" } ] } ```
### Composite Batch Request
```bash POST /salesforce/services/data/v59.0/composite/batch Content-Type: application/json
{ "batchRequests": [ {"method": "GET", "url": "v59.0/sobjects/Contact/003XXXXXXX"}, {"method": "GET", "url": "v59.0/sobjects/Account/001XXXXXXX"} ] } ```
### sObject Collections Create (batch create)
```bash POST /salesforce/services/data/v59.0/composite/sobjects Content-Type: application/json
{ "allOrNone": true, "records": [ {"attributes": {"type": "Contact"}, "FirstName": "John", "LastName": "Doe"}, {"attributes": {"type": "Contact"}, "FirstName": "Jane", "LastName": "Smith"} ] } ```
### sObject Collections Delete (batch delete)
```bash DELETE /salesforce/services/data/v59.0/composite/sobjects?ids=003XXXXX,003YYYYY&allOrNone=true ```
### Get Updated Records
```bash GET /salesforce/services/data/v59.0/sobjects/{objectType}/updated/?start=2026-01-30T00:00:00Z&end=2026-02-01T00:00:00Z ```
### Get Deleted Records
```bash GET /salesforce/services/data/v59.0/sobjects/{objectType}/deleted/?start=2026-01-30T00:00:00Z&end=2026-02-01T00:00:00Z ```
### Get API Limits
```bash GET /salesforce/services/data/v59.0/limits ```
### List API Versions
```bash GET /salesforce/services/data/ ```
## Common Objects
- `Account` - 公司/组织 - `Contact` - 与账户关联的人员 - `Lead` - 潜在客户 - `Opportunity` - 销售机会 - `Case` - 支持案例 - `Task` - 待办事项 - `Event` - 日历事件
## Code Examples
### JavaScript
```javascript const response = await fetch( 'https://gateway.maton.ai/salesforce/services/data/v59.0/query?q=SELECT+Id,Name+FROM+Contact+LIMIT+5', { headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` } } ); const data = await response.json(); ```
### Python
```python import os import requests
response = requests.get( 'https://gateway.maton.ai/salesforce/services/data/v59.0/query', headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}, params={'q': 'SELECT Id,Name FROM Contact LIMIT 5'} ) ```
## Notes
- 对 SOQL 查询使用 URL 编码(空格变为 `+`) - 记录 ID 是 15 或 18 个字符的字母数字字符串 - API 版本(v59.0)可以调整;最新版本为 v65.0 - 更新和删除操作成功时返回 HTTP 204(无内容) - 更新/删除查询的日期使用 ISO 8601 格式:`YYYY-MM-DDTHH:MM:SSZ` - 在批量操作中使用 `allOrNone: true` 以实现原子事务 - 重要提示:使用 curl 命令时,如果 URL 包含括号(`fields[]`、`sort[]`、`records[]`),请使用 `curl -g` 以禁用 glob 解析 - 重要提示:当将 curl 输出通过管道传递给 `jq` 或其他命令时,在某些 shell 环境中,`$MATON_API_KEY` 等环境变量可能无法正确展开。进行管道传输时,您可能会遇到“Invalid API key”(无效的 API 密钥)错误。
## Error Handling
| Status | Meaning | |--------|---------| | 400 | 缺少 Salesforce 连接 | | 401 | Maton API 密钥无效或缺失 | | 429 | 速率受限(每个账户每秒 10 次请求)| | 4xx/5xx | 来自 Salesforce API 的透传错误 |
### Troubleshooting: API Key Issues
1. 检查是否设置了 `MATON_API_KEY` 环境变量:
```bash echo $MATON_API_KEY ```
2. 通过列出连接来验证 API 密钥是否有效:
```bash python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF ```
### Troubleshooting: Invalid App Name
1. 确保您的 URL 路径以 `salesforce` 开头。例如:
- 正确:`https://gateway.maton.ai/salesforce/services/data/v59.0/query` - 错误:`https://gateway.maton.ai/services/data/v59.0/query`
## Resources
- [REST API Developer Guide](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_rest.htm) - [List sObjects](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_describeGlobal.htm) - [Describe sObject](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_sobject_describe.htm) - [Get Record](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_sobject_retrieve_get.htm) - [Create Record](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_create.htm) - [Update Record](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_update_fields.htm) - [Delete Record](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_delete_record.htm) - [Query Records (SOQL)](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_query.htm) - [Composite Request](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_composite_composite_post.htm) - [sObject Collections](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_composite_sobjects_collections_create.htm) - [SOQL Reference](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql.htm) - [SOSL Reference](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_sosl.htm) - [Maton Community](https://discord.com/invite/dBfFAcefs2) - [Maton Support](mailto:[email protected])