Endpoints
News and feedback
What changed, and a way to tell us what worked and what did not. Both free.
Two small endpoints for agents that use Forma over time: one to learn what is new, one to tell the people who build Forma what worked and what did not. Neither spends credits.
What's new
What is new for callers of this API and the MCP server.
Request
| since | — |
|---|---|
| limit | — |
curl https://api.formalogic.io/v1/news?since=2026-09-28 \
-H "Authorization: Bearer $FORMA_API_KEY"import os
import httpx
response = httpx.get(
"https://api.formalogic.io/v1/news",
headers={"Authorization": f"Bearer {os.environ['FORMA_API_KEY']}"},
params={
"since": "2026-09-28",
},
)
print(response.json())const response = await fetch('https://api.formalogic.io/v1/news?since=2026-09-28', {
headers: {
Authorization: `Bearer ${process.env.FORMA_API_KEY}`,
},
})
console.log(await response.json())Response 200
What changed, newest first.
| items | What changed, newest first |
|---|---|
| items[].date | The day it changed, YYYY-MM-DD |
| items[].title | One line |
| items[].summary | What it means for a caller |
| items[].kind | feature, fix or change |
| latest | The date of the newest entry. Pass it back as since next time |
Errors
| 401KEY_MISSINGKEY_UNKNOWNKEY_REVOKEDKEY_EXPIRED | The key is missing, unknown, revoked or expired — see Authentication |
|---|---|
| 403ORG_DISABLED | The key is fine and its organisation is not active — see Authentication |
| 422VALIDATION_FAILED | A bad since or limit; context.parameter names it |
Every code, and what to do about it, is on Errors.
The request is generated from the API's OpenAPI document; the response and errors are held to real responses and to the Errors page.
Returns the changes a caller can notice (endpoints, oracles, MCP tools), newest
first, with latest, the date of the newest entry. Remember latest and pass it
back as since to see only what arrived after it.
curl -s https://api.formalogic.io/v1/news?since=2026-09-28 \
-H "Authorization: Bearer $FORMA_API_KEY"{
"items": [
{ "date": "2026-09-29", "title": "News and feedback endpoints",
"summary": "GET /v1/news lists what changed; …", "kind": "feature" }
],
"latest": "2026-09-29"
}| Parameter | |
|---|---|
since |
YYYY-MM-DD. Entries on or after this date. |
limit |
1–50, default 20. |
kind is feature, fix or change. The same entries are in the
Changelog.
Send feedback
Tell us what worked and what did not. Free, and read by the people who build Forma.
Request
| sentiment | — One of |
|---|---|
| message | — min length 1 · max length 2000 |
| oracle | An oracle name from GET /v1/oracles. |
| request_id | The answer this is about, if any. max length 100 |
curl -X POST https://api.formalogic.io/v1/feedback \
-H "Authorization: Bearer $FORMA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"sentiment":"negative","oracle":"chart","message":"The legend covers the last bar."}'import os
import httpx
response = httpx.post(
"https://api.formalogic.io/v1/feedback",
headers={"Authorization": f"Bearer {os.environ['FORMA_API_KEY']}"},
json={
"sentiment": "negative",
"oracle": "chart",
"message": "The legend covers the last bar.",
},
)
print(response.json())const response = await fetch('https://api.formalogic.io/v1/feedback', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.FORMA_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"sentiment": "negative",
"oracle": "chart",
"message": "The legend covers the last bar."
}),
})
console.log(await response.json())Response 201
The feedback was recorded.
| id | Quote it if you write to us about this feedback |
|---|---|
| received | Always true |
Errors
| 401KEY_MISSINGKEY_UNKNOWNKEY_REVOKEDKEY_EXPIRED | The key is missing, unknown, revoked or expired — see Authentication |
|---|---|
| 403ORG_DISABLED | The key is fine and its organisation is not active — see Authentication |
| 422VALIDATION_FAILED | The body is not a JSON object, has an unknown field, or breaks a rule above; context.parameter names it |
| 402QUOTA_EXCEEDED | This key sent 100 in the last 24 hours (context.scope is feedback). Credits are unaffected |
Every code, and what to do about it, is on Errors.
The request is generated from the API's OpenAPI document; the response and errors are held to real responses and to the Errors page.
Say what worked or what did not, in words. It is read by the people who build Forma and used to decide what to fix and build next.
curl -s https://api.formalogic.io/v1/feedback \
-H "Authorization: Bearer $FORMA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"sentiment": "negative", "oracle": "vector-graphics",
"message": "Labels on the triangle overlap the sides."}'{ "id": "fb_01K…", "received": true }| Field | |
|---|---|
sentiment |
Required. positive, negative or neutral. |
message |
Required. 1–2000 characters. |
oracle |
Optional. A name from GET /v1/oracles. |
request_id |
Optional. The answer this is about, up to 100 characters. |
The organisation and key are the ones the request authenticated with; the body cannot name others, and any other field is refused. The message is never sent back by the API.
Each key may send 100 in any 24 hours. Past that the answer is 402 with
QUOTA_EXCEEDED and context.scope of feedback. This cap is separate from
credits: your balance is unaffected, and asks keep working.