Create, update, and read Google Forms through a managed OAuth proxy.
Documents
cognito-forms
Try itManage Cognito Forms via managed OAuth — list forms, handle entries, and generate documents through a proxy API.
What it does
Connects to Cognito Forms through a managed OAuth proxy. All requests route through the Maton gateway with a bearer API key in the Authorization header. Supports listing forms, full CRUD on entries (create, read, update, delete via POST/PATCH/DELETE), generating PDF documents from entries using a template number, and retrieving uploaded files. All write operations require explicit user confirmation; access is scoped to the connected Cognito Forms account. Rate limit is 100 requests per 60 seconds.
When to use it
- Listing all forms in a Cognito Forms organization
- Creating, updating, or deleting form entries via API
- Generating PDF documents from a form entry by template number
- Retrieving files uploaded to a form entry
The skill document
Cognito Forms
Access the Cognito Forms API with managed OAuth authentication. List forms, manage entries (create, read, update, delete), and retrieve documents.
Quick Start
# List all forms
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/cognito-forms/api/forms')
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://api.maton.ai/cognito-forms/{native-api-path}
Maton proxies requests to www.cognitoforms.com and automatically injects your OAuth token.
Authentication
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Getting Your API Key
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
Connection Management
Manage your Cognito Forms OAuth connections at https://api.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=cognito-forms&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
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'cognito-forms'}).encode()
req = urllib.request.Request('https://api.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
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2026-02-08T10:39:10.245446Z",
"last_updated_time": "2026-02-09T04:11:08.342101Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "cognito-forms",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
Delete Connection
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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
If you have multiple Cognito Forms connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/cognito-forms/api/forms')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
Security & Permissions
- Access is scoped to forms, entries, and documents within the connected Cognito Forms account.
- All write operations require explicit user approval. Before executing any create, update, or delete call, confirm the target resource and intended effect with the user.
API Reference
Forms
List Forms
GET /cognito-forms/api/forms
Returns all forms in the organization.
Entries
Get Entry
GET /cognito-forms/api/forms/{formId}/entries/{entryId}
Returns a specific entry by ID or entry number.
Create Entry
POST /cognito-forms/api/forms/{formId}/entries
Content-Type: application/json
{
"Name": {
"First": "John",
"Last": "Doe"
},
"Email": "john.doe@example.com",
"Phone": "555-1234"
}
Field names match your form's field names. Complex fields like Name and Address use nested objects.
Update Entry
PATCH /cognito-forms/api/forms/{formId}/entries/{entryId}
Content-Type: application/json
{
"Name": {
"First": "Jane",
"Last": "Doe"
},
"Email": "jane.doe@example.com"
}
Updates an existing entry. Uses PATCH method (not PUT). Fails if the entry includes a paid order.
Delete Entry
DELETE /cognito-forms/api/forms/{formId}/entries/{entryId}
Deletes an entry. Requires Read/Write/Delete API scope.
Documents
Get Document
GET /cognito-forms/api/forms/{formId}/entries/{entryId}/documents/{templateNumber}
Generates and returns a document from an entry using the specified template number.
Response:
{
"Id": "abc123",
"Name": "Entry-Document.pdf",
"ContentType": "application/pdf",
"Size": 12345,
"File": "https://temporary-download-url..."
}
Files
Get File
GET /cognito-forms/api/files/{fileId}
Retrieves a file uploaded to a form entry.
Response:
{
"Id": "file-id",
"Name": "upload.pdf",
"ContentType": "application/pdf",
"Size": 54321,
"File": "https://temporary-download-url..."
}
Field Format Examples
Name Fields
{
"Name": {
"First": "John",
"Last": "Doe"
}
}
Address Fields
{
"Address": {
"Line1": "123 Main St",
"Line2": "Suite 100",
"City": "San Francisco",
"State": "CA",
"PostalCode": "94105"
}
}
Choice Fields
Single choice:
{
"PreferredContact": "Email"
}
Multiple choice:
{
"Interests": ["Sports", "Music", "Travel"]
}
Code Examples
JavaScript
const response = await fetch(
'https://api.maton.ai/cognito-forms/api/forms',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const forms = await response.json();
Python
import os
import requests
response = requests.get(
'https://api.maton.ai/cognito-forms/api/forms',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
forms = response.json()
Create Entry Example (Python)
import os
import requests
entry_data = {
"Name": {"First": "John", "Last": "Doe"},
"Email": "john@example.com",
"Message": "Hello from the API!"
}
response = requests.post(
'https://api.maton.ai/cognito-forms/api/forms/ContactForm/entries',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'Content-Type': 'application/json'
},
json=entry_data
)
Notes
- List Entries: The Cognito Forms API does not support bulk listing of all entries. Use webhooks or OData for syncing entries.
- Get Form: Returns 404 - use List Forms to get form information instead.
- Form Availability: This endpoint may not be available depending on your Cognito Forms plan.
- Entry IDs can be either the entry number or entry ID (format:
{formId}-{entryNumber}) - Complex fields (Name, Address) use nested JSON objects
- File uploads return temporary download URLs
- Document generation creates PDFs from form templates
- API scopes control access: Read, Read/Write, or Read/Write/Delete
- IMPORTANT: When using curl commands, use
curl -gwhen URLs contain brackets to disable glob parsing - IMPORTANT: When piping curl output to
jqor other commands, environment variables like$MATON_API_KEYmay not expand correctly in some shell environments
Error Handling
| Status | Meaning |
|---|---|
| 400 | Missing Cognito Forms connection |
| 401 | Invalid or missing Maton API key |
| 404 | Form or entry not found |
| 429 | Rate limited (100 requests per 60 seconds) |
| 4xx/5xx | Passthrough error from Cognito Forms API |
Troubleshooting: API Key Issues
- Check that the
MATON_API_KEYenvironment variable is set:
echo $MATON_API_KEY
- Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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
- Ensure your URL path starts with
cognito-forms. For example:
- Correct:
https://api.maton.ai/cognito-forms/api/forms - Incorrect:
https://api.maton.ai/api/forms
Resources
Questions people ask
- How does authentication work?
- Set MATON_API_KEY as an environment variable and send it as a Bearer token. OAuth consent is completed by opening the URL returned from the connection create endpoint.
- Can I bulk-list all entries for a form?
- No. The Cognito Forms API does not support bulk listing of entries — use webhooks or OData to sync entries instead.
- What are the rate limits?
- 100 requests per 60 seconds; exceeding the limit returns HTTP 429.
Related skills
Call the JotForm API through a managed OAuth proxy to read and write forms, submissions, and webhooks.
Read and manage Typeform forms, responses, workspaces, and insights through a managed OAuth gateway.
Manage Coda docs, pages, tables, rows, formulas, and controls via an OAuth-managed API gateway.
Manage Tally forms, submissions, workspaces, webhooks, organization users, and invites via the Tally API.
Connect to Airtable via a managed OAuth gateway for full CRUD on bases, tables, and records.