Push-rail channels only. Upserted by month, so a corrected figure replaces the earlier one instead of adding to it. The USD value is filled in at the next pull, from that run's exchange rates — this path has no FX source of its own, and the product keeps exactly one per run so every figure traces to the rates it used.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/devmargin-app/json-schema/devmargin-app-push-earned-body-schema.json",
"title": "earned — a month that already happened",
"description": "Push-rail channels only. Upserted by month, so a corrected figure\nreplaces the earlier one instead of adding to it.\n\nThe USD value is filled in at the next pull, from that run's exchange\nrates — this path has no FX source of its own, and the product keeps\nexactly one per run so every figure traces to the rates it used.\n",
"x-generated": "2026-11-05",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/_original/devmargin-app-openapi-openapi.yml#/components/schemas/PushEarnedBody",
"type": "object",
"properties": {
"channel": {
"type": "string",
"format": "uuid"
},
"earned": {
"type": "object",
"properties": {
"month": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}(-01)?$",
"description": "`YYYY-MM`. The current month is accepted and recorded as\npartial; a future month is refused.\n"
},
"amount": {
"type": "number",
"minimum": 0,
"description": "In `currency`."
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$"
},
"basis": {
"type": "string",
"enum": [
"gross",
"proceeds"
],
"description": "REQUIRED, with no default on purpose. `gross` is before any\nplatform fee; `proceeds` is what actually reached you. The same\nnumber means different things depending on which, and a\nportfolio total that mixed them would be wrong invisibly.\n"
}
},
"required": [
"month",
"amount",
"currency",
"basis"
],
"additionalProperties": false
}
},
"required": [
"channel",
"earned"
],
"additionalProperties": false
}
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.